IIC液晶:我已經寫出點了,但還不能很好的控制,給大家參考一下:
#include <reg52.h>
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
sbit SCL=P2^1;
sbit SDA=P2^0;
//延時函數
void delayus()
{
;;;;;
}
void delayms(uchar x)
{
uchar j;
while(x--)
for(j=110;j>0;j--);
}
//開始信號
void iic_start(void)
{
SDA = 1;
delayus();
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL = 1;
delayus();
SDA=0;
delayus();
}
//停止信號
void iic_stop(void)
{
SDA = 0;
delayus();
SCL = 1;
delayus();
SDA = 1;
delayus();
}
//初始化
void iicinit(void)
{
SDA = 1;
delayus();
SCL=1;
delayus();
}
//應答
void respons(void)
{
uchar i=0;
SCL = 1;
delayus();
while((SDA=1)&&(i<255))
i++;
SCL = 0;
delayus();
}
//發送一個字節
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL = 0;
delayus();
SDA=CY;
delayus();
SCL = 1;
delayus();
}
SCL=0;
delayus();
SDA=1;
delayus();
}
//寫地址,數據
void write_lcd(uchar contr1,uchar contr2,uchar date1,uchar date2)
{
iic_start();
write_byte(0x4e);
respons();
write_byte(contr1);
write_byte(contr2);
respons();
delayms(5);
write_byte(date1);
write_byte(date2);
respons();
iic_stop();
}
void lcd_init()
{
write_lcd(0x3c,0x8c,0xf8,0xf8);
write_lcd(0x0c,0xcc,0xf8,0xf8);
write_lcd(0x0c,0x6c,0xf8,0xf8);
write_lcd(0x0c,0x1c,0xf8,0xf8);
}
void main()
{
iicinit();
lcd_init();
while(1)
{
write_lcd(0xfc,0x0c,0xf8,0x08); //先寫地址
write_lcd(0x4d,0x3d,0x48,0x38); //寫數據
write_lcd(0x4d,0x4d,0x48,0x48); //寫數據
write_lcd(0xad,0x0d,0xa8,0x08); //寫數據
}
}
|