网上有关“C51矩阵键盘扫描 请解释一下程序 特别是关键步骤 急!!!”话题很是火热,小编也是针对C51矩阵键盘扫描 请解释一下程序 特别是关键步骤 急!!!寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。
C51 P1端口 4X4键盘说明
这是一个用C51单片机P1端口制作的4X4键盘,p1端口低4位是键盘列扫描线,高4位是键盘行扫描线,
列扫描线是输出,行扫描线是输入。
下面就程序作一个说明
(***)表示注意点
1、首先判断整个键盘有无按下键,只要行扫描线输入不为全1,(1111)即有键按下;
P1 = 0xf0;if((P1&0xf0)!=0xf0) 如果无按键按下,全1,则返回return -1;
如果有键按下则延时,再次判断有无按键按下,Delay();if((P1&0xf0)!=0xf0)如果无按键按下则返回return -1。
有键按下则继续,这个过程就是判键消抖,避免多次读键值,***或者因为按键抖动到读键值的时候无键按下,发生错误,***列扫描线是输出全0,P1 = 0xf0。
2、进入读键值了,与上面不同,每一次判断,***列扫描线只有一根输出为0,即P1=0xfe,0xfd,0xfb,0xf7;
首先列扫描线P1.0,sCode = 0xfe;如果行扫描线全1,则本列无键按下,扫描下一列
sCode = _crol_(sCode,1); ***sCode左移一位,即0xfd,如此扫描4次,行扫描线都全0,则无键按下,
返回return -1;
如果行扫描线不全0,就是有键按下,现在可以读键值了
kCode = ~P1; //P1=EE,ED...
for(i=0;i<16;i++)
{
if(kCode == KeyCodeTable[i])
return i;
}
1.首先kCode = ~P1;***p1值取反行扫描线可能的是1,2,4,8;同样列扫描线对应值1,2,4,8
合起p1有16个值,就是KeyCodeTable[i]表的x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,
0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88
如果 if(kCode == KeyCodeTable[i]) 成立,对应的 i 值就是键号。
2.返回i值就是键号,return i;。
uchar Keys_Scan()
{
uchar sCode,kCode,i,k;
P1 = 0xf0;
if((P1&0xf0)!=0xf0) //扫描列
{
Delay();
if((P1&0xf0)!=0xf0)//消抖
{
sCode = 0xfe;
for(k=0;k<4;k++)
{
P1 = sCode;//查找低位
if((P1&0xf0)!=0xf0)//只有等于才执行else P1和0xf0作与为0xf0 与 同真为真,一假为假
{
kCode = ~P1; //P1=EE,ED...
for(i=0;i<16;i++)
{
if(kCode == KeyCodeTable[i])
return i;
}
}
else
sCode = _crol_(sCode,1);
}
}
}
return -1;
}
矩阵键盘有多种键盘算法,如果是行列扫描的话,多个按键同时按下是可以得到所有的键值,如果是线反转法的话,就会有误判的可能。
行列扫描的话,一次只扫描一行按键,而且对应行的按键的状态也会通过互相独立的IO得到。
关于“C51矩阵键盘扫描 请解释一下程序 特别是关键步骤 急!!!”这个话题的介绍,今天小编就给大家分享完了,如果对你有所帮助请保持对本站的关注!
本文来自作者[邻家夏真]投稿,不代表盛龙号立场,如若转载,请注明出处:https://wap.snlon.net/sn/14967.html
评论列表(3条)
我是盛龙号的签约作者“邻家夏真”
本文概览:网上有关“C51矩阵键盘扫描 请解释一下程序 特别是关键步骤 急!!!”话题很是火热,小编也是针对C51矩阵键盘扫描 请解释一下程序 特别是关键步骤 急!!!寻找了一些与之相关...
文章不错《C51矩阵键盘扫描 请解释一下程序 特别是关键步骤 急!!!》内容很有帮助