📄 key_disp.c
字号:
#include <REGX51.H>
char TAB[18]={0xc0};
char disp[4]={0x7f,0x7f,0x7f,0x7f};
char dig=0;
void delay(void);
void scanner(void);
#define rowkey()(~P1)&0x0f; //读入P1低四位(列按键值)宏
/*******************************************/
main()
{
while(1)
scanner();
}
/*********************************************/
void delay(void)
{
int i;
for(i=0;i<4800;i++);
}
/***********************************************/
void scanner(void)
{
char col,row;//col行,row列)
char scan,key,kcode;//扫描信号,扫描值,扫描码
scan=0xef; //=1110 1111
for(col=0;col<4;col++) //扫描第COL行
{
P2=0xff;
P1=scan; //P1高4位输出扫描信号,低4位设为输入
P2=disp[col]; //输出第COL行数字
keyin=rowkey(); //读入P1低四位(第COL行的列按键值)
if(keyin!=0) //若有按键时
{
for(row=0;row<4;row++) //扫描第ROW列是否按下
{
if(keyin==(0x01<<row)) //只有第ROW列按下
{
kcode=row+4*col; //计算出按键码为
disp[dig]=TAB[kcode]; //扫描码写入7段LED数码管数组
dig=(dig<3)?dig+1:0; //末满时显左1位,满时至最右显示
break; //离开第ROW列扫描(FOR循环)
}
if(row==4) //输入错误时
{
disp[dig]=TAB[16]; //负号(-)写入
dig=(dig<3)?dig+1:0; //未满显示左1位,滿时显示最右位
} //if语句(输入错误)结束
} //for循环,扫描row列结束
while(rowkey()!=0); //等按键放开
delay();
} //if 语句(有按键时)结束
scan=(scan<<1)|0x01; //产生左移1位扫描信号
} //for循环,扫描col行结束
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -