STC8H8K64U调试通过,延时1ms必不可少,I2C地址是0x4e,不同批次可能不同,详情参见PCF8574集成电路。
#include <STC8H.H>
#define FOSC 11059200UL
#define I2C_ADDR 0X4E
sbit SDA=P1^4;
sbit SCL=P1^5;
unsigned char code welStr[]="Hello,buddy!";
unsigned char code wriBy[]="Write by Bona";
void Delay1ms(void) //@11.0592MHz
{
unsigned char data i, j;
i = 15;
j = 90;
do
{
while (--j);
} while (--i);
}
void Wait()
{
while(!(I2CMSST & 0X40));
I2CMSST &=~0X40;
}
void Start()
{
I2CMSCR=0X01;
Wait();
}
void SendData(unsigned char dat)
{
I2CTXD=dat;
I2CMSCR=0X02;
Wait();
}
void RecvACK()
{
I2CMSCR=0X03;
Wait();
}
void Stop()
{
I2CMSCR=0X06;
Wait();
}
void LCD_WriteAdd(unsigned char dat)
{
Start();
SendData(I2C_ADDR);
RecvACK();
SendData(dat);
RecvACK();
Stop();
}
void LCD_WriteCom(unsigned char com) //D′?üá?oˉêy
{
unsigned char com1,com2;
com1=com|0x0f;
LCD_WriteAdd(com1 &0xfc);
Delay1ms();
LCD_WriteAdd(com1 &0xf8);
com2=com<<4;
com2=com2|0x0f;
LCD_WriteAdd(com2&0xfc);
Delay1ms();
LCD_WriteAdd(com2&0xf8);
}
void LCD_WriteData(unsigned char dat)
{
unsigned char dat1,dat2;
dat1 =dat|0x0f;
LCD_WriteAdd(dat1 &0xfd);
Delay1ms();
LCD_WriteAdd(dat1 &0xf9);
dat2=dat<<4;
dat2=dat2|0x0f;
LCD_WriteAdd(dat2&0xfd);
Delay1ms();
LCD_WriteAdd(dat2&0xf9);
}
void LCD_Init()
{
LCD_WriteAdd(0x08);
LCD_WriteCom(0x0f);
LCD_WriteCom(0x28);
LCD_WriteAdd(0x0c);
LCD_WriteAdd(0x08);
LCD_WriteCom(0x28);
LCD_WriteCom(0x01);
LCD_WriteCom(0x0c);
LCD_WriteCom(0x06);
}
void LCD_SetPos(unsigned char x,unsigned char y)
{
if(y==0)
{
LCD_WriteCom(0x80+x);
}
if(y==1)
{
LCD_WriteCom(0x80+0x40+x);
}
}
void LCD_ShowChar(unsigned char c)
{
LCD_WriteData(c);
}
void LCD_ShowStr(unsigned char *p)
{
while(*p)
{
LCD_ShowChar(*p++);
}
}
void LCD_Clear()
{
LCD_WriteCom(0x01);
}
void main()
{
P_SW2|=0X80;
P1M1=0X00;
P1M0=0X00;
I2CCFG=0XE0;
I2CMSST=0X00;
LCD_Init();
LCD_Clear();
LCD_SetPos(2,0);
LCD_ShowStr(welStr);
LCD_SetPos(1,1);
LCD_ShowStr(wriBy);
while(1)
{
}
}