找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4197|回复: 2
收起左侧

单片机独立按键状态机源程序

[复制链接]
ID:187478 发表于 2017-11-4 11:36 | 显示全部楼层 |阅读模式
分享一个独立按键控制的状态机程序,赚点币。    有详细的注解,请看附录

单片机源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. sbit LED = P1^0;//继电器(P1.0)接口定义 P1口的其他口可以接LED,也可以接LED,反正效果一样

  5. /**************************************/
  6. /**************定时器中断**************/
  7. /**************************************/
  8. void Timer0_init()
  9. {
  10.         TMOD = 0x01;//定时器定时模式,16位定时
  11.         TH0  = 0xf8;//设定定时器初值2ms
  12.         TL0  = 0xcc;
  13.         TR0  = 1;//开启定时器
  14.         ET0  = 1;//定时器中断
  15.         EA   = 1;//总中断  
  16. }

  17. /**************************************/
  18. /*********状态机按键扫描函数***********/
  19. /*********返回值: 按键码值************/
  20. /**************************************/
  21. uchar Key_Scan(void)
  22. {
  23.         static uchar State_Cnt=0;//静态变量,用于改变状态过程
  24.         uchar Key_State = 0;//用于存储键值码
  25.         switch(State_Cnt)
  26.         {
  27.                 case 0x00:P3 = 0x0f;//先往P3(1到4独立按键)口送0000 1111
  28.                 if(P3 != 0x0f)//有无按键被按下
  29.                 {
  30.                         State_Cnt = 0x01;//改变状态
  31.                         break;                           
  32.                 }
  33.                 case 0x01:
  34.                 if(P3 != 0x0f)//经过定时器延时后,再次判断按键是否按下
  35.                 {
  36.                         State_Cnt = 0x02;//改变状态
  37.                         Key_State = P3;//把键值保存下来
  38.                         P3 = 0x0f;//恢复P3,以便下次按下重新保存键值
  39.                         break;
  40.                 }
  41.                 else
  42.                 {
  43.                         State_Cnt = 0x00;//改变状态
  44.                         break;
  45.                 }
  46.                 case 0x02:
  47.                 if(P3 == 0x0f)//判断按键释放
  48.                 {
  49.                         State_Cnt = 0x00;//改变状态
  50.                         break;
  51.                 }
  52.                 default:break;
  53.         }
  54.         return Key_State;//返回键值
  55. }

  56. /**************************************/
  57. /************按键功能函数**************/
  58. /***********参数:按键键码*************/
  59. /**************************************/
  60. void Display_Key(uchar key_value)
  61. {
  62.         switch(key_value)
  63.         {
  64.                 case 0x0e:LED = 1;break;//键值改变时,做出相应的动作(用户自定义动作)
  65.                 case 0x0d:LED = 0;break;
  66.                 case 0x0b:P1  = 0x00;break;
  67.                 case 0x07:P1  = 0xff;break;
  68.         }
  69. }

  70. void main()
  71. {
  72.         Timer0_init();
  73.         while(1);
  74. }

  75. /************定时器0中断函数**************/
  76. void Timer0() interrupt 1
  77. {
  78.         static Time_Counter = 0;//定义变量,以便计数
  79.         TH0 = 0xf8;//重新放入中断初值
  80.         TL0 = 0xcb;
  81.         Time_Counter++;//中断一次,值加1
  82.         if(Time_Counter == 5)//累计10ms的延时,以便消抖
  83.         {
  84.                 Time_Counter = 0;
  85.                 Display_Key(Key_Scan());//按键按下,键值码送入函数,以便做相应动作

  86.         …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
状态机按键程序.rar (14.62 KB, 下载次数: 86)

评分

参与人数 1黑币 +70 收起 理由
admin + 70 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:66287 发表于 2018-2-9 18:14 | 显示全部楼层
很好的状态机处理键盘例程
回复

使用道具 举报

ID:742384 发表于 2020-5-2 16:09 | 显示全部楼层
程序不错,但是有点小问题。case 0x01:       if(P3 != 0x0f) 。。。。。
这个不能说明是同一个按键产生的状态,所以有肯能会误判。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表