#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P2^1;
sbit SDA=P2^2;
void delay(void);
void delay_ms(uint ms);
void write_dat(uchar dat);
void write_ndat(uchar *dat, uchar length);
void write_cmd(uchar cmd);
void write_CGRAM(void);
void lcd_init(void);
void display(void);
void display2(void);
uchar code tab1[]="ABCDEFGHIJKLMNOP";
uchar code tab2[]="1234567890abcdef";
uchar code zimu[][8]={{0x00,0xff,0x04,0x04,0xff,0x04,0x04,0xff}, //王
{0x00,0x00,0xff,0x15,0xff,0x15,0xff,0x00}, //田
{0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00}, //一
{0x00,0x00,0x0e,0x00,0x00,0xff,0x00,0x00}, //二
{0x00,0x00,0x0e,0x00,0x0e,0x00,0xff,0x00}, //三
{0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55},
{0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55},
{0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55}};
void main(void)
{
//P2M0 = 0X00; P2M1 = 0X00; //P2端口配置为准双向口
lcd_init();
while(1)
{
// write_CGRAM();
display();
display2();
}
}
void delay(void) //几us的延时
{
uchar i = 2;
while(i--);
}
void delay_ms(uint ms) //大约ms级的延时
{
uint i,j;
for(j=0;j<ms;j++)
for(i=0;i<1000;i++);
}
void i2c_start(void) //开始信号
{ //SCL为高时,SDA下降沿
SDA = 1;
SCL = 1;
delay();
SDA = 0;
delay();
}
void i2c_stop(void) //停止信号
{ //SCL为高时,SDA上升沿
SDA = 0;
SCL = 1;
delay();
SDA = 1;
delay();
}
void ack(void) //ACK应答
{ //第九个时钟,应答检测
SCL = 0;
delay();
SDA = 1;
SCL = 1;
while(SDA);
delay();
SCL = 0;
delay();
}
void i2c_write(uchar dat) //写8bit数据
{
uchar i;
for(i = 0; i < 8; i++)
{
SCL = 0;
SDA = dat & 0x80;
delay();
SCL = 1;
dat <<= 1;
delay();
}
ack();
}
uchar i2c_read(void) //读8bit数据
{
uchar temp,i;
for (i = 0;i < 8;i++)
{
SCL = 1;
delay();
temp <<= 1;
temp |= SDA;
SCL = 0;
delay();
}
SDA = 1;
SCL = 1;
delay();
SCL = 0;
delay();
return temp;
}
void write_dat(uchar dat)
{
write_ndat(&dat,1);
}
void write_ndat(uchar *dat, uchar length) //写数据
{
uchar i;
i2c_start(); //开始
i2c_write(0x7c); //写从机地址
for(i=0;i<length-1;i++) //写length长度地址
{
i2c_write(0xc0); //写数据指令
i2c_write(dat[i]);
}
i2c_write(0x40); //传输数据停止标志位
i2c_write(dat[i]);
i2c_stop(); //停止
}
void write_cmd(uchar cmd) //写指令
{
i2c_start(); //开始
i2c_write(0x7c); //从机地址
i2c_write(0x80); //写指令
i2c_write(cmd);
i2c_stop(); //停止
}
void write_CGRAM(void) //造字
{
uchar i;
write_cmd(0x40); //CGRAM地址
for(i=0;i<8;i++)
write_ndat(&zimu[i-1][8],8);
}
void lcd_init(void) //初始化
{
write_cmd(0X38); //2行模式,5*8点阵
write_cmd(0x0c); //开显示
write_cmd(0x01); //清显示
delay_ms(2);
write_cmd(0x06); //光标设置
}
void display(void)
{
write_cmd(0x80); //第一行
write_ndat(tab1,16); //显示数据
write_cmd(0xc0); //第二行
write_ndat(tab1,16); //显示数据
delay_ms(800);
write_cmd(0x01); //清显示
delay_ms(2);
}
void display2(void)
{
write_cmd(0x80); //第一行
write_ndat(tab2,16); //显示数据
write_cmd(0xc0); //第二行
write_ndat(tab2,16); //显示数据
delay_ms(800);
write_cmd(0x01); //清显示
delay_ms(2);
}
void display3(void)
{
write_cmd(0x80); //第一行
write_ndat(tab2,16); //显示数据
write_cmd(0xc0); //第二行
write_ndat(tab2,16); //显示数据
delay_ms(800);
write_cmd(0x01); //清显示
delay_ms(2);
}
51模拟IIC驱动,你试下吧。 |