基于蓝桥杯的单片机模块练习——独立键盘算法
C代码
#include "key.h"
unsigned char keystat[] = {1,1,1,1};
unsigned int lkey_count = 0;
bit lkey_flag = 0;
code unsigned char KeyCodemap[4] = {0x07,0x06,0x05,0x04};
void KeyAction(unsigned char KeyCode)
{
switch(KeyCode)
{
case 0x04 :按键S4的相应操作;break;
case 0x05 :按键S5的相应操作;break;
case 0x06 :按键S6的相应操作;break;
case 0x07 :按键S7的相应操作;break;
case (255 - 0x0?) :按键S?的相应长按操作;break;
}
}
void KeyScan()
{
unsigned char i;
static unsigned char backup[] = {1,1,1,1};
for(i=0; i<4; i++)
{
if(backup[i] != keystat[i])
{
lkey_count = 0;
lkey_flag = 0;
while((keystat[i] == 0)&&(lkey_flag == 0));//只有长按键触发时间还没到并且按键还在按下状态时才等待
if(backup[i] == 1)
{
if(lkey_flag == 0)
KeyAction(KeyCodemap[i]); //短按键操作
else
KeyAction(255 - KeyCodemap[i]);//长按键操作
}
backup[i] = keystat[i];
}
}
}
void Service_Timer1() interrupt 3
{
static unsigned char key_count = 0;
static unsigned char keybuffer[] = {0xff,0xff,0xff,0xff};
unsigned char i;
key_count++;
lkey_count++;
if(key_count == 2)
{
key_count = 0;
keybuffer[0] = (keybuffer[0] << 1) | P30;
keybuffer[1] = (keybuffer[1] << 1) | P31;
keybuffer[2] = (keybuffer[2] << 1) | P32;
keybuffer[3] = (keybuffer[3] << 1) | P33;
for(i=0;i<4;i++)
{
if(keybuffer[i] == 0x00)
{
keystat[i] = 0;
}
else if(keybuffer[i] == 0xff)
{
keystat[i] = 1;
}
}
}
//***********************长按键计时**********************************
if(lkey_count >= 800)
{
lkey_count = 0;
lkey_flag = 1;
}
//***********************长按键计时**********************************
}
拓展:
第九届国赛编程题的长按键引发参数快速增加的部分
void KeyAction(unsigned char KeyCode)
{
switch(KeyCode)
{
case 0x04 :按键S4的相应操作;break;
case 0x05 :按键S5的相应操作;break;
case 0x06 :按键S6的相应操作;break;
case 0x07 :按键S7的相应操作;break;
case (255 - 0x06) :
if(D_or_P == 1)//判断是否处于参数显示界面
{
while(keystat[1] == 0)//只要按键S6没有松开
{ P_U++;//参数变量就一直增加
if(P_U > 50)
P_U = 1;
Display_P();
Delay_1ms(100);
}
}
break;
}
}