12864液晶用的是串行口,下面是部分程序,另一个定时器用来控制数码管的倒计时
#define AddWr 0x90
#define AddRd 0x91
sbit Sda=P3^6;
sbit Scl=P3^7;
sbit cs=P2^4;
sbit sid=P2^5;
sbit sclk=P2^6;
sbit PSB=P2^7;
unsigned char code DAT[]={ "工作模式: 烘烤"};
unsigned char code DAT0[]={ "平均功率: "};
void disp(void)
{
FirstLine[0]='0'+TempData[0];
FirstLine[1]='0'+TempData[1];
FirstLine[2]='0'+TempData[2];
FirstLine[3]='0'+TempData[3];
ShowString(0,FirstLine);
}
void main()
{
initT0();
init_12864();
Init_Timer1();
Displaypro();
while(1)
{
scan();
display4();
delay(300);
display3();
delay(300);
display5();
delay(1000);
TempData[0]=ReadADC(0)/1000;//处理0通道电压显示
TempData[1]=ReadADC(0)/100%10;
TempData[2]=ReadADC(0)%100/10;//处理0通道电压显示
TempData[3]=ReadADC(0)%10;
delay(300);
disp();
}
}
显示液晶的程序和数码管显示的程序可以单独显示,但是融合在一起就不能正常显示了,有紊乱。液晶显示和数码管扫描有冲突,去掉数码管扫描部分,液晶显示正常了。该怎么解决呢?时序怎么控制呀?液晶显示的数据基本正确,但是显示看不清楚,还会闪,有时整个屏幕没有字了,一会儿又有字了,有时也会乱码。数码管显示基本正常。数码管用了P1口和P2.0-P2.3口,液晶只用了P2.5-P2.7
追答首先程序方面:
case 1:P2=0x02;P0=StrTab[num1]&0x7f;break;
case 2:P2=0x04;P0=StrTab[num1];break;
case 3:P2=0x08;P0=StrTab[num1];break;
液晶是用的P2.5-P2.7是么,数码管扫描时,可能会给P2口赋值,你直接用的P2=0x0?,
这样会将P2.5-P2.7的值改为0,如果没猜错的话,这三个管脚对应的12864是RW、RS、E
你说在12864正在显示时,将它们赋值为0会有什么后果?
void Timer1_isr(void) interrupt 3 using 1
{
static unsigned int num1;
TH1=0xf0;
TL1=0x00;
switch (num1){
case 0:P2=0x01;P0=StrTab[num1];break;
case 1:P2=0x02;P0=StrTab[num1]&0x7f;break;
case 2:P2=0x04;P0=StrTab[num1];break;
case 3:P2=0x08;P0=StrTab[num1];break;
}
num1++;
if(num1==4)
num1=0;
}
这是数码管扫描部分