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// 行扫描码左移一位
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)