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;
我想原因就是在扫描按键的时候对显示有影响,但是为什么了,有大侠能提供个方案吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
little_Monkey
1楼-- · 2020-02-05 14:09
原因是送数据的时候有按键按下就会影响送过去的数据,可以把按键的公共脚用一个IO控制,给LCD送数据的时候IO置开漏,这样就不会感染LCD显示了
sonofgod
2楼-- · 2020-02-05 15:11
 精彩回答 2  元偷偷看……
sonofgod
3楼-- · 2020-02-05 16:14
little_Monkey 发表于 2012-5-9 11:07
原因是送数据的时候有按键按下就会影响送过去的数据,可以把按键的公共脚用一个IO控制,给LCD送数据的时候I ...

我如果只扫描按键,没有加前面的LED灯控制,就对显示没有影响了,很奇怪的
little_Monkey
4楼-- · 2020-02-05 17:17
sonofgod 发表于 2012-5-9 11:14
可是我在按键扫描的时候,把LCD使能端关了呢,这样还有影响的吗

原因是送数据的时候有按键按下就会影响送过去的数据,而不是你扫描按键的时候有没有关闭LCD的使能,
即使照上面我说的做了,要做到同时按下多个按键不影响还需要增加二极管
little_Monkey
5楼-- · 2020-02-05 22:37
sonofgod 发表于 2012-5-9 11:16
我如果只扫描按键,没有加前面的LED灯控制,就对显示没有影响了,很奇怪的 ...

肯定也会有影响的,因为无法保证按下按键的时候刚好是在执行按键扫描而不是在给LCD送数据
sonofgod
6楼-- · 2020-02-06 03:45
little_Monkey 发表于 2012-5-9 11:49
肯定也会有影响的,因为无法保证按下按键的时候刚好是在执行按键扫描而不是在给LCD送数据 ...

我用软件对LCD加了个锁,可以了,还是扫描按键的时候对LCD有影响

一周热门 更多>