我用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;
我想原因就是在扫描按键的时候对显示有影响,但是为什么了,有大侠能提供个方案吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我如果只扫描按键,没有加前面的LED灯控制,就对显示没有影响了,很奇怪的
原因是送数据的时候有按键按下就会影响送过去的数据,而不是你扫描按键的时候有没有关闭LCD的使能,
即使照上面我说的做了,要做到同时按下多个按键不影响还需要增加二极管
肯定也会有影响的,因为无法保证按下按键的时候刚好是在执行按键扫描而不是在给LCD送数据
我用软件对LCD加了个锁,可以了,还是扫描按键的时候对LCD有影响
一周热门 更多>