#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驅動,你試下吧。 |