郭天祥老师的51单片机中的键盘那段不懂。

郭天祥老师的51单片机中的键盘那段不懂。,第1张

while(m != 0xf0) //注意这里没有分号

{ // while(P0 != f7) 不就可以了么?

m = P0 //这不就表示已经回到初始值,按键已经起来了么?

m = m &0xf0

}

----

while(P0 != f7)//这仅仅是检测一个按键。

如果还有其它按键按下,还是应该等待一下。

最好是:

while(P0 &0xf0 != 0xf0)//这就可以代替上面的四行,还能节省一个变量。

----

原来的程序,共有四个部分,连续的、依次执行。

其实,如果在第一个部分,就检测到了按键,后面的三个部分,就不应该再执行了。

判断按键释放的程序段,在每个部分都有。

其实,在最后,用上一个,即可。

他的这个程序,在逻辑上,是有错的,不用细看了。

推荐使用线反转法:

#include<reg52.h>

#include<intrins.h> //反转法控制按键

#define uint unsigned int

#define uchar unsigned char

sbit dula=P2^6

sbit wela=P2^7

uchar a,b,c,d,keya,keyb

uint e

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}

void delay(uint x) //延时

{

uint i,j

for(i=xi>0i--)

for(j=110j>0j--)

}

void shumaguan(uchar a) //数码管

{

wela=1

P0=0xc0

wela=0

dula=1

P0=table[a] //a在键盘函数引用

dula=0

delay(10)

}

void liushuideng() //流水灯

{

b=0xc9

while(e>=0&&e<=80)

{

P1=b

delay(50)

b=_crol_(b,1)

e++

if(e==80)

b=0xff

}

}

uchar key() //有返回值的按键函数

{

P3=0x0f //定行

P3=P3&0x0f //判断哪一行有被按下的键

if(P3!=0x0f)

{

delay(10)

P3=0x0f

P3=P3&0x0f

if(P3!=0x0f)

{

c=P3&0x0f

P3=0xf0

d=P3&0xf0 //判断列 ,行反转

return(c+d)

}

}

return 0xff

}

void main()

{

while(1)

{

keyb=key()

switch(keyb)

{

case 0xee:keya=0while(key()!=0xff)shumaguan(keya)break //判断按键

case 0xed:keya=1while(key()!=0xff)shumaguan(keya)break

case 0xeb:keya=2while(key()!=0xff)shumaguan(keya)break

case 0xe7:keya=3while(key()!=0xff)shumaguan(keya)break

case 0xde:keya=4while(key()!=0xff)shumaguan(keya)break

case 0xdd:keya=5while(key()!=0xff)shumaguan(keya)break

case 0xdb:keya=6while(key()!=0xff)shumaguan(keya)break

case 0xd7:keya=7while(key()!=0xff)shumaguan(keya)break

case 0xbe:keya=8while(key()!=0xff)shumaguan(keya)break

case 0xbd:keya=9while(key()!=0xff)shumaguan(keya)break

case 0xbb:keya=10while(key()!=0xff)shumaguan(keya)break

case 0xb7:keya=11while(key()!=0xff)shumaguan(keya)break

case 0x7e:keya=12while(key()!=0xff)shumaguan(keya)break

case 0x7d:keya=13while(key()!=0xff)shumaguan(keya)break

case 0x7b:keya=14while(key()!=0xff)shumaguan(keya)break

case 0x77:keya=15while(key()!=0xff)shumaguan(keya)delay(1000)liushuideng()e=0break

default:break

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12089787.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-20
下一篇2023-05-20

发表评论

登录后才能评论

评论列表(0条)

    保存