关于按键扫描的困扰很久了
本帖最后由 wu12659920 于 2013-02-24 16:10:14 编辑 学习按键扫描的时候就碰到许多问题了,是在protues,今天又遇到了,是在LCD1602上做时钟的,我的设定是按了k1键,即P3.0口,弄了一个K1_flag标志,先放代码
#include<reg51.h>
#include<LCD_driver.h>
#define uchar unsigned char
#define uint unsigned int
uchar code str[]={"---LCD Clock---"};
uchar code str1[]={"****"};
uchar hour=23,min=59;sec=45;
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
bit k1_flag=0;
uchar buf=':';
uchar count_10ms;
uchar disp_buf[6]={0x00,0x00,0x00,0x00,0x00,0x00};
void timer_init()
{
TMOD=0x10;
TH1=(65536-10000)/256; TL1=(65536-10000)%256;
EA=1;ET1=1;
TR1=1;
}
void LCD_conv(uchar in1,in2,in3)
{
disp_buf[0]=in1/10+0x30;
disp_buf[1]=in1%10+0x30;
disp_buf[2]=in2/10+0x30;
disp_buf[3]=in2%10+0x30;
disp_buf[4]=in3/10+0x30;
disp_buf[5]=in3%10+0x30;
}
void delay(uchar xms)
{
uchar i,j;
for(i=xms;i>0;i--)
for(j=115;j>0;j--);
}
void timer1() interrupt 3
{
TH1=(65536-10000)/256; TL1=(65536-10000)%256;
count_10ms++;
}
void keyprocess()
{
TR1=0;
if(k1==0)
{
delay(10);
if(k1==0)
{
while(!k1);
k1_flag=1;
}
}
if(k2==0 && k1_flag==1)
{
delay(10);
if(k2==0)
{
while(!k2);
//Write_LCD_Command(0x07);
hour++;
if(hour==24)
{
hour=0;
}
}
}
if(k3==0 && k1_flag==1)
{
delay(10);
if(k3==0)
{
while(!k3);
min++;
if(min==60)
{
min=0; hour++;
if(hour==24)
hour=0;
}
}
}
if(k4==0 && k1_flag==1)
{
delay(10);
if(k4==0)
{
while(!k4);
sec++;
if(sec==60)
{
sec=0; min++;
}
}
}
//k1_flag=0;
TR1=1;
}
void LCD_disp()
{
ShowString(4,1,disp_buf);
ShowString(5,1,disp_buf+1);
ShowString(6,1,&buf);
ShowString(7,1,disp_buf+2);
ShowString(8,1,disp_buf+3);
ShowString(9,1,&buf);
ShowString(10,1,disp_buf+4);
ShowString(11,1,disp_buf+5);
}
void main()
{
uchar i;
Initialize_LCD();
i=0;
count_10ms=0;
while(str[i]!='\0')
{
ShowString(i,0,str+i);
i++;
//delay(5);
}
i=0;
while(str1[i]!='\0')
{
ShowString(i,1,str1+i);
i++;
//delay(5);
}
i=0;
while(str1[i]!='\0')
{
ShowString(12+i,1,str1+i);
// delay(5);
i++;
}
timer_init();
while(1)
{
if(count_10ms>=100)
{
count_10ms=0;
sec++;
if(sec==60)
{
sec=0;
min++;
}
if(min==60)
{
min=0;
hour++;
}
if(hour==24)
{
hour=0;min=0;sec=0;
}
}
//if(k1_flag==1)
keyprocess();
LCD_conv(hour,min,sec);
LCD_disp();
}
}
原本的写法是主函数里的 //if(k1_flag==1)前面是
if(k1==0)
{
delay(10);
if(k1==0)
{
while(!k1);
k1_flag=1;
}
}
就是扫描k1的,如果扫描按下了在进入keyprocess扫描k2k3k4,然后对时间进行调整,可是k1无论怎么按就是没办法扫描到,导致进不了keyprocess函数,我就把k1的扫描放进keyprocess里面,没想到就可以了,请问有经验的能说下做键盘扫描的时候要注意什么,我原先放在主函数里面扫描k1为什么没效果呢
[解决办法]
你按键扫描里有
while(!k2);
所以你按住k2k3k4,后,程序就在那一直等啊等啊,等你放开k2k3k4