外部中断

2019-07-14 19:58发布

按键通过外部中断实现,然后控制LED,请教各位大神
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
啊小鬼
1楼-- · 2019-07-15 12:00
 精彩回答 2  元偷偷看……
HARRY007
2楼-- · 2019-07-15 15:20
  1. /************************ (C) COPYRIGHT HARRY007 *******************************
  2. * 文件名  :key.c
  3. * 描述    :按键驱动底层函数
  4. * 库版本  :V2.1.0
  5. * 作者    :wujianhong  修改:HARRY007
  6. * 修改时间 :2016-09-13
  7. *******************************************************************************/


  8. /*************头文件包含***************/
  9. #include "head.h"

  10. /*************变量定义****************/
  11. u8 key_funcode = 0;//按键功能码
  12. u8 key_lock    = 0;//按键自锁标志位
  13. u8 delay_cout  = 0;//消抖计时变量


  14. /*******************************************************************************
  15. * 名称: Key_Init
  16. * 功能: KEY外设GPIO引脚初始化操作
  17. * 形参: 无
  18. * 返回: 无
  19. * 说明: 无
  20. ******************************************************************************/
  21. void Key_Init(void)
  22. {
  23.     GPIO_Init(KEY_PORT, KEY_PIN_1, GPIO_MODE_IN_PU_NO_IT);//上拉输入无中断
  24.     GPIO_Init(KEY_PORT, KEY_PIN_2, GPIO_MODE_IN_PU_NO_IT);//上拉输入无中断
  25. }

  26. /*******************************************************************************
  27. * 名称:Key_Scan
  28. * 功能: 按键检测扫描函数
  29. * 形参: 无
  30. * 返回: 无
  31. * 说明: 无
  32. ******************************************************************************/
  33. void Key_Scan(void)
  34. {//2ms
  35.   if( ( 0 != GPIO_ReadInputPin(KEY_PORT, KEY_PIN_1 ) )&&
  36.       ( 0 != GPIO_ReadInputPin(KEY_PORT, KEY_PIN_2 ) ) )  //sw0和sw1都没有按下
  37.     {
  38.         key_lock = 0;//清除按键锁
  39.         delay_cout = 0;//延时清空
  40.         return;
  41.     }
  42.    
  43.     if( (0 == GPIO_ReadInputPin(KEY_PORT, KEY_PIN_1)) && (0 == key_lock) )
  44.     {
  45.         delay_cout++;
  46.         if( delay_cout >= DELAY_CNT )//消抖30MS
  47.         {
  48.             key_funcode = SW0;
  49.             key_lock = 1;
  50.         }
  51.     }
  52.     if( (0 == GPIO_ReadInputPin(KEY_PORT, KEY_PIN_2)) && (0 == key_lock) )
  53.     {
  54.         delay_cout++;
  55.         if( delay_cout >= DELAY_CNT )//消抖30MS
  56.         {
  57.             key_funcode = SW1;
  58.             key_lock = 1;
  59.         }
  60.     }     
  61. }
  62.          
  63. /*******************************************************************************
  64. * 名称:Key_Pro
  65. * 功能: 按键处理函数
  66. * 形参: 无
  67. * 返回: 无
  68. * 说明: 无
  69. ******************************************************************************/
  70. void Key_Pro(void)
  71. {
  72.     if( key_funcode == SW0 )//按键1
  73.     {
  74.         key_funcode = NONE;
  75.         if( work_state == STATE_INIT )//待机模式下
  76.         {
  77.             SCH_Enable_Task(TASK_ONE);//使能继电器执行任务
  78.             SetLedON(1);              //工作灯点亮
  79.             Relay_Drive(1,1);         //开启继电器
  80.             work_state = STATE_RUN;   //系统工作状态切换到运行状态
  81.             return;
  82.         }
  83.         
  84.         if( work_state == STATE_RUN )//运行状态下
  85.         {
  86.             Relay_Drive(1,0);        //关闭继电器
  87.             SetLedOFF(1);            //关闭工作灯
  88.             SCH_Disable_Task(TASK_ONE);//关闭继电器执行任务
  89.             work_state = STATE_INIT;
  90.             power_flag = OFF;
  91.             return;
  92.         }
  93.         
  94.         if( work_state == STATE_TIME )//修改时间模式下
  95.         {
  96.             TASK_ONE->Period = TASK_ONE->Period + MIN_10;//每次加10min
  97.             if( TASK_ONE->Period > (MIN_10*6) )//如果大于1小时
  98.             {
  99.                 TASK_ONE->Period = MIN_10;//回到10Min最小定时值
  100.             }
  101.             
  102.             Led_Drive( (TASK_ONE->Period/MIN_10),20,30 );//闪灯次数表示定时时间
  103.             
  104.             FLASH_Unlock(FLASH_MEMTYPE_DATA);//解锁EEPROM
  105.             FLASH_ProgramByte(0x4000, TASK_ONE->Period/MIN_10);//将修改的时间存入EEPROM
  106.             FLASH_Lock(FLASH_MEMTYPE_DATA); //上锁EEPROM
  107.             
  108.             TASK_FIVE->Delay = TASK_FIVE->Period;//每按下一次按键,状态倒计时自动重装
  109.             return;
  110.         }   
  111.     }
  112.    
  113.     if( key_funcode == SW1 )//按键2
  114.     {
  115.         key_funcode = NONE;
  116.         if( work_state == STATE_INIT )//待机模式下
  117.         {
  118.             work_state = STATE_TIME;  //进入修改时间模式
  119.             SCH_Enable_Task(TASK_FIVE);//使能状态倒计时任务
  120.             SetLedON(2);              //修改灯点亮
  121.             return;
  122.         }
  123.         if( work_state == STATE_TIME )//修改时间模式下
  124.         {
  125.             work_state = STATE_INIT;  //进入待机模式
  126.             SCH_Disable_Task(TASK_FIVE);//关闭状态倒计时
  127.             SetLedOFF(2);             //灭掉修改灯
  128.             power_flag = OFF;
  129.         }
  130.     }
  131. }

  132. /************************ (C) COPYRIGHT HARRY007 *****END OF FILE**************/
复制代码
  1. /************************ (C) COPYRIGHT HARRY007 *******************************
  2. * 文件名  :key.h
  3. * 描述    :按键驱动底层函数
  4. * 库版本  :V2.1.0
  5. * 作者    :HARRY007
  6. * 修改时间 :2016-09-12
  7. *******************************************************************************/

  8. #ifndef __KEY_DRIVE_H
  9. #define __KEY_DRIVE_H

  10. /*************宏定义数值*****************/
  11. #define DELAY_CNT       25 //按键消抖值30ms
  12. #define SW0              1 //按键0的对应功能码
  13. #define SW1              2 //按键1的对应功能码
  14. #define NONE             0 //复位功能码状态


  15. /**************管脚宏定义****************/
  16. #define KEY_PORT      GPIOC
  17. #define KEY_PIN_1     GPIO_PIN_5  //按键1
  18. #define KEY_PIN_2     GPIO_PIN_6  //按键2

  19. /***********外部使用变量声明*************/
  20. extern u8 key_funcode;     //按键功能码
  21. extern u8 key_lock;        //按键自锁标志位
  22. extern u8 delay_cout;      //消抖计时变量


  23. /*******************************************************************************
  24. * 名称: KEY_Init
  25. * 功能: KEY外设GPIO引脚初始化操作
  26. * 形参: 无
  27. * 返回: 无
  28. * 说明: 无
  29. ******************************************************************************/
  30. void Key_Init(void);

  31. /*******************************************************************************
  32. * 名称:KEY_Scan
  33. * 功能: 按键检测扫描函数
  34. * 形参: 无
  35. * 返回: 无
  36. * 说明: 无
  37. ******************************************************************************/
  38. void Key_Scan(void);

  39. /*******************************************************************************
  40. * 名称:KEY_Pro
  41. * 功能: 按键处理函数
  42. * 形参: 无
  43. * 返回: 无
  44. * 说明: 无
  45. ******************************************************************************/
  46. void Key_Pro(void);


  47. #endif


  48. /************************ (C) COPYRIGHT HARRY007 *****END OF FILE**************/
复制代码
HARRY007
3楼-- · 2019-07-15 16:06
另外说明一下啊,这个楼上给你的代码虽然不是STM8的,但是其实刨除单片机外设的驱动,其余的业务代码都是一样的。
HARRY007
4楼-- · 2019-07-15 18:04
额,我说的楼上指其他网友的代码,所以楼主不要纠结于参考的代码是不是STM8的。就比如按键的代码放在51改改IO口就可以用,放在STM32也可以用,都是一样的嘛
HARRY007
5楼-- · 2019-07-15 20:52
Key_Scan 函数放在定时器中断里,定时中断2ms就行。 此代码参考论坛吴坚鸿前辈的驱动代码,代码中也有原作者的拼音,特此说明。
HARRY007
6楼-- · 2019-07-15 20:57
 精彩回答 2  元偷偷看……

一周热门 更多>