|
做的是汽車智能雨刷器,上電后液晶屏第一行顯示黑色方塊,第二行不顯示,用下面的程序仿真可以實(shí)現(xiàn),實(shí)物圖就不行了,其他功能都正常。求各位大神幫忙看一下哪里出問題了。
#include <REGX52.H>
#include <ADC0832.H>
#include <LCD1602.H>
#include <eeprom52.H>
uchar i=0;
uint dat;
uint dat1=0;
uint dat2=0;
uint dat_value=0;
uint DJ_dat=0,ms=0,ms_1=0;
uchar loop=0;
sbit key_1=P3^1;
sbit key_2=P3^2;
sbit key_3=P3^3;
sbit key_4=P3^4;
sbit led0=P2^0;
sbit led1=P2^1;
bit key_1_flag=0;
bit key_2_flag=0;
bit key_3_flag=0;
bit key_4_flag=0;
bit A_M=1;
uchar speed_flag=0;
uint Value=1000;
uint water_h=0;
uint water_l=0;
uchar state=0;
bit star_off=1,zheng_fan=1,s0=0,ir_on=0;
uchar zz[]= //正轉(zhuǎn)數(shù)據(jù)
{
0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09
};
uchar fz[]= //反轉(zhuǎn)數(shù)據(jù)
{
0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01
};
void display()
{
void LCD1602_Write_Cmd(uchar cmd)
{
Read_Busy(); //判斷忙,忙則等待
LCD1602_RS = 0;
LCD1602_RW = 0; //拉低RS、RW操作時(shí)序情況1602課件下中文使用說明基本操作時(shí)序章節(jié)
LCD1602_DB = cmd;//寫入命令
LCD1602_EN = 1; //拉高使能端 數(shù)據(jù)被傳輸?shù)絃CD1602內(nèi)
LCD1602_EN = 0; //拉低使能以便于下一次產(chǎn)生上升沿
}
/*=================================================
*函數(shù)名稱:LCD1602_Write_Dat
*函數(shù)功能:寫LCD1602數(shù)據(jù)
*調(diào)用:Read_Busy();
*輸入:dat:需要寫入的數(shù)據(jù)
=================================================*/
void LCD1602_Write_Dat(uchar dat)
{
Read_Busy();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_EN = 1;
LCD1602_EN = 0;
}
/*=================================================
*函數(shù)名稱:LCD1602_Dis_OneChar
*函數(shù)功能:在指定位置顯示一個(gè)字符
*調(diào)用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();
*輸入:x:要顯示的橫坐標(biāo)取值0-40,y:要顯示的行坐標(biāo)取值0-1(0為第一行,1為第二行)
dat:需要顯示的數(shù)據(jù)以ASCLL形式顯示
=================================================*/
void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat)
{
if(y) x |= 0x40;
x |= 0x80;
LCD1602_Write_Cmd(x);
LCD1602_Write_Dat(dat);
}
LCD1602_write(0,0x80);
LCD1602_writebyte("Water:");
if(dat>99) LCD1602_write(1,0x30+dat/100%10);
else LCD1602_write(1,' ');
if(dat>9) LCD1602_write(1,0x30+dat/10%10);
else LCD1602_write(1,' ');
LCD1602_write(1,0x30+dat%10);
LCD1602_writebyte("% ");
if(A_M==0) LCD1602_writebyte("A ");
else LCD1602_writebyte("M ");
if(star_off==0) LCD1602_writebyte("K ");
else LCD1602_writebyte("G ");
LCD1602_write(1,0x30+speed_flag%10);
LCD1602_writebyte(" ");
dat_value=dat;
LCD1602_write(0,0xC0);
LCD1602_writebyte("H:");
if(state==1&&s0) LCD1602_writebyte(" ");
else
{
if(water_h>99) LCD1602_write(1,0x30+water_h/100%10);
else LCD1602_write(1,' ');
if(water_h>9) LCD1602_write(1,0x30+water_h/10%10);
else LCD1602_write(1,' ');
LCD1602_write(1,0x30+water_h%10);
}
LCD1602_writebyte("% ");
LCD1602_writebyte("L:");
if(state==2&&s0) LCD1602_writebyte(" ");
else
{
if(water_l>99) LCD1602_write(1,0x30+water_l/100%10);
else LCD1602_write(1,' ');
if(water_l>9) LCD1602_write(1,0x30+water_l/10%10);
else LCD1602_write(1,' ');
LCD1602_write(1,0x30+water_l%10);
}
LCD1602_writebyte("%");
}
void key_dispose()
{
if(key_1==0)
{
LCD1602_delay(20);
if(key_1_flag)
{
key_1_flag=0;
state=(state+1)%3;
}
}
else key_1_flag=1;
if(key_2==0)
{
LCD1602_delay(20);
if(key_2_flag)
{
key_2_flag=0;
if(state==1)
{
if(water_h<100) water_h++;
SectorErase(0x2000);
byte_write(0x2000,water_h);
}
if(state==2)
{
if(water_l<water_h-1) water_l++;
SectorErase(0x2200);
byte_write(0x2200,water_l);
}
if(state==0)
{
A_M=~A_M; star_off=1;
}
}
}
else key_2_flag=1;
if(key_3==0)
{
LCD1602_delay(20);
if(key_3_flag)
{
key_3_flag=0;
if(state==1)
{
if(water_h>water_l+1) water_h--;
SectorErase(0x2000);
byte_write(0x2000,water_h);
}
if(state==2)
{
if(water_l>0) water_l--;
SectorErase(0x2200);
byte_write(0x2200,water_l);
}
if(state==0)
{
if(A_M==1)
{
star_off=~star_off;
if(star_off==0) speed_flag=1;
else speed_flag=0;
}
}
}
}
else key_3_flag=1;
if(key_4==0)
{
LCD1602_delay(20);
if(key_4_flag)
{
key_4_flag=0;
if(A_M)
{
speed_flag=(speed_flag+1)%3;
}
}
}
else key_4_flag=1;
if(A_M==0)
{
led0=0;
led1=1;
}
else
{
led1=0;
led0=1;
}
if(speed_flag==2)
{
Value=260;
}
else if(speed_flag==1||speed_flag==0)
{
Value=500;
}
}
void police_dispose()
{ ir_on=0;
if(dat_value>water_h)
{
star_off=0; speed_flag=2;
}
else if(dat_value>=water_l&&dat_value<=water_h)
{
star_off=0; speed_flag=1;
}
else if(dat_value<water_l)
{
star_off=1; speed_flag=0;
}
}
void main()
{
water_h=byte_read(0x2000);
water_l=byte_read(0x2200);
if(water_h<water_l||water_h>100||water_l<0)
{
water_h=60;
water_l=10;
}
TMOD=0x11;
TH1=0x3c;
TL1=0xb0;
TH0=0x3c;
TL0=0xb0;
ET1=1;
ET0=1;
EA=1;
TR0=1;
TR1=1;
LCD1602_cls();
while(1)
{
if(A_M==0)
{ police_dispose();
if(star_off==0)
{
if(DJ_dat==0) loop=0;
while(DJ_dat<180)
{
P1=P1&0xf0|zz[loop];
loop=(loop+1)%8;
if(loop==0) DJ_dat++;
LCD1602_delay(Value);
}
if(DJ_dat==120)loop=0;
while(DJ_dat!=0)
{
P1=P1&0xf0|fz[loop];
loop=(loop+1)%8;
if(loop==0) DJ_dat--;
LCD1602_delay(Value);
}
}
}
else
{
if(speed_flag!=0)
{
if(star_off==0)
{
if(DJ_dat==0) loop=0;
while(DJ_dat<180)
{
P1=P1&0xf0|zz[loop];
loop=(loop+1)%8;
if(loop==0) DJ_dat++;
LCD1602_delay(Value);
}
if(DJ_dat==120)loop=0;
while(DJ_dat!=0)
{
P1=P1&0xf0|fz[loop];
loop=(loop+1)%8;
if(loop==0) DJ_dat--;
LCD1602_delay(Value);
}
}
}
else
{
loop=0; DJ_dat=0;
}
}
}
//1毫秒定時(shí)
}
void time_1(void) interrupt 1
{
TH0=0x3c;
TL0=0xb0;
ms_1++;
if(i<10)
{
i++;
dat1+=A_D(0); //滿量程0-255 實(shí)際完全浸入水中是255-36= 219 0-219
}
else
{
i=0;
dat1=dat1/10;
if(dat1<=36) dat1=36;
dat1=dat1-36;
dat=100-(dat1/2.19); dat1=0;
}
if(ms_1>=10)
{
ms_1=0;
s0=~s0;
}
}
void time_0(void) interrupt 3
{
TH1=0x3c;
TL1=0xb0;
display();
key_dispose();
}
|
-
-
|