用PCF8591模块,连接单片机,1602液晶显示,大师们帮忙看看那里写的不对,液晶只显示0000,初学者,谢谢!
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit scl=P2^6;
sbit sda=P2^7;
sbit rs=P2^0;
sbit rw=P2^1;
sbit lcden=P2^2;
uchar date;
uchar code table[]="0123456789";
void i2cinit();
void i2cstart();
void i2crespons();
void i2cstop();
void i2cwritebyte(uchar date);
uchar i2creadbyte();
void readi2c();
void write_com(uchar com);
void write_date(uchar date);
void lcdinit();
void lcdplay();
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
{
for(y=110;y>0;y--);
}
}
void i2cinit()
{
scl=1;
delay(5);
sda=1;
delay(5);
}
void i2cstart()
{
sda=1;
delay(5);
scl=1;
delay(5);
sda=0;
delay(5);
}
void i2crespons()
{
uchar i=0;
scl=1;
delay(5);
while(sda==1&&i<255)
{
i++;
}
scl=0;
delay(5);
}
void i2cstop()
{
sda=0;
delay(5);
scl=1;
delay(5);
sda=1;
delay(5);
}
void i2cwritebyte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay(5);
sda=CY;
delay(5);
scl=1;
delay(5);
}
scl=0;
delay(5);
sda=1;
delay(5);
}
uchar i2creadbyte()
{
uchar i,k;
scl=0;
delay(5);
sda=1;
for(i=0;i<8;i++)
{
scl=1;
delay(5);
k=(k<<1|sda);
scl=0;
delay(5);
}
return k;
}
void readi2c()
{
uchar date;
i2cinit();
i2cstart();
i2cwritebyte(0x90);
i2crespons();
i2cwritebyte(0x01);
i2crespons();
i2cwritebyte(0x91);
i2crespons();
date=i2creadbyte();
i2cstop();
}
void write_com(uchar com)
{
rs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
rs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void lcdinit()
{
rw=0;
write_com(0x38);
write_com(0x0c);
}
void lcdplay()
{
uchar qian,bai,shi,ge;
lcdinit();
qian=date/1000;
bai=date%1000/100;
shi=date%100/10;
ge=date%10;
write_com(0x80+0x00);
write_date(table[qian]);
write_com(0x80+0x01);
write_date(table[bai]);
write_com(0x80+0x02);
write_date(table[shi]);
write_com(0x80+0x03);
write_date(table[ge]);
}
void main()
{
readi2c();
while(1)
{
lcdplay();
}
} |