27,515
社区成员
发帖
与我相关
我的任务
分享
// 键盘扫描函数,无按键返回 16,有键按下返回键值.
uchar keyscan(void)
{
// row: 行号 Column: 列号 num: 按键号
// row_data: 行状态 Column_data: 列状态
uchar row, Column, num, row_data, Column_data;
P1 = 0xf0; // 将行线(P1.0 ~ P1.3)拉低
if((P1 & 0xf0) != 0xf0) // 有键按下
{
delay(); // 消抖
}
if((P1 & 0xf0) != 0xf0) // 消抖后还是有键按下,则查找键值
{
row_data = 0xfe; // 首行扫描字送变量 row_data
row = 0; // 首行号送 row
while(1)
{
P1 = row_data; // 行扫描字送 P1 口
Column_data = P1; // 读入 P1 口的列状态
if((Column_data & 0x10) == 0)
{
Column = 0; // 第 0 列有键按下,第 0 列首号送 Column
break;
}
else if((Column_data & 0x20) == 0)
{
Column = 1; // 第 1 列有键按下,第 1 列首号送 Column
break;
}
else if((Column_data & 0x40) == 0)
{
Column = 2; // 第 2 列有键按下,第 2 列首号送 Column
break;
}
else if(Column_data & 0x80 == 0)
{
Column = 3; // 第 3 列有键按下,第 3 列首号送 Column
break;
}
row += 4; // 扫描行号加 4 (第2行从 4 开始排列:0 4 8 12)
row_data <<= 1; // 扫描下一行
//_crol_(row_data, 1);
}
num = row + Column; // 将行号与列号相加,求键号
do
{
P1 = 0xf0;
delay();
}while((P1 & 0xf0) != 0xf0); // 等待释放按键
return num;
}
return 16;
}
uchar keyscan(void)
{
uchar scode, rcode, keycode, keyno;
P1 = 0xf0; //发全0行扫描码,列输入
if((P1 & 0xf0) != 0xf0) //若有键按下
{
delay10(); //消抖
if((P1 & 0xf0) != 0xf0) //重测
{
scode = 0xfe; //逐行扫描初值
while((scode & 0x10) != 0) //确保只扫描4行
{
P1 = scode; //输出行扫描码
if((P1 & 0xf0) != 0xf0) //若本行有键按下
{
rcode = (P1 & 0xf0) | 0x0f;
//while((P1 & 0xf0) != 0xf0); //松手检测(视情况也可去掉这句)
keycode = ((~scode) + (~rcode));
break;
}
else
{
scode = (scode << 1) | 0x01; //此行无键按下、行扫描码左移一位
}
}
switch(keycode) //键值比较/选择
{
case 0x11: keyno = 1; break; // 0
case 0x21: keyno = 2; break; // 1
case 0x41: keyno = 3; break; // 2
case 0x81: keyno = 4; break; // 3
case 0x12: keyno = 5; break; // 4
case 0x22: keyno = 6; break; // 5
case 0x42: keyno = 7; break; // 6
case 0x82: keyno = 8; break; // 7
case 0x14: keyno = 9; break; // 8
case 0x24: keyno = 10; break; // 9
case 0x44: keyno = 11; break; // A
case 0x84: keyno = 12; break; // B
case 0x18: keyno = 13; break; // C
case 0x28: keyno = 14; break; // D
case 0x48: keyno = 15; break; // E
case 0x88: keyno = 16; break; // F
default: keyno = 17; break;
}
return keyno;
}
}
return 0; //无键按下、则返回值为0
}