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

2020-02-05 09:24发布

我用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;
我想原因就是在扫描按键的时候对显示有影响,但是为什么了,有大侠能提供个方案吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。