|
独立按键 通过定时器实现长按、短按功能:
程序每条语句都附带注释,易理解,方便移植。
本人亲测有效!
单片机源程序如下:- /*************************************************************************************
- 实验现象:下载程序后按下K1按键可以对led_0/led_1小灯状态取反
- 短按控制led_0;长按控制led_1
- *************************************************************************************
- */
- #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
- typedef unsigned int u16; //对数据类型进行声明定义
- typedef unsigned char u8;
- bit press_flag; //按键标志位
- u16 count; //计数器标志位
- sbit k1=P3^1; //定义P31口是k1
- sbit led_0=P2^0; //定义P20口是led_0
- sbit led_1=P2^1; //定义P20口是led_1
- void Timer0Init()
- {
- TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
- TH0=0XFC; //给定时器赋初值,定时1ms
- TL0=0X18;
- ET0=1; //打开定时器0中断允许
- EA=1; //打开总中断
- TR0=1;//打开定时器
- }
- void Timer0() interrupt 1
- {
- TH0=0XFC; //给定时器赋初值,定时1ms
- TL0=0X18;
- count++; //计数器累加
- }
- /*******************************************************************************
- * 函 数 名 : delay
- * 函数功能 : 延时函数,i=1时,大约延时10us
- *******************************************************************************/
- void delay(u16 i)
- {
- while(i--);
- }
- /*******************************************************************************
- * 函 数 名 : keypros
- * 函数功能 : 按键处理函数,判断按键K1是否按下
- *******************************************************************************/
- void keypros()
- {
- if(k1==0) //检测按键K1是否按下
- {
- delay(1000); //消除抖动 一般大约10ms
- if(k1==0) //再次判断按键是否按下
- {
- press_flag=1; //按键标志位
- TR0=1; //打开中断
- while(!k1); //按键松手检测
- TR0=0; //关闭中断
- }
- if(press_flag) //若有按键
- {
- if(count>=1500) //长按>=1.5s
- {
- led_1=~led_1; //led_1灯状态取反 ,此处可以换成别的处理事件
- }
- else //短按<1.5s
- {
- led_0=~led_0; //led_0灯状态取反 ,此处可以换成别的处理事件
- }
- count=0; //计数器清零
- press_flag=0; //按键标志位清零
- }
- }
- }
- /*******************************************************************************
- * 函 数 名 : main
- * 函数功能 : 主函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void main()
- {
- Timer0Init();//定时器初始化
- led_0=1; //led_0熄灭
- led_1=1; //led_1熄灭
- while(1) //主循环
- {
- keypros(); //按键处理函数
- }
- }
复制代码
|
评分
-
查看全部评分
|
|
|
|
|
|