分享一个独立按键控制的状态机程序,赚点币。 有详细的注解,请看附录
单片机源程序如下:
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit LED = P1^0;//继电器(P1.0)接口定义 P1口的其他口可以接LED,也可以接LED,反正效果一样
- /**************************************/
- /**************定时器中断**************/
- /**************************************/
- void Timer0_init()
- {
- TMOD = 0x01;//定时器定时模式,16位定时
- TH0 = 0xf8;//设定定时器初值2ms
- TL0 = 0xcc;
- TR0 = 1;//开启定时器
- ET0 = 1;//定时器中断
- EA = 1;//总中断
- }
- /**************************************/
- /*********状态机按键扫描函数***********/
- /*********返回值: 按键码值************/
- /**************************************/
- uchar Key_Scan(void)
- {
- static uchar State_Cnt=0;//静态变量,用于改变状态过程
- uchar Key_State = 0;//用于存储键值码
- switch(State_Cnt)
- {
- case 0x00:P3 = 0x0f;//先往P3(1到4独立按键)口送0000 1111
- if(P3 != 0x0f)//有无按键被按下
- {
- State_Cnt = 0x01;//改变状态
- break;
- }
- case 0x01:
- if(P3 != 0x0f)//经过定时器延时后,再次判断按键是否按下
- {
- State_Cnt = 0x02;//改变状态
- Key_State = P3;//把键值保存下来
- P3 = 0x0f;//恢复P3,以便下次按下重新保存键值
- break;
- }
- else
- {
- State_Cnt = 0x00;//改变状态
- break;
- }
- case 0x02:
- if(P3 == 0x0f)//判断按键释放
- {
- State_Cnt = 0x00;//改变状态
- break;
- }
- default:break;
- }
- return Key_State;//返回键值
- }
- /**************************************/
- /************按键功能函数**************/
- /***********参数:按键键码*************/
- /**************************************/
- void Display_Key(uchar key_value)
- {
- switch(key_value)
- {
- case 0x0e:LED = 1;break;//键值改变时,做出相应的动作(用户自定义动作)
- case 0x0d:LED = 0;break;
- case 0x0b:P1 = 0x00;break;
- case 0x07:P1 = 0xff;break;
- }
- }
- void main()
- {
- Timer0_init();
- while(1);
- }
- /************定时器0中断函数**************/
- void Timer0() interrupt 1
- {
- static Time_Counter = 0;//定义变量,以便计数
- TH0 = 0xf8;//重新放入中断初值
- TL0 = 0xcb;
- Time_Counter++;//中断一次,值加1
- if(Time_Counter == 5)//累计10ms的延时,以便消抖
- {
- Time_Counter = 0;
- Display_Key(Key_Scan());//按键按下,键值码送入函数,以便做相应动作
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
状态机按键程序.rar
(14.62 KB, 下载次数: 86)
|