📄 scan_key.c
字号:
#include "ht48e50.h"
#define KEY1 0x01
#define KEY1_RELEASE 0x81
#define KEY2 0x02
#define KEY2_RELEASE 0x82
#define KEY3 0x03
#define KEY3_RELEASE 0x83
#define KEY4 0x04
#define KEY4_RELEASE 0x84
#define KEY5 0x05
#define KEY5_RELEASE 0x85
#define KEY6 0x06
#define KEY6_RELEASE 0x86
#define KEY7 0x07
#define KEY7_RELEASE 0x87
#define KEY8 0x08
#define KEY8_RELEASE 0x88
#define KEY9 0x09
#define KEY9_RELEASE 0x89
#define KEY10 0x0a
#define KEY10_RELEASE 0x8a
#define KEY11 0x0b
#define KEY11_RELEASE 0x8b
#define KEY12 0x0c
#define KEY12_RELEASE 0x8c
#define KEY13 0x0d
#define KEY13_RELEASE 0x8d
#define KEY14 0x0e
#define KEY14_RELEASE 0x8e
#define KEY15 0x0f
#define KEY15_RELEASE 0x8f
#define KEY16 0x10
#define KEY16_RELEASE 0x90
#define com0 _pc0
#define com1 _pc1
//===============================================
// 变量定义
//===============================================
#pragma rambank0
unsigned char NewKey;
unsigned char OldKey;
unsigned char LastKey;
unsigned char Debounce;
unsigned char DispBuff[4];
unsigned char PlaceNo;
//===============================================
// 子函数声明
//===============================================
void SysInit(void);
void HexToBCD(unsigned char *hex_data);
void Disp7LED(void);
void ProcessKey(void);
bit ScanKey(void);
//===============================================
void main(void)
{
SysInit();
while(1)
{
if(ScanKey())
ProcessKey();
Disp7LED();
}
}
//===============================================
// 系统初始化
//===============================================
void SysInit(void)
{
_intc=0x00;
_pac=0x00;
_pbc=0xff;
_pcc=0xC3;
for(_mp0=0x40;_mp0>0x00;_mp0++)
_iar0=0x00;
DispBuff[0]=DispBuff[1]=DispBuff[2]=DispBuff[3]='8';
}
//====================================================
// 刷新七段碼显示
// 1.四位七段碼显示缓存区 DispBuff[4]
// 2.目前刷新的位码 PlaceNo
//====================================================
void Disp7LED(void)
{
// "0123456789 "
unsigned char const Seg7Code[11]={~0x3f,~0x06,~0x5b,~0x4f,~0x66,
~0x6d,~0x7d,~0x07,~0x7f,~0x6f,
~0x00};
unsigned char temp;
unsigned char count;
temp=0x04;
count=DispBuff[PlaceNo];
if((count>=0x30)&&(count<=0x39))
count-=0x30;
else
count=10;
_pc=0x00; // 消隐上一其他位上的段碼显示
_pa=Seg7Code[count]; // 输出数码管的段碼值
count=PlaceNo;
while(count)
{
_rl(&temp);
count--;
}
_pc=temp;
PlaceNo++;
if(PlaceNo>3)
PlaceNo=0x00;
}
//====================================================
// 将十六进制数转换为BCD码
// 该十六进制数必须小于100
//====================================================
void HexToBCD(unsigned char *hex_data)
{
unsigned char bcd_data;
for(bcd_data=0;*hex_data>9;bcd_data++)
*hex_data-=10;
_swap(&bcd_data);
bcd_data|=*hex_data;
*hex_data=bcd_data;
}
//====================================================
// 0: 表示没有键按下或松开
// 1: 表示有键按下或松开(NewKey为要执行的按键码)
//====================================================
bit ScanKey(void)
{
unsigned char i;
unsigned char Temp;
_pbc=0xf0; // 设置Pa0_Pa3 为输出,Pa4_Pa7 为输入端口
_pb=0xff; // Pa0_Pa3 输出为高
Temp=0xfe; // 行扫描信息
for(i=0;i<4;i++) // 按键行扫描
{
_pb=Temp; // 写行扫描信息
_nop();
_nop();
if((~_pb)&0x10){NewKey=1;break;} // 扫描第一列
if((~_pb)&0x20){NewKey=2;break;} // 扫描第二列
if((~_pb)&0x40){NewKey=3;break;} // 扫描第三列
if((~_pb)&0x80){NewKey=4;break;} // 扫描第四列
_rl(&Temp); // 准备扫描下一行扫描信息
}
if(i>3)
NewKey=0; // 如果没有键按下,则NewKey=0
else
NewKey +=i*4; // 计算按键的键值
if(NewKey==OldKey) // 比较上次扫描到的键值和此次扫描到的键值是否相同
{
if(!Debounce) // 判断去抖是否完成
{
if(NewKey==LastKey) // 判断扫描到的按键是否与执行过的按键相同
return 0; // 相同,则表示没有键按下
else
{
if(NewKey==0) // 如果不相同,则判断是否是按键松开
{
NewKey=LastKey+0x80;// 修改扫描到的按键的键值
LastKey=OldKey;
return 1;
}
else // 不是按键松开,则是新的按键被按下
{
LastKey=OldKey; // 此次要执行的按键值
return 1;
}
}
}
else // 如果去抖动没有完成,则继续去抖动
{
Debounce--;
return 0;
}
}
else // 如果与上次扫描的结果不同,则保存此次扫描到的键值
{
OldKey=NewKey;
Debounce=5;
return 0;
}
}
//====================================================
// 按键处理
//====================================================
void ProcessKey(void)
{
if(NewKey&0x80) // 按键松开
{
NewKey&=0x7f; // 去掉最高位
HexToBCD(&NewKey);
DispBuff[0]=' ';
DispBuff[1]=' ';
DispBuff[2]=(((NewKey&0xf0)>>4)+0x30); // 转换为ASCII码
DispBuff[3]=((NewKey&0x0f)+0x30);
}
else // 按键按下
{
HexToBCD(&NewKey);
DispBuff[0]=(((NewKey&0xf0)>>4)+0x30);
DispBuff[1]=((NewKey&0x0f)+0x30);
DispBuff[2]=' ';
DispBuff[3]=' ';
}
/*
switch(NewKey)
{
case KEY1:
_nop();
case KEY1_RELEASE:
_nop();
case KEY2:
_nop();
case KEY2_RELEASE:
_nop();
case KEY3:
_nop();
case KEY3_RELEASE:
_nop();
case KEY4:
_nop();
case KEY4_RELEASE:
_nop();
case KEY5:
_nop();
case KEY5_RELEASE:
_nop();
case KEY6:
_nop();
case KEY6_RELEASE:
_nop();
case KEY7:
_nop();
case KEY7_RELEASE:
_nop();
case KEY8:
_nop();
case KEY8_RELEASE:
_nop();
case KEY9:
_nop();
case KEY9_RELEASE:
_nop();
case KEY10:
_nop();
case KEY10_RELEASE:
_nop();
case KEY11:
_nop();
case KEY11_RELEASE:
_nop();
case KEY12:
_nop();
case KEY12_RELEASE:
_nop();
case KEY13:
_nop();
case KEY13_RELEASE:
_nop();
case KEY14:
_nop();
case KEY14_RELEASE:
_nop();
case KEY15:
_nop();
case KEY15_RELEASE:
_nop();
case KEY16:
_nop();
case KEY16_RELEASE:
_nop();
default:break;
}
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -