|
#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端口配置為準(zhǔn)雙向口
lcd_init();
while(1)
{
// write_CGRAM();
display();
display2();
}
}
void delay(void) //幾u(yù)s的延時(shí)
{
uchar i = 2;
while(i--);
}
void delay_ms(uint ms) //大約ms級(jí)的延時(shí)
{
uint i,j;
for(j=0;j<ms;j++)
for(i=0;i<1000;i++);
}
void i2c_start(void) //開始信號(hào)
{ //SCL為高時(shí),SDA下降沿
SDA = 1;
SCL = 1;
delay();
SDA = 0;
delay();
}
void i2c_stop(void) //停止信號(hào)
{ //SCL為高時(shí),SDA上升沿
SDA = 0;
SCL = 1;
delay();
SDA = 1;
delay();
}
void ack(void) //ACK應(yīng)答
{ //第九個(gè)時(shí)鐘,應(yīng)答檢測(cè)
SCL = 0;
delay();
SDA = 1;
SCL = 1;
while(SDA);
delay();
SCL = 0;
delay();
}
void i2c_write(uchar dat) //寫8bit數(shù)據(jù)
{
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數(shù)據(jù)
{
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) //寫數(shù)據(jù)
{
uchar i;
i2c_start(); //開始
i2c_write(0x7c); //寫從機(jī)地址
for(i=0;i<length-1;i++) //寫length長(zhǎng)度地址
{
i2c_write(0xc0); //寫數(shù)據(jù)指令
i2c_write(dat[i]);
}
i2c_write(0x40); //傳輸數(shù)據(jù)停止標(biāo)志位
i2c_write(dat[i]);
i2c_stop(); //停止
}
void write_cmd(uchar cmd) //寫指令
{
i2c_start(); //開始
i2c_write(0x7c); //從機(jī)地址
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點(diǎn)陣
write_cmd(0x0c); //開顯示
write_cmd(0x01); //清顯示
delay_ms(2);
write_cmd(0x06); //光標(biāo)設(shè)置
}
void display(void)
{
write_cmd(0x80); //第一行
write_ndat(tab1,16); //顯示數(shù)據(jù)
write_cmd(0xc0); //第二行
write_ndat(tab1,16); //顯示數(shù)據(jù)
delay_ms(800);
write_cmd(0x01); //清顯示
delay_ms(2);
}
void display2(void)
{
write_cmd(0x80); //第一行
write_ndat(tab2,16); //顯示數(shù)據(jù)
write_cmd(0xc0); //第二行
write_ndat(tab2,16); //顯示數(shù)據(jù)
delay_ms(800);
write_cmd(0x01); //清顯示
delay_ms(2);
}
void display3(void)
{
write_cmd(0x80); //第一行
write_ndat(tab2,16); //顯示數(shù)據(jù)
write_cmd(0xc0); //第二行
write_ndat(tab2,16); //顯示數(shù)據(jù)
delay_ms(800);
write_cmd(0x01); //清顯示
delay_ms(2);
}
51模擬IIC驅(qū)動(dòng),你試下吧。 |
評(píng)分
-
查看全部評(píng)分
|