教学内容与重难点
【内容01】按键长按与短按的实现原理。
【内容02】实训项目:基于定时器的长按与短按。
——–学生实践实操,老师讲解演示。
【内容03】前后台程序设计思维模式。
【内容04】专创融合专题。
【重点】 实训项目:基于定时器的长按与短按。
【难点】 前后台程序设计思维模式。
教学单元核心内容与学习资源
长按与短按的实现原理
【基本原理】判断按键长按与短按,实际上就是测量按键按下的时间,根据这个时间参数来决定按键按下的状态。
【实现过程】:在后台程序中,扫描按键状态,按下和松开时分别标志不同的变量,对按键的按下时间进行判断,决定按键是长按还是短按。在前台程序中,进行0.1的的不间断定时,当发现有按键按下,开始计算按键按下的时间,按键松开,结束该时间的计算。
实训案例:基于定时器的长按与短按
新建工程,编写代码,在XMF09B/XMF09C开发套件上,完成以下任务:
1-选择内部16MHz时钟的128分频作为计数器1的计数信号。
2-以模模式启动定时器1,进行0.1秒的间隔定时。
3-当SW2按键长按松开后,切换D4灯的开关状态,当SW2按键短按松开后,切换D6灯的开关状态。
注:按键按下时间大于0.5秒,定义为长按,反之为短按。

#define D4 P1_1
#define D6 P1_4
#define SW2 P0_1
unsigned int count = 0;
unsigned char F_key = 0;
/*=====================定时器1初始化函数=======================*/
void Init_Timer1()
{
//1-设置最大计数值 0x30D4,16MHz时钟下定时100ms
T1CC0L = 0xD4;
T1CC0H = 0x30;
//2-开启通道0的比较模式
T1CCTL0 |= 0x04;
//3-使能定时器相应中断控制
T1IE = 1;
EA = 1;
//4-启动定时器1
T1CTL = 0x0E; //0000 1110
}
/*====================定时器1中断服务函数======================*/
#pragma vector = T1_VECTOR
__interrupt void Service_Timer1()
{
if(F_key == 1)
{
count++; //0.1秒定时配给
}
}
/*=======================按键扫描处理函数======================*/
void Scan_Keys()
{
if(SW2 == 0)
{
Delay(200); //去抖动处理
if(SW2 == 0) //确认按键按下
{
count = 0;
F_key = 1; //启动0.1秒定时累计
while(SW2 == 0); //等待按键松开
F_key = 0; //停止0.1秒定时累计
if(count > 5) //如果按键按下时间 > 0.5秒,长按
{
D4 = ~D4; //切换D4灯的开关状态
}
else //否则为短按
{
D6 = ~D6; //切换D6灯的开关状态
}
}
}
}
/*==========================主函数============================*/
void main()
{
Init_Port(); //端口初始化
Init_Timer1(); //定时器1初始化
while(1)
{
Scan_Keys(); //循环扫描按键
}
}
前后台的程序设计思维模式
【前台系统】:一般指中断级程序,即中断服务函数。
【后台系统】:一般指任务级程序,即死循环中的主函数。
【实现逻辑】:中断服务函数中的逻辑处理受到主函数运行的制约,主函数中的某些功能又取决于中断服务函数中的变量,两者相互关联,相互制约,协同运行。
课后拓展
新建工程,编写代码,在XMF09B/XMF09C开发套件上,完成以下任务:
【1】程序开始运行时,4个LED灯闪烁2下后熄灭此时SW1按键和SW2按键均处于锁定状态,即单击这两个按键均不能控制任何LED灯的开关状态。
【2】D5为开关指示灯,D3和D4为照明灯。
【2】在按键锁定的状态下,长按SW1按键松开后,D5灯点亮,SW1按键和 SW2按键 处于解锁状态。
【3】在按键解锁状态下,单击SW1按键,可切换D3的开关状态;单击SW2按键,可切换D4的开关状态。
【4】在按键解锁的状态下,长按SW1按键松开后,关闭灯光系统,D5指示灯熄灭,D3和D4不管处于什么状态均熄灭,SW1按键和SW2按键重新回到锁定状态。
