本帖最后由 ohy3686 于 2018-9-30 21:11 编辑
【CC2530强化实训01】普通延时函数实现按键的长按与短按
【题目要求】
用一个按键实现长按与短按的功能已经是很多嵌入式产品的常用手法。使用定时器的间隔定时来进行按键按下的时间是通用的做法,然而对于不太熟悉定时器使用,又没有严格的延时长度的情况下,使用普通的延时函数实现长短按键的区分也是一个不错的选择。按键SW1短按的时候,切换D3灯的开关状态;按键SW1长按的时候,切换D4灯的开关状态。其中:
按键SW1--------P1_2
D3灯-------------P1_0(高电平点亮)
D4灯-------------P1_1(高电平点亮)
【实现思路】
<1> 定义一个普通的延时函数Delay()和一个计算时间的变量count。
<2> 在按键扫描函数中,当SW1按下的时候,不断调用延时函数Delay()并对调用的次数进行累计保存在count中。
<3> 当SW1松开的时候,停止调用延时函数Delay(),对count变量进行判断,大于某个阈值属于长按,否则是短按。
【实现代码】
- #include "ioCC2530.h"
- #define D3 P1_0
- #define D4 P1_1
- #define K1 P1_2
- #define TT 20
- unsigned int count = 0;
- void Delay(unsigned int t)
- {
- while(t--);
- }
- void Init_Port()
- {
- P1SEL &= ~0x03; //将P1_0和P1_1设置为通用I/O端口
- P1DIR |= 0x03; //将P1_0和P1_1设置为输出模式
- P1SEL &= ~0x04; //将P1_2设置为通用I/O端口
- P1DIR &= ~0x04; //将P1_2设置为输入模式
- }
- void Scan_Keys()
- {
- if(K1 == 0)
- {
- Delay(100); //按键去抖动处理
- if(K1 == 0) //确认有按键按下
- {
- count = 0; //延时技术变量清0
- while(K1 == 0) //按键按下状态
- {
- Delay(10000);
- count++; //计算按键按下的时间
- }
- if(count < TT) //短按
- {
- D3 = ~D3;
- }
- else //长按
- {
- D4 = ~D4;
- }
- }
- }
- }
- void main()
- {
- Init_Port(); //初始化端口
- D3 = 1;
- D4 = 1;
- Delay(50000);
- D3 = 0;
- D4 = 0;
- while(1)
- {
- Scan_Keys(); //扫描按键
- }
- }
【广东职业技术学院 欧浩源 <小蜜蜂老师>】
|