void Delay30ms()
{
unsigned char i,j;
for(i = 0;i < 100;i++)
for(j = 0;j < 100;j++);
}
/************************************************
* *函数名:Keyscan
* *函数功能:键盘扫描函数
* *全局变量:无
* *调用函数:Delay30ms()
* *传入参数:无
*************************************************/
uchar Keyscan()
{
uchar scode; //定义行扫描变量
uchar rcode ; //定义返回编码变量
uchar m; //定义行首编码变量
uchar k; //定义列检测码
uchar i,j; //定义循环控制变量
P1 = 0x0f; //发全列为0扫描码,行线输入
if((P1 & 0x0f) != 0x0f) //若有键按下
{
Delay30ms(); //延时消抖
if((P1 & 0x0f) != 0x0f) //若有键按下
{
m = 0x03; //行首编码变量赋初值
scode = 0xfe; //行扫描变量赋初值
for(i = 0;i < 4;i++)
{
P1 = scode; //输出列线吗
k = 0x10; //列检测码赋初值
for(j = 0;j < 4;j++)
{
if((P1 & k) == 0) //本列有键按下
{
rcode = m + j; //求键码
while((P1 & 0xf0) != 0xf0); //等待按键释放
BELL = 0;
Delay30ms();
Delay30ms();
Delay30ms();
BELL = 1;
return (rcode); //返回键码
}
else
k = k <<1 ; //列检测码左移一位
}
m = m + 4; //下一行行首编码
scode = scode << 1; //行扫描变量左移一位
}
}
}
return 0; //若没键按下,返回0
}
单片机,矩阵键盘扫描驱动
最新推荐文章于 2022-11-19 10:43:49 发布