[新手园地] 傻瓜菜鸟第5帖——按键小程序

[复制链接]
 楼主| 发表于 2011-4-25 15:32 | 显示全部楼层 |阅读模式
本帖最后由 weshiluwei6 于 2011-4-25 15:33 编辑

本人是新手,只能发些比较简单的程序。高手勿拍。
此程序实现:按KEY,一次一个灯亮。2次2个等亮。3次3个灯亮。4次4个灯亮。5次一个灯,周而复始
以前玩过 51, 经常写按键程序只加个去抖延时或者有时候不加都无所谓,松手检测更是没加过;
今天编了M0的按键,开始什么都没加,可是程序问题很大,后来加了消抖,稍微好点,但是还是不稳定,最后加了松手检测才算成功。
请问:这个按键和单片机有关么?感觉差距挺大的。



  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/
  6. #include <stdio.h>
  7. #include "NUC1xx.h"
  8. #include "Driver\DrvGPIO.h"
  9. #include "Driver\DrvSYS.h"
  10. uint32_t signal;
  11. void delay_loop(void)
  12. {
  13. uint32_t i,j;
  14. for(i=500;i>0;i--)
  15.     for(j=110;j>0;j--);
  16.    
  17. }

  18. /***************************************************************************:**************
  19. ** 文件名称:NUC120_HOT_UART.c
  20. ** 文件说明:NUC120助学板按键小程序
  21. ** 创建日期:2011-04-025
  22. ** 修改日期:
  23. ** 现     象:按KEY,一次一个灯亮。2次2个等亮。3次3个灯亮。4次4个灯亮。
  24.               5次一个灯,周而复始
  25.               (新手练习入门程序)
  26. ** 备    注:
  27. ***********************************************************:****::************************/
  28. int main (void)
  29. {
  30. /* SYSCLK =>12Mhz*/
  31. UNLOCKREG();
  32.     SYSCLK->WRCON.XTL12M_EN = 1;
  33. LOCKREG();
  34. /*set GPI0 output*/
  35. DrvGPIO_Open(E_GPA,2, E_IO_OUTPUT);
  36. DrvGPIO_Open(E_GPA,3, E_IO_OUTPUT);
  37. DrvGPIO_Open(E_GPA,4, E_IO_OUTPUT);
  38. DrvGPIO_Open(E_GPA,5, E_IO_OUTPUT);
  39.    
  40. DrvGPIO_Open(E_GPB,15,E_IO_INPUT);            //按键设置为输入
  41. while(1)
  42. {
  43.      if((DrvGPIO_GetBit(E_GPB,15) == 0)  && (signal == 0))
  44.   {
  45.    delay_loop();
  46.    if((DrvGPIO_GetBit(E_GPB,15) == 0)  && (signal == 0))
  47.    {
  48.     DrvGPIO_ClrBit(E_GPA,2);
  49.     DrvGPIO_SetBit(E_GPA,3);
  50.     DrvGPIO_SetBit(E_GPA,4);
  51.     DrvGPIO_SetBit(E_GPA,5);
  52.     signal  =  1;
  53.    }
  54.    while(DrvGPIO_GetBit(E_GPB,15) == 0);
  55.      }
  56.    if( (DrvGPIO_GetBit(E_GPB,15) == 0)  && (signal == 1))
  57.   {
  58.     delay_loop();
  59.     if( (DrvGPIO_GetBit(E_GPB,15) == 0)  && (signal == 1))
  60.     {  DrvGPIO_ClrBit(E_GPA,2);
  61.     DrvGPIO_ClrBit(E_GPA,3);
  62.     DrvGPIO_SetBit(E_GPA,4);
  63.     DrvGPIO_SetBit(E_GPA,5);
  64.     signal  =  2;
  65.     }
  66.     while(DrvGPIO_GetBit(E_GPB,15) == 0);
  67.   }
  68.    if( (DrvGPIO_GetBit(E_GPB,15) == 0)  && (signal == 2))
  69.   {
  70.     delay_loop();
  71.     if( (DrvGPIO_GetBit(E_GPB,15) == 0)  && (signal == 2))
  72.     {
  73.        DrvGPIO_ClrBit(E_GPA,2);
  74.     DrvGPIO_ClrBit(E_GPA,3);
  75.     DrvGPIO_ClrBit(E_GPA,4);
  76.     DrvGPIO_SetBit(E_GPA,5);
  77.     signal =  3;
  78.     }
  79.     while(DrvGPIO_GetBit(E_GPB,15) == 0);
  80.   }
  81.    if( (DrvGPIO_GetBit(E_GPB,15) == 0)  && (signal == 3))
  82.   {
  83.     delay_loop();
  84.     if( (DrvGPIO_GetBit(E_GPB,15) == 0)  && (signal == 3))
  85.     {
  86.     DrvGPIO_ClrBit(E_GPA,2);
  87.        DrvGPIO_ClrBit(E_GPA,3);
  88.     DrvGPIO_ClrBit(E_GPA,4);
  89.     DrvGPIO_ClrBit(E_GPA,5);
  90.     signal =  0;
  91.      }
  92.     while(DrvGPIO_GetBit(E_GPB,15) == 0);
  93.   }
  94. }
  95. }


本帖子中包含更多资源

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

×
发表于 2011-4-25 17:30 | 显示全部楼层
好,继续努力!
 楼主| 发表于 2011-4-25 20:49 | 显示全部楼层
2# hotpower

大叔  MCU旁边的那些孔 可以接排阵 接外接电路的吧   请问下 是按照什么顺序排列的呢
发表于 2011-4-25 23:37 | 显示全部楼层
本帖最后由 dong_abc 于 2011-4-25 23:41 编辑

我也来一个
  1. key.c
  2. #include "key.h"
  3. #define key_input   DrvGPIO_GetBit(E_GPB, 14)    // 按键输入口
  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. DrvGPIO_Open(E_GPB, 14, E_IO_INPUT);
  11. }
  12. char Key_Scan(void)  
  13. {
  14. static unsigned char key_state = 0, key_time = 0;
  15. unsigned char key_press, key_return = 0;
  16. key_press = key_input;                    // 读按键I/O电平
  17. switch (key_state)
  18. {
  19.   case key_state_0:                        // 按键初始态
  20.    if (!key_press) key_state = key_state_1; // 键被按下,状态转换到键确认态
  21.    break;
  22.   case key_state_1:                        // 按键确认态
  23.    if (!key_press)
  24.       {
  25.        key_state = key_state_2;               // 按键仍按下,状态转换到计时1
  26.         key_time = 0;                        // 清另按键时间计数器
  27.       }
  28.    else
  29.      key_state = key_state_0;               // 按键已抬起,转换到按键初始态
  30.    break;
  31.   case key_state_2:
  32.    if (key_press)
  33.       {
  34.         key_state = key_state_0;               // 按键已释放,转换到按键初始态
  35.         key_return = 1;                       // 输出"1"
  36.    }
  37.    else if (++key_time >= 50)              // 按键时间计数
  38.    {
  39.     key_state = key_state_3;               // 按下时间>1s,状态转换到计时2
  40.     key_time = 0;                        // 清按键计数器
  41.     key_return = 2;                       // 输出"2"
  42.    }
  43.    break;
  44.   case key_state_3:
  45.    if (key_press)
  46.        key_state = key_state_0;              // 按键已释放,转换到按键初始态
  47.    else
  48.    {
  49.     if (++key_time >= 25)                  // 按键时间计数
  50.     {
  51.      key_time = 0;                       // 按下时间>0.5s,清按键计数器
  52.      key_return = 2;                      // 输出"2"
  53.     }
  54.    }
  55.    break;
  56. }
  57.     return key_return;
  58. }
  59. /*-----------------------------------------------
  60. 按键处理,调试用
  61. ------------------------------------------------*/
  62. void Key_Proc(void)
  63. {
  64.   switch (Key_Scan())
  65.   {
  66.    case 1:
  67.     outpw((uint32_t)&GPIOA->DOUT, inpw((uint32_t)&GPIOA->IN) ^ (1 << 2));
  68.     break;

  69.    case 2:
  70.       outpw((uint32_t)&GPIOA->DOUT, inpw((uint32_t)&GPIOA->IN) ^ (1 << 3));
  71.     break;

  72.    default:
  73.     break;
  74.   }
  75. }


  76. key.h
  77. #include "main.h"
  78. #ifndef __NUC1xxKey_H__
  79. #define __NUC1xxKey_H__
  80. void Key_Init(void);
  81. char Key_Scan(void);
  82. void Key_Proc(void);
  83. #endif //__NUC1xxKey_H__
发表于 2011-4-25 23:55 | 显示全部楼层
2# hotpower  

大叔  MCU旁边的那些孔 可以接排阵 接外接电路的吧   请问下 是按照什么顺序排列的呢
weshiluwei6 发表于 2011-4-25 20:49

看一下走线就是啦~~~
发表于 2011-4-26 08:50 | 显示全部楼层
顶下,好久没好好学习了...
发表于 2011-4-26 17:06 | 显示全部楼层
看电路图
 楼主| 发表于 2011-4-27 19:02 | 显示全部楼层
5# dong_abc

谢谢 您编的真不错 学习了
 楼主| 发表于 2011-4-27 19:02 | 显示全部楼层
7# hotpower
OK 谢谢大叔
发表于 2011-5-8 15:29 | 显示全部楼层
请问stdio.h这个头文件能在哪里找到?我安装的KEIL里面没有,求解惑
 楼主| 发表于 2011-5-8 18:43 | 显示全部楼层
10# baisen

装了就有啊 怎么会没有呢
发表于 2011-5-23 17:49 | 显示全部楼层
mark!!
发表于 2011-7-1 16:48 | 显示全部楼层
看官方资料中,求学习~~:hug:
发表于 2011-7-9 10:43 | 显示全部楼层
不错,学习了 正在研究按键
发表于 2011-7-16 20:18 | 显示全部楼层
同楼上,嘿嘿
发表于 2011-8-4 20:11 | 显示全部楼层
:hug:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:250水王,种菜浇水,要输就输给理想,要败就败给高手。不可浮躁

7

主题

1126

帖子

1

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