C51单片机按键扫描

C51单片机按键扫描,第1张

1.设置一个状态变量,如flag,定义flag=0为开状态,flag=1为关状态。

2.因为是按键(不是开关),所以实际上单片机读取的应该是脉冲形式的输入。设按键接单片机P01引脚,故可采用以下程序实现按键扫描

if(P01==0)//按下按键,进入下降沿

{

delay2()//20ms延时去按键前抖动

while(P01==0)//等待上升沿到

来,即按键d起

flag=~flag//flag取反,实现状态切换

}

void

delay2()//20ms延时子程序

{

unsigned

char

i,k

for(i=0i<100i++)

for(k=0k<100k++)

}

注:根据按键的具体接法,若按下按键向单片机输入低电平,则采用以上程序;若按下按键向单片机输入高电平,则将两处P01==0均改为P01==1。

这是4*4键盘扫描程序代码:

void delay(uchar a)

{

uchar i,j

for(i=0i<ai++)

for(j=0j<125j++)

}

uchar kbscan(void)

{

unsigned char sccode,recode

P3=0x0f //发0扫描,列线输入

if ((P3 &0x0f) != 0x0f) //有键按下

{

delay(20) //延时去抖动

if ((P3&0x0f)!= 0x0f)

{

sccode = 0xef //逐行扫描初值

while((sccode&0x01)!=0)

{

P3=sccode

if((P3&0x0f)!=0x0f)

{

recode=(P3&0x0f)|0xf0

while((P3&0x0f)!=0x0f)//等待键抬起

return((~sccode)+(~recode))

}

else

sccode=(sccode<<1)|0x01

}

}

}

return 0 //无键按下,返回0

}

void getkey(void)

{

unsigned char key

key=kbscan()

if(key==0)

{

return

}

switch(key)

{

case 0x11:keyval=7break

case 0x12:keyval=4break

case 0x14:keyval=1break

case 0x18:keyval=10break

case 0x21:keyval=8break

case 0x22:keyval=5break

case 0x24:keyval=2break

case 0x28:keyval=0break

case 0x41:keyval=9break

case 0x42:keyval=6break

case 0x44:keyval=3break

case 0x48:keyval=11break

case 0x81:keyval=12break

case 0x82:keyval=13break

case 0x84:keyval=14break

case 0x88:keyval=15break

default:keyval=0xffbreak

}

}

A|=B; 等价于 A=A|B;

是先进行或运算,再把运算结果赋给A,之后的A已经不是原来的A了。

第一个键值判断后,你就键值变量已经被赋予新的值了。

如果正好按的是第一个键则能返回1,

如果不是第一个键按下,但经过 if((keyvalue|=0xfb)!=0xff)这一判断,其中的“keyvalue|=0xfb”就把keyvalue变成0xff了,后面的判断条件自然不会满足。

把这里的一些等于号再去掉试试看。

另外,建议你对于按键扫描程序使用switch case 语句,这样条理更清晰。

/*按键获取程序*/

unsigned int Key()

{

uchar keyvalue

keyvalue=P3

keyvalue|=0xc3

if((keyvalue|0xc3)==0xff)

{

Delay(10)

if((keyvalue|0xc3)==0xff)

{

return(0)

}

}

else

{

Delay(10)

if((keyvalue|0xc3)!=0xff)

{

if((keyvalue|0xfb)!=0xff)

{ return(1)}

if((keyvalue|0xf7)!=0xff)

{ return(2)}

if((keyvalue|0xef)!=0xff)

{ return(3)}

if((keyvalue|0xdf)!=0xff)

{ return(4)}

}

}

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存