sonofgod 发表于 2012-5-9 10:43:26

LCD引脚和按键LED灯复用问题

我用mega32的PORTA引脚复用,作为LCD8个引脚以及4个LED,4个按键共同使用,
代码如下:
u16 sys_keyread(void)//每2秒调用一次
{
LCD_EN = 0;//lcd禁用
    DDRA = 0xff;//引脚作输出
    #asm("nop");
    #asm("nop");
    #asm("nop");
    #asm("nop");
    #asm("nop");
    #asm("nop");
    if(system.flag)
      PORTA.1 = 1;//控制LED1
    else
      PORTA.1 = 0;
    if(system.ledflag)
      PORTA.2 = 0;//控制LED2
    else
      PORTA.2 = 1;
    PORTA.0 = 1;//LED3
    PORTA.3 = 1;//LED4
    for(i =0;i<4;i++){//扫描按键
   switch(key_state){
      case 0:
                  PORTA.7 = 0;
                  PORTA.6 = 1;
                  PORTA.5 = 1;
                  PORTA.4 = 1;
                  key_state = 1;
         break;
      case 1:
                  PORTA.7 = 1;
                  PORTA.6 = 0;
                  PORTA.5 = 1;
                  PORTA.4 = 1;
                  key_state = 2;
         break;               
      case 2:   
                  PORTA.7 = 1;
                  PORTA.6 = 1;
                  PORTA.5 = 0;
                  PORTA.4 = 1;
                  key_state = 3;
            break;
      case 3:
                  PORTA.7 = 1;
                  PORTA.6 = 1;
                  PORTA.5 = 1;
                  PORTA.4 = 0;
                  key_state = 0;
            break;   
   }
   HC373_EN = 1;//HC373高电平电平
   #asm("nop");
   #asm("nop");
   #asm("nop");
   HC373_EN = 0; //HC373低电平锁存
   key_buf = (key_buf<<3)|(PINB&(0x07));
    }
return key_buf;
}
问题就是我按键能够正确识别,但是LCD显示就会时不时的跳出一个乱码,LCD显示程序是
LCD_EN = 1;//LCD使用
    HC373_EN = 0;//HC373锁存
    #asm("nop");
    lcd_gotoxy(0,0);
    lcd_puts(buf1);
    lcd_gotoxy(0,1);
    lcd_puts(buf2);
    #asm("nop");
    LCD_EN = 0;
    HC373_EN = 0;
我想原因就是在扫描按键的时候对显示有影响,但是为什么了,有大侠能提供个方案吗?

little_Monkey 发表于 2012-5-9 11:07:19

原因是送数据的时候有按键按下就会影响送过去的数据,可以把按键的公共脚用一个IO控制,给LCD送数据的时候IO置开漏,这样就不会感染LCD显示了

sonofgod 发表于 2012-5-9 11:14:44

little_Monkey 发表于 2012-5-9 11:07 static/image/common/back.gif
原因是送数据的时候有按键按下就会影响送过去的数据,可以把按键的公共脚用一个IO控制,给LCD送数据的时候I ...

可是我在按键扫描的时候,把LCD使能端关了呢,这样还有影响的吗

sonofgod 发表于 2012-5-9 11:16:47

little_Monkey 发表于 2012-5-9 11:07 static/image/common/back.gif
原因是送数据的时候有按键按下就会影响送过去的数据,可以把按键的公共脚用一个IO控制,给LCD送数据的时候I ...

我如果只扫描按键,没有加前面的LED灯控制,就对显示没有影响了,很奇怪的

little_Monkey 发表于 2012-5-9 11:48:10

sonofgod 发表于 2012-5-9 11:14 static/image/common/back.gif
可是我在按键扫描的时候,把LCD使能端关了呢,这样还有影响的吗

原因是送数据的时候有按键按下就会影响送过去的数据,而不是你扫描按键的时候有没有关闭LCD的使能,
即使照上面我说的做了,要做到同时按下多个按键不影响还需要增加二极管

little_Monkey 发表于 2012-5-9 11:49:25

sonofgod 发表于 2012-5-9 11:16 static/image/common/back.gif
我如果只扫描按键,没有加前面的LED灯控制,就对显示没有影响了,很奇怪的 ...

肯定也会有影响的,因为无法保证按下按键的时候刚好是在执行按键扫描而不是在给LCD送数据

sonofgod 发表于 2012-5-12 16:09:25

little_Monkey 发表于 2012-5-9 11:49 static/image/common/back.gif
肯定也会有影响的,因为无法保证按下按键的时候刚好是在执行按键扫描而不是在给LCD送数据 ...

我用软件对LCD加了个锁,可以了,还是扫描按键的时候对LCD有影响
页: [1]
查看完整版本: LCD引脚和按键LED灯复用问题