你要放到“死循袭备环”中不断扫描。他的原理图一般是这样的
以第一个按键为例,当你按下时I/O口读到的数据就不是0x0f了。好吧你最开始的赋值错了。你要用0xee,0xde检测的话你应该给0xfe。拍梁毁每四个按键是一组。我这有一个我做密码锁的程序你参考一下。
void key()
{
P3=0xfe
if(P3!=0xfe)
{
time(50)
if(P3!=0xfe)
{
switch(P3)
{
case 0xee:num=1,cs++
break
case 0xde:num=2,cs++
break
case 0xbe:num=3,cs++
break
case 0x7e:num=4,cs++
break
}
渣悉 }
while(P3!=0xfe)
}
P3=0xfd
if(P3!=0xfd)
{
time(50)
if(P3!=0xfd)
{
switch(P3)
{
case 0xed:num=5,cs++
break
case 0xdd:num=6,cs++
break
case 0xbd:num=7,cs++
break
case 0x7d:num=8,cs++
break
}
}
while(P3!=0xfd)
}
P3=0xfb
if(P3!=0xfb)
{
time(50)
if(P3!=0xfb)
{
switch(P3)
{
case 0xeb:num=9,cs++
break
case 0xdb:num=0,cs++
break
case 0xbb:cs++
break
case 0x7b:num=10,cs=0,a=b=c=d=e=f=10,ply=1
break
}
}
while(P3!=0xfb)
}
}
C51 P1端口 4X4键盘说明这是一个用C51单片机P1端口制作的4X4键盘,p1端口低4位是键盘列扫描线,高4位是键盘行扫描线,
列扫描线是输出,行扫描线是输入。
下面就程序作一个说明
(***)表示注意点
1、首先判断整个键盘有无按下键,只要行扫描线输入不为全1,(1111)即有键按下;
P1 = 0xf0if((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=0i<16i++)
{
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=0k<4k++)
{
P1 = sCode//查找低位
if((P1&0xf0)!=0xf0)//只有等于才执行else P1和0xf0作与为0xf0 与 同真为真,一扮态假为假
{
kCode = ~P1//P1=EE,ED...
for(i=0i<16i++)
{
if(kCode == KeyCodeTable[i])
return i
}
}
else
sCode = _crol_(sCode,1)
}
}
}
return -1
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)