📄 key.c
字号:
#include<reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uchar Data[] = {2,3,4,5}; //欲显示的数据
uchar KeyScan; //最新扫描出来的组合码
uchar KeyScanCode; //暂存待定的码值
uchar KeyFlag = 0; //按键状态指示
uchar KeyVal; //最终得到的键值
uchar code DisCode[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//-----------------------------------------------
void Delay1()
{
uchar i = 0x3f;
while(i--);
}
//+++++++++++++++++++++++++++++++++++++++=
void Display(uchar *P)
{
P0 = DisCode[*P];
P2 = 0xfe;
Delay1();
P0 = DisCode[*(P+1)];
P2 = 0xfd;
Delay1();
P0 = DisCode[*(P+2)];
P2 = 0xfb;
Delay1();
P0 = DisCode[*(P+3)];
P2 = 0xf7;
Delay1();
}
/***********************************************************************************
移位程序
************************************************************************************/
void PositionChange()
{
Data[0] = Data[1];
Data[1] = Data[2];
Data[2] = Data[3];
Data[3] = KeyVal;
}
/***********************************************************************************
按键翻译
************************************************************************************/
uchar KeyCode(uchar Key)
{
switch(Key)
{
case 0xee: //根据按键编码返回对应的键值
return 0;
break;
case 0xde:
return 1;
break;
case 0xbe:
return 2;
break;
case 0x7e:
return 3;
break;
case 0xed:
return 4;
break;
case 0xdd:
return 5;
break;
case 0xbd:
return 6;
break;
case 0x7d:
return 7;
break;
case 0xeb:
return 8;
break;
case 0xdb:
return 9;
break;
case 0xbb:
return 0x0a;
break;
case 0x7b:
return 0x0b;
break;
case 0xe7:
return 0x0c;
break;
case 0xd7:
return 0x0d;
break;
case 0xb7:
return 0x0e;
break;
case 0x77:
return 0x0f;
break;
default: break;
}
}
/***********************************************************************************
按键检测
************************************************************************************/
void KEY_Check()
{
Delay1();
P1 = 0x0f;
KeyScan=P1;
P1 = 0xf0;
KeyScan |= P1;
switch( KeyFlag )
{
case 0:
if( KeyScan != 0xff ) //可能有按键
{ //防止多键同时按下
KeyFlag=1;
KeyScanCode=KeyScan;
}
break;
case 1:
if( KeyScanCode == KeyScan ) //去抖后确为键按下
{
KeyFlag = 2;
KeyVal = KeyCode(KeyScanCode); //返回键值
PositionChange();
}
else //否则认为是干扰,重新检测
KeyFlag = 0;
break;
case 2:
if( KeyScanCode != KeyScan ) //检测松开按键
{
if( KeyScan == 0xff )
KeyFlag=3;
}
break;
//按键超过1秒认为是连续按键
//其后每0.2秒一次键,直到松开为止
//要处理组合按键(即0.1秒后确认读键,保证所有组合键到位
//还可能保持不松开全部按键的情况下,转换按其它键组合
//
case 3:
if( KeyScan == 0xff )
KeyFlag=0; //去抖后确为松开按键
else
KeyFlag=2; //是干扰
break;
}
}
//++++++++++++++++++++++++++++++++++++++++++++
main()
{
while(1)
{
Display(Data);
KEY_Check();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -