📄 4x4.c
字号:
/*-----------------------------------------------
函数名称:key_scan
功 能:键盘扫描,返回数字键值
输 入:无
输 出:无符号整型键值
范 围:
------------------------------------------------*/
unsigned char key_scan(void)
{
uchar sccode, recode; //行扫描码(低4位1110 1101 1011 0111),重新编码(高4位 1101)
uchar key;
P2 = 0xf0; //发全0行扫描,列线输入
if( (P2 & 0xf0) != 0xf0) //若有4*4有键按下,在进行键盘扫描,找出按下的键
{
delay_nms(20); //延时去抖动,一个按键持续上百毫秒
if( (P2 & 0xf0) != 0xf0 )
{
sccode = 0xfe; //逐行扫描初值
while( (sccode & 0x10) != 0 ) //本行有键按下
{
P2 = sccode; //行扫描码写入P2
if( (P2 & 0xf0) != 0xf0 )
{
recode = (P2 & 0xf0) | 0x0f; //保存列特征信息
key = ( (~sccode) + (~recode) ); //特征字节码
}
else
{
sccode = (sccode << 1) | 0x01; //该行没有键按下,则行扫描码
} //左移一位,继续下一行的扫描
}
}
switch(Key)
{
case 0x11: return 1; break;
case 0x21: return 2; break;
case 0x41: return 3; break;
case 0x81: return MAX; break;
case 0x12: return 5; break;
case 0x22: return 6; break;
case 0x42: return MIN; break;
case 0x82: return 8; break;
case 0x14: return 9; break;
case 0x24: return UART; break;
case 0x44: return NC; break;
case 0x84: return 0; break;
case 0x18: return NC; break;
case 0x28: return NC; break;
case 0x48: return NC; break;
case 0x88: return NC; break;
default: break;
}
}
return (NC); //没有键按下,返回0
}
/************************************
函数名称:delay_xms
功 能:延时 X ms
输 入:无符号整型
输 出:
范 围:12MHZ
************************************/
void delay_nms(uint n)
{
uint i;
for(; x > 0; x--)
{
for(i = 0; i < 124; i++)
{
/*没有循环体*/
}
}
}
/*-----------------------------------------------------------------------
----------------------------------------------------------------------- */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -