STC单片机4个按键封装
//头文件代码
#ifndef _KEY_H
#define _KEY_H
#include <reg52.h>
sbit KEY1=P3^0;//
sbit KEY2=P3^1;//
sbit KEY3=P3^2;//
sbit KEY4=P3^3;//
void KeyInit();//按键初始化
void KeyDriver();//按键动作
void KeyScan();//按键扫描
#endif
//源文件代码
#include"key.h"
unsigned char keyCodeMap[4]={0x30,0x31,0x32,0x33};//标准键盘映射表
unsigned char keySta[4]={1,1,1,1};//按键当前状态
void KeyInit()
{
SetGpioMode(GPIOP3,PIN_0|PIN_1|PIN_2|PIN_3,GPIO_Mode_Out_IN);//设置GPIO模式 GPIO_Mode_Out_IN准双向 GPIO_Mode_Out_PP推挽 GPIO_Mode_AIN高阻GPIO_Mode_Out_OD开漏
IoModeInit();//IO口模式初始化
KEY1=1;//
KEY2=1;//
KEY3=1;//
KEY4=1;//
}
void KeyAction(unsigned char KeyCode)//按键动作处理
{
if(KeyCode==0x30)
{
}else if(KeyCode==0x31)
{
}else if(KeyCode==0x32)
{
}else if(KeyCode==0x33)
{
}
}
void KeyDriver()
{
unsigned char i;
static unsigned char backUp[4]={1,1,1,1};//按键值备份,保存前一次的值
for(i=0;i<4;i++)
{
if(keySta[i]!=backUp[i])
{
if(backUp[i]==0)//弹起才执行
{
KeyAction(keyCodeMap[i]);//按下点亮LED
}
}
backUp[i]=keySta[i];
}
}
void KeyScan()//按键扫描
{
unsigned char i;
static unsigned char keyBuf[4]={0xFF,0xFF,0xFF,0xFF};//按键状态缓存
keyBuf[0]=(keyBuf[0]<<1)|KEY1;
keyBuf[1]=(keyBuf[1]<<1)|KEY2;
keyBuf[2]=(keyBuf[2]<<1)|KEY3;
keyBuf[3]=(keyBuf[3]<<1)|KEY4;
for(i=0;i<4;i++)
{
if(keyBuf[i]==0x00)
{
keySta[i]=0;//按下
}else if(keyBuf[i]==0xFF)
{
keySta[i]=1;//弹起
}
}
}