首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

关于按键扫描的困扰很久了,该如何解决

2013-03-06 
关于按键扫描的困扰很久了本帖最后由 wu12659920 于 2013-02-24 16:10:14 编辑学习按键扫描的时候就碰到许

关于按键扫描的困扰很久了
本帖最后由 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

热点排行