找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2275|回复: 3
收起左侧

单片机独立按键状态机源码

[复制链接]
ID:332880 发表于 2018-5-18 12:32 | 显示全部楼层 |阅读模式
蓝桥杯独立按键状态机单片机源程序如下:
  1. /*
  2.           例程:按键实验例程
  3.                 作者:电子设计工坊
  4. */
  5. #include "reg52.h"

  6. /*独立按键状态机*/

  7. //#define key_input P3
  8. //#define key_state_0  0  //判断是否按下
  9. //#define key_state_1  1 //判断是否为抖动
  10. //#define key_state_2  2 //判断是否弹起
  11. //   
  12. //char read_key(void)
  13. //{
  14. // static char key_state = 0;
  15. // char key_press, key_return = 0;
  16. // key_press = key_input&key_mask;
  17. // switch (key_state)
  18. //{        
  19. //   case key_state_0:     
  20. //   if (key_press!=key_mask) key_state = key_state_1;
  21. //   break;
  22. //         
  23. //   case key_state_1:   
  24. //   if (key_press==(key_input&key_mask))
  25. //   {
  26. //           if(key_press==0x0e) key_return = 1;  //S7
  27. //                 if(key_press==0x0d) key_return = 2;  //S6
  28. //                 if(key_press==0x0b) key_return = 3;  //S5
  29. //                 if(key_press==0x07) key_return = 4;  //S4
  30. //           key_state = key_state_2;  
  31. //   }
  32. //   else
  33. //            key_state = key_state_0;  
  34. //   break;  
  35. //   case key_state_2:
  36. //   if (key_press==0x0f) key_state = key_state_0;
  37. //   break;
  38. //}
  39. //return key_return;
  40. //}

  41. void Delay10ms()                //@11.0592MHz
  42. {
  43.         unsigned char i, j;

  44.         i = 18;
  45.         j = 235;
  46.         do
  47.         {
  48.                 while (--j);
  49.         } while (--i);
  50. }

  51. /*独立按键三行*/
  52. unsigned char Trg;
  53. unsigned char Cont;
  54. #define KEYPORT P3
  55. void Key_Read( void )
  56. {
  57.     unsigned char ReadData = KEYPORT^0xff;
  58.     Trg = ReadData & (ReadData ^ Cont);      
  59.     Cont = ReadData;                                        
  60. }

  61. /*矩阵按键*/
  62. #define KEY P3
  63. #define key_state_0  0  //判断是否按下
  64. #define key_state_1  1 //判断是否为抖动
  65. #define key_state_2  2 //判断是否弹起
  66.    
  67. char read_KBD(void)
  68. {
  69. static char key_state = 0;
  70. unsigned char key_return=0, key_press;
  71. unsigned char key1,key2;
  72.         KEY=0xf0;
  73.         key1=KEY&0xf0;
  74.         KEY=0x0f;
  75.         key2=KEY&0x0f;
  76.         key_press =key1|key2;

  77. switch (key_state)
  78. {        
  79.    case key_state_0:    //
  80.    if (key_press!=0xff) key_state = key_state_1;
  81.    break;
  82.          
  83.    case key_state_1:     
  84.    if (key_press !=0xff)
  85.    {
  86.                         if(key_press==0xde) key_return = 1;  //S15  其他键值大家自行推算
  87.                         if(key_press==0xdd) key_return = 2;  //S14
  88.                         key_state = key_state_2;  
  89.    }
  90.    else
  91.                         key_state = key_state_0;  
  92.    break;  
  93.    case key_state_2:
  94.    if (key_press==0xff) key_state = key_state_0;
  95.    break;
  96. }
  97. return key_return;
  98. }

  99. sbit buzzer = P0^6;
  100. void main()
  101. {
  102.         unsigned char key_val;
  103.         while(1)
  104.         {
  105.                 //矩阵键盘的实验
  106.                 key_val=read_KBD();
  107.                 if(key_val==1)//S15
  108.                 {
  109.                         P2=0xa0;buzzer=1;P2=0x00;
  110.                 }
  111.                 if(key_val==2)//S14
  112.                 {
  113.                         P2=0xa0;buzzer=0;P2=0x00;
  114.                 }
  115.                
  116.                 //三行独立按键的实验               
  117. //                Key_Read();
  118. //                if(Trg & 0x08)//S4
  119. //                {
  120. //                        P2=0xa0;buzzer=1;P2=0x00;
  121. //                }
  122. //                if(Trg & 0x04)//S5
  123. //                {
  124. //                        P2=0xa0;buzzer=0;P2=0x00;
  125. //                }
  126.                
  127.                 //独立按键状态机的实验               
  128. //                key_val=read_key();
  129. //                if(key_val==1)//S7
  130. //                {
  131. //                        P2=0xa0;buzzer=1;P2=0x00;
  132. //                }
  133. //                if(key_val==2)//S6
  134. //                {
  135. //                        P2=0xa0;buzzer=0;P2=0x00;
  136. //                }
  137.                 Delay10ms();
  138.         }
  139. }
复制代码

所有资料51hei提供下载:
6.KEY_课后练习.rar (24.97 KB, 下载次数: 62)
回复

使用道具 举报

ID:228452 发表于 2018-5-26 04:07 | 显示全部楼层
Thanks for code listing
回复

使用道具 举报

ID:20672 发表于 2018-7-23 22:27 | 显示全部楼层
谢谢分享!!!
回复

使用道具 举报

ID:382507 发表于 2019-8-3 09:51 | 显示全部楼层
谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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