[Cortex-M0技术交流] 菜鸟学习M0(2)——按键扫描

[复制链接]
 楼主| dong_abc 发表于 2011-10-23 18:57 | 显示全部楼层 |阅读模式
本帖最后由 dong_abc 于 2011-10-23 19:00 编辑

经典的状态机模式按键扫描,把书本上的一些程序改造,调试之后如下,个人感觉动手调试是最重要的。

key.c文件

  1. #include "key.h"
  2. // 按键输入口  
  3. #define key_input()   inpw((uint32_t)&GPIOB->IN)   
  4. #define key_state_0 0
  5. #define key_state_1 1
  6. #define key_state_2 2
  7. #define key_state_3 3

  8. void Key_Init(void)
  9. {
  10. GPIOB->MD.PMD14=0;
  11. GPIOB->MD.PMD15=0;
  12. }

  13. uint32_t Key_Scan(void)  
  14. {
  15. static uint32_t key_state = 0,  key_time = 0;
  16. uint32_t key_press, key_return = 0;
  17. key_press = key_input()&0xc000;                    
  18. switch (key_state)
  19. {
  20.   case key_state_0:                        
  21.    if (key_press!=0xc000)  key_state = key_state_1;
  22.    break;
  23.   case key_state_1:                             
  24.    if (key_press!=0xc000)            
  25.             {
  26.     switch (key_press)
  27.                 {
  28.              case 0x4000:  key_return=1;
  29.              break;
  30.            
  31.        case 0x8000:  key_return=2;
  32.              break;
  33.            
  34.        default:
  35.             break;
  36.              }
  37.    
  38.     //printf("key_press:0x%04x\n", key_press);
  39.     key_state = key_state_2;      
  40.                 key_time = 0;                        
  41.             }
  42.    else
  43.      key_state = key_state_0;               
  44.    break;
  45.   case key_state_2:
  46.        if (key_press==0xc000)  key_state = key_state_0;
  47.    
  48.      
  49.     else if (++key_time >= 50)            
  50.     {
  51.     //key_state = key_state_3;
  52.     //key_return = 3;            
  53.     key_time = 0;  
  54.     switch (key_press)
  55.                 {
  56.              case 0x4000:  key_return=3;
  57.              break;
  58.            
  59.        case 0x8000:  key_return=4;
  60.              break;
  61.            
  62.        default:
  63.             break;
  64.                 }                       
  65.                         
  66.     }
  67.    break;
  68.   /*   
  69.   case key_state_3:
  70.    if (key_press&(1<<14))
  71.        key_state = key_state_0;              // 按键已释放,转换到按键初始态
  72.    else
  73.    {
  74.     if (++key_time >= 25)                  // 按键时间计数
  75.     {
  76.      key_time = 0;                       // 按下时间>0.5s,清按键计数器
  77.      key_return = 2;                      // 输出"2"
  78.     }
  79.    }
  80.    break;
  81.        */
  82.   default:
  83.       break;
  84. }
  85.     return key_return;
  86. }

  87. void Key_Proc(void)
  88. {
  89.   switch (Key_Scan())
  90.   {
  91.    case 1:
  92.     outpw((uint32_t)&GPIOA->DOUT, inpw((uint32_t)&GPIOA->IN) ^ (1 << 4));
  93.     break;

  94.    case 2:
  95.         outpw((uint32_t)&GPIOA->DOUT, inpw((uint32_t)&GPIOA->IN) ^ (1 << 5));
  96.     break;

  97.    case 3:
  98.         outpw((uint32_t)&GPIOA->DOUT, inpw((uint32_t)&GPIOA->IN) ^ (1 << 4));
  99.     break;
  100.    case 4:
  101.         outpw((uint32_t)&GPIOA->DOUT, inpw((uint32_t)&GPIOA->IN) ^ (1 << 5));
  102.     break;
  103.    
  104.    default:
  105.     break;
  106.   }
  107. }
key.h文件

  1. #include "main.h"

  2. #ifndef __NUC1xxKey_H__
  3. #define __NUC1xxKey_H__

  4. extern void Key_Init(void);
  5. extern uint32_t Key_Scan(void);
  6. extern void Key_Proc(void);

  7. #endif //__NUC1xxKey_H__


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
daoyuan345610 发表于 2011-10-26 09:59 | 显示全部楼层
感谢~~学习了~~
Ryanhsiung 发表于 2011-10-27 10:44 | 显示全部楼层
忙里偷闲,支持一下!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:此id已冬眠...

43

主题

5074

帖子

22

粉丝
快速回复 在线客服 返回列表 返回顶部