最近鼓捣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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>