教学内容与重难点
【内容01】掌握按键的工作原理与去抖动处理。
【内容02】掌握端口输入配置寄存器PxINP的定义与正确应用。
【内容03】按键扫描处理函数的设计。
【内容04】完成实训项目:单按键控制灯光开关。
——–学生实践实操,老师讲解演示。
【内容05】专创融合专题。
【重点】实训项目:单按键控制灯光开关。
【难点】端口输入配置寄存器PxINP的正确设置。
教学单元核心内容与学习资源
按键的工作原理与去抖动处理
【电路连接】按键的两个引脚,一端通过电阻上拉到高电平,另一端接地。
【信号特征】没有按键按下的时候,输入引脚为高电平;当有按键按下的时候,输入引脚为低电平。
【扫描原理】通过反复读取按键输入引脚的信号,然后识别高低电平来判断是否有按键触发。
【为什么要去抖动?】按键的输入引脚有低电平产生,不代表一定是有按键按下,也许是干扰信号,因此,需要通过去抖动处理,将这些干扰信号过滤,从而获得真实的按键触发信号。
【如何实现去抖动?】首次检测到按键输入引脚有低电平后,稍作延时,再次读取该引脚,如还是低电平,则确认为按键触发信号;否则,判断为干扰信号,不予处理。
端口输入配置寄存器P0INP、P1INP、P2INP。
详见:【工作手册】《CC2530微控制器应用开发速查宝典》【8】【9】【10】。
实训案例:单按键控制灯光开关
新建工程,编写代码,在XMF09B/XMF09C开发套件上,完成以下任务:
1-设计端口初始化函数,配置4个LED灯,SW1和SW2相关引脚。
2-设计LED灯检测函数,同时点亮4个LED灯,延时,然后同时关闭4个LED灯,模拟对4个LED灯的功能检测。
3-设计按键扫描函数,按键SW1按下松开后,切换D4灯的开关状态;按键SW2按下松开后,切换D6灯的开关状态。
4-在主函数中,反复扫描按键SW1和SW2的触发状态。
#include "ioCC2530.h"
#define D3 P1_0
#define D4 P1_1
#define D5 P1_3
#define D6 P1_4
#define SW1 P1_2
#define SW2 P0_1
/*=======================端口初始化函数========================*/
void Init_Port()
{
//LED灯引脚初始化
P1SEL &= ~0x1B; //将P1_0、P1_1、P1_3和P1_4设为通用I/O端口
P1DIR |= 0x1B; //将P1_0、P1_1、P1_3和P1_4设为输出方向
P1 &= ~0x1B; //P1_0、P1_1、P1_2和P1_4设输出低电平
//按键SW1引脚初始化
P1SEL &= ~0x04; //将P1_2设为通用I/O端口
P1DIR &= ~0x04; //将P1_2设为输入方向
P1INP &= ~0x04; //将P1_2配置为:上拉/下拉
P2INP &= ~0x40; //将P1_2配置为:上拉
//按键SW2引脚初始化
P0SEL &= ~0x02; //将P0_1设为通用I/O端口
P0DIR &= ~0x02; //将P0_1设为输入方向
P0INP &= ~0x02; //将P0_1配置为:上拉/下拉
P2INP &= ~0x20; //将P0_1配置为:上拉
}
/*========================灯光检测函数=========================*/
void LED_Check()
{
P1 |= 0x1B; //同时点亮4个LED灯
Delay(60000); //延时
Delay(60000);
P1 &= ~0x1B; //同时熄灭4个LED灯
Delay(60000); //延时
Delay(60000);
}
/*=======================按键扫描处理函数======================*/
void Scan_Keys()
{
//按键SW1的扫描处理程序
if(SW1 == 0) //扫描是否有低电平产生
{
Delay(200); //延时,去抖动处理
if(SW1 == 0) //确认按键触发信号
{
while(SW1 == 0); //等待按键SW1松开
D4 = ~D4; //切换D4灯的开关状态
}
}
//按键SW2的扫描处理程序
if(SW2 == 0)
{
Delay(200);
if(SW2 == 0)
{
while(SW2 == 0); //等待按键SW2松开
D6 = ~D6; //切换D6灯的开关状态
}
}
}
/*==========================主函数============================*/
void main()
{
Init_Port(); //端口初始化
LED_Check(); //灯光检测
while(1)
{
Scan_Keys(); //循环扫描处理程序
}
}