【分享】基于STM8L152C6的定时器消抖按键扫描程序

2019-07-19 21:14发布

最近鼓捣STM8,性价比高,好用,爱不释手,特意来给大家分享下按键扫描这个程序,欢迎拍砖指导!!!
贴代码,编译平台:IAR FOR STM8
[mw_shl_code=c,true]/* 开发板硬件连接 |-------------| | KEY0-PC1 | |-------------| */ #include "key.h" BitStatus KeySta = SET; /************************************************************************* * 名称: Key_Init * 功能: 按键外设GPIO引脚初始化操作 * 形参: 无 * 返回: 无 * 说明: 无 ************************************************************************/ void KEY_Init(void) { GPIO_Init(GPIOC, GPIO_Pin_1, GPIO_Mode_In_PU_No_IT); } /************************************************************************ * 名称: Key_Driver * 功能: 按键驱动函数,检测按键动作,调度相应动作函数,需在主循环中调用 * 形参: 无 * 返回: 无 * 说明: 无 ************************************************************************/ void Key_Driver(void) { static BitStatus backup = SET; if (KeySta != backup) //当前值与前次值不相等说明此时按键有动作 { if (backup == RESET) //如果前次值为 0,则说明当前是弹起动作 { LED_Reverse(LED1); } backup = KeySta; //更新备份为当前值,以备进行下次比较 } } /*********************************************************************** * 名称: Key_Scan * 功能: 按键扫描函数,需在定时器中断里调用 * 形参: 无 * 返回: 无 * 说明: 无 **********************************************************************/ void Key_Scan(void) { static u8 keybuf = 0xff; if (KEY0 == RESET) { keybuf = keybuf << 1; } else { keybuf = keybuf<<1 | 0x01; } if (keybuf == 0x00) { //连续 8 次扫描值都为 0,即 16ms 内都只检测到按下状态时,可认为按键已按下 KeySta = RESET; } else if (keybuf == 0xFF) { //连续 8 次扫描值都为 1,即 16ms 内都只检测到弹起状态时,可认为按键已弹起 KeySta = SET; } else {} //其它情况则说明按键状态尚未稳定,则不对 KeySta 变量值进行更新 } [/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。