📄 key_scan.c
字号:
//该函数只完成一次扫描任务,需在循环内调用
//row列,hor横
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint time)
{
uchar i,j;
for(i=time;i>0;i--)
for(j=110;j>0;j--);
}
uchar key_scan()
{
uchar temp,hor,row;
P2 = 0xf0;
temp = P2;
temp &= 0xf0;
if(temp != 0xf0)//扫描到按键动作
{
delay(5);
//开始进行列检查
P2 = 0xf0;
temp = P2;
temp &= 0xf0;
if(temp != 0xf0)//确认有按键动作
{
temp = ~temp;
temp >>= 4; //列值在temp的低四位
switch(temp)//列值转换,并保存在row中
{
case 1 : row = 1; break;
case 2 : row = 2; break;
case 4 : row = 3; break;
case 8 : row = 4; break;
default: break;
}
//列检查结束
//开始进行行检查
P2 = 0x0f;
temp = P2;
temp = ~temp;
temp &= 0x0f;//行值在temp的低四位
switch(temp)//行值转换,并保存在hor中
{
case 1 : hor = 1; break;
case 2 : hor = 2; break;
case 4 : hor = 3; break;
case 8 : hor = 4; break;
default: break;
}
//行检查结束
//检查按键动作是否结束,否则程序在此等待
P2 = 0xf0;
temp = P2;
temp &= 0xf0;
while(temp != 0xf0)
{
P2 = 0xf0;
temp = P2;
temp &= 0xf0;
}
//按键动作结束,程序往下进行
//计算键值并返回
return ((hor-1)*4 + row);
}
}
//没有按键动作,返回0;
return 0;
}
/*
//测试开始
void display(uchar seat_data,seg_data) //seat_data位值,seg_data管值
{
P0 = (seat_data<<4)|seg_data;
}
void main()
{
uchar key,shi,ge;
P2 = 0xff;
while(1)
{
key = key_scan();
if(key != 0)
{
shi = key/10;
ge = key%10;
}
display(6,shi);
display(7,ge);
}
}
//测试结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -