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。

#include “reg51.h”

sbit KEY1=P3^3 //定义按键输入端口

sbit KEY2=P3^4 //定义按键输入端口

sbit LED=P1^2 //定义led输出端口

/*------------------------------------------------

uS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编,大致延时

长度如下 T=tx2+5 uS

------------------------------------------------*/

void DelayUs2x(unsigned char t)

{

while(--t)

}

/*------------------------------------------------

mS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编

------------------------------------------------*/

void DelayMs(unsigned char t)

{

while(t--)

{

//大致延时1mS

DelayUs2x(245)

DelayUs2x(245)

}

}

void main()

{

while(1)

{

if(!KEY1)

{

DelayMs(10)//延时去抖,一般10-20ms

if(!KEY1) //再次确认按键是否按下,没有按下则退出

{

while(!KEY1)//如果确认按下按键等待按键释放,没有释放则一直等待

LED = 0 //亮

}

}

if(!KEY2)

{

DelayMs(10)//延时去抖,一般10-20ms

if(!KEY2) //再次确认按键是否按下,没有按下则退出

{

while(!KEY2)//如果确认按下按键等待按键释放,没有释放则一直等待

LED = 1 //灭

}

}

}

}

unsigned char Keycan(void) //按键扫描程序 P1.0--P1.3为行线 P1.4--P1.7为列线

{

unsigned char rcode, ccode

P1 = 0xF0 // 发全0行扫描码,列线输入

if((P1&0xF0) != 0xF0) // 若有键按下

{

delay()// 延时去抖动

if((P1&0xF0) != 0xF0)

{ rcode = 0xFE// 逐行扫描初值

while((rcode&0x10) != 0)

{

P1 = rcode// 输出行扫描码

if((P1&0xF0) != 0xF0) // 本行有键按下

{

ccode = (P1&0xF0)|0x0F

do{}while((P1&0xF0) != 0xF0)//等待键释放

return ((~rcode) + (~ccode))// 返回键编码

}

else

rcode = (rcode<<1)|0x01// 行扫描码左移一位

}

}

}


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

原文地址: http://outofmemory.cn/yw/12196952.html

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

发表评论

登录后才能评论

评论列表(0条)

保存