教学内容与重难点
【内容01】理解时间片的程序设计思维。
【内容02】掌握按键控制时间片运行的程序设计思路。
【内容03】完成实训项目:按键控制跑马灯的运行与暂停。
——–学生实践实操,老师讲解演示。
【内容04】专创融合专题。
【重点】实训项目:按键控制跑马灯的运行与暂停 。
【难点】按键控制时间片运行的程序设计思路 。
教学单元核心内容与学习资源
实训案例:按键控制跑马灯的运行与暂停
新建工程,编写代码,在XMF09B/XMF09C开发套件上,完成以下任务:
1-设计LED灯检测函数,同时点亮4个LED灯,延时,然后同时关闭4个LED灯。灯光检测完成后,开始进入跑马灯。
2-跑马灯过程为:D4灯亮,其余熄灭,延时,D3灯亮,其余熄灭,延时,D6灯亮,其余熄灭,延时,D5灯亮,其余熄灭,延时…如此反复。
3-按下SW2松开后,跑马灯暂停保留当前状态;再次按下SW2松开后 ,从当前状态处继续运行跑马灯,当SW2按下时,不能打断跑马灯运行。
#define D3 P1_0
#define D4 P1_1
#define D5 P1_3
#define D6 P1_4
#define SW2 P0_1
unsigned char F_LED = 1;
unsigned int count = 0;
/*========================跑马灯控制函数=======================*/
void LED_Running()
{
Delay(300); //时间片间隔
if(F_LED == 1) //如果当前状态为:运行
{
count++; //时间片累计,跑马灯控制向前推进
}
if(count == 1)
{
D4 = 1;
D3 = 0;
D6 = 0;
D5 = 0;
}
else if(count == 201)
{
D4 = 0;
D3 = 1;
D6 = 0;
D5 = 0;
}
else if(count == 401)
{
D4 = 0;
D3 = 0;
D6 = 1;
D5 = 0;
}
else if(count == 601)
{
D4 = 0;
D3 = 0;
D6 = 0;
D5 = 1;
}
else if(count == 801)
{
count = 0;
}
}
/*=======================按键扫描处理函数======================*/
void Scan_Keys()
{
if(SW2 == 0)
{
Delay(200); //去抖动处理
if(SW2 == 0) //确认按键按下
{
while(SW2 == 0) //等待按键松开
{
LED_Running(); //在等待的过程中不打断跑马灯运行
}
if(F_LED == 0) //如果当前为:暂停
{
F_LED = 1; //将标志变量切换为:运行
}
else if(F_LED == 1) //如果当前为:运行
{
F_LED = 0; //将标志变量切换为:暂停
}
}
}
}
/*==========================主函数============================*/
void main()
{
Init_Port(); //端口初始化
LED_Check(); //灯光检测
while(1)
{
LED_Running(); //循环控制跑马灯
Scan_Keys(); //循环扫描按键
}
}
课后拓展
新建工程,编写代码,在XMF09B/XMF09C开发套件上,完成以下任务:
【1】选择内部16MHz时钟的128分频作为计数器1的计数信号。
【2】在定时器1的模模式中实现0.1秒的间隔定时。
【3】在中断服务函数中,实现1秒的间隔定时,并翻转D4灯的开关状态,即D4灯亮1秒,灭1秒….
【4】在中断服务函数中,实现2秒的间隔定时,并翻转D3灯的开关状态,即D3灯亮2秒,灭2秒….
【5】在中断服务函数中,实现4秒的间隔定时,并翻转D6灯的开关状态,即D6灯亮4秒,灭4秒….
【6】在中断服务函数中,实现8秒的间隔定时,并翻转D5灯的开关状态,即D5灯亮8秒,灭8秒….