📄 keydisp.c
字号:
/*键码值-----------------------------------------
p0.0 0x11 0x21 0x41 0x81
p0.1 0x12 0x22 0x42 0x82
p0.2 0x14 0x24 0x44 0x84
p0.3 0x18 0x28 0x48 0x88
p0.4 p0.5 p0.6 p0.7
-------------------------------------------*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code byteled[]={0x70,0x60,0x50,0x40,0x30,0x20,0x10,0x00};
uchar Dis_buffer[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
void delays (void);
uchar kbscan(void);
void do_key(void);
void disp(void);
uchar key;
void main(void)
{
while(1)
{
disp();
key=kbscan();//键扫描函数
do_key();
delays(); //消抖
}
}
//键扫描函数
uchar kbscan(void)
{
uchar sccode,recode;
P2=0xf0; //设初值以便高4位在有键按下时。就被拉低
if((P2&0xf0)!=0xf0) //判断有没有按键
{
// DelayMs(10); //有按键时消除抖动
if((P2&0xf0)!=0xf0) //再判断有没有按键
{
sccode=0xfe; //从p0.0开始扫描行值
while((sccode&0x10)!=0) //扫描到第四个,即p0.3
{
P2=sccode; //记录当前扫描行有没有按键
if((P2&0xf0)!=0xf0) //判断当前行有没有按键
{
recode=(P2&0xf0)|0x0f; //记录当前p0口列的值‘0’为有效
do{P2=0xf0;}while((P2&0xf0)!=0xf0);
// DelayMs(10); //放开按键时消除抖动
return((~sccode)+(~recode)); //返回行值和列值。取反则‘1’为有效
}
else
sccode=(sccode<<1)|0x01; //没有,则扫描下一行
}
}
}
return(0);
}
void do_key(void)
{
uchar i,key_value;
//处理数字键
switch(key)
{
case 0x11:
key_value=0x00;
break;
case 0x21:
key_value=0x01;
break;
case 0x41:
key_value=0x02;
break;
case 0x81:
key_value=0x03;
break;
case 0x12:
key_value=0x04;
break;
case 0x22:
key_value=0x05;
break;
case 0x42:
key_value=0x06;
break;
case 0x82:
key_value=0x07;
break;
case 0x14:
key_value=0x08;
break;
case 0x24:
key_value=0x09;
break;
case 0x44:
key_value=0x0a;
break;
case 0x84:
key_value=0x0b;
break;
case 0x18:
key_value=0x0c;
break;
case 0x28:
key_value=0x0d;
break;
case 0x48:
key_value=0x0e;
break;
case 0x88:
key_value=0x0f;
break;
default :key_value=0xff; break;
}
if(key_value==0xff)
return;
if(key_value>=0&&key_value<=9)
{
for(i=7;i>0;i--)
Dis_buffer[i]=Dis_buffer[i-1];
Dis_buffer[0]=key_value;
}
}
//动态显示
void disp(void)
{
uchar k;
for(k=0;k<8;k++)
{
P0=Dis_buffer[k]|byteled[k];
delays();
}
}
//延时
void delays(void)
{
uint i;
for (i=0;i<560;i++);
}
if(key==0x84)
time_set();
else if(key==0x18)
alarm_set();
else if(key==0x28)
alarm_led=0;
else if(key==0x48)
{
alarm_led=1;
alarm_buzzer=1;
}
do{P2=0xf0;}while((P2&0xf0)!=0xf0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -