📄 st7549_lcd.c
字号:
// 64*64 LCD Program (I^2C方式)
//*****************************************************
//连线表: CPU=89LV52 (Vop=3V) System Clock=12M *
// RES = P3.5 SCL = P1.7 SDA = P1.6 *
// SCL SDA 须接10K上拉电阻 *
//*****************************************************
#include <reg52.h>
#include <intrins.h>
sbit RES=P3^5; //复位信号
sbit SCL=P1^7; //时钟信号
sbit SDA=P1^6; //数据信号
void CheckACK(void);
void Delay(unsigned int);
void LcdFill(unsigned char);
void LcdInit(void);
void PutBMP(unsigned char *puts);
void PutDot(unsigned char);
void Send8Bit(unsigned char);
void WriteCommand(unsigned char);
void WriteData(unsigned char);
unsigned char code bmp1[];
void main(void)
{
RES = 1; //复位
RES = 0;
Delay(50);
RES = 1;
LcdFill(0); //清屏
LcdInit(); //初始化
while(1)
{
PutBMP(bmp1);
Delay(1000);
PutDot(0x55);
Delay(1000);
PutDot(0xAA);
Delay(1000);
LcdFill(0xFF);
Delay(1000);
}
}
//写指令函数
void WriteCommand(unsigned char CommandByte)
{
//启动I2C总线
SDA = 0;
SCL = 1;
SCL = 0;
//发送总线上器件的SLAVE Address
Send8Bit(0x78); //01111(SA1)(SA0)(RW)
//SA1=0 SA0=0 RW=0写
CheckACK(); //检测ACK应答信号
//发送Control Byte
Send8Bit(0x00); //(Co)(A0)000000(A) Co=0 A0=0指令
//Co=0是表示这是最后一个指令
//后面要Stop总线再从新开始的
CheckACK();
//发送数据(对于芯片是指令,所有的字节都是作为数据发送)
Send8Bit(CommandByte);
CheckACK();
//停止I2C总线
SCL = 1;
SDA = 0;
SDA = 1;
}
//写数据函数
void WriteData(unsigned char DataByte)
{
//启动I2C总线
SDA = 0;
SCL = 1;
SCL = 0;
//发送总线上器件的SLAVE Address
Send8Bit(0x78); //01111(SA1)(SA0)(RW)
//SA1=0 SA0=0 RW=0写
CheckACK(); //检测ACK应答信号
//发送Control Byte
Send8Bit(0x40); //(Co)(A0)000000(A) Co=0 A0=1数据
//Co=0是表示这是最后一个指令
//后面要Stop总线再从新开始的
CheckACK();
//发送数据(所有发送过去的Byte都作为数据发送)
Send8Bit(DataByte);
CheckACK();
//停止I2C总线
SCL = 1;
SDA = 0;
SDA = 1;
}
//发送8Bit函数
void Send8Bit(unsigned char Byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
SDA = Byte>>(7-i)&0x01;
SCL = 1;
SCL = 0;
}
}
//ACK应答信号函数
void CheckACK(void)
{
SDA = 1;
SCL = 1;
while(SDA); //如果SDA=High,Wait.....
SCL = 0;
}
//延时函数(毫秒级)
void Delay(unsigned int MS)
{
unsigned char us,usn;
while(MS!=0)
{
usn = 2;
while(usn!=0)
{
us=0xf5;
while(us!=0) {us--;};
usn--;
}
MS--;
}
}
//初始化
void LcdInit(void)
{
WriteCommand(0x33); //00110011 0,0,1,MX,MY,PD,H1,H0
//SET H[1:0]=11 ; MY=0(COM0->COM66);
//MX=1(SEG101->SEG0); PD=0
WriteCommand(0x97); //10010111 1,0,0,1,BE1,BE0,PC1,PC0
//BE1,BE0=10(DEFAULT);PC1,PC0=11-->x5
WriteCommand(0x31); //00110001 0,0,1,MX,MY,PD,H1,H0
//SET H[1:0]=01 ; MY=0(COM0->COM66);
//MX=1(SEG101->SEG0); PD=0
WriteCommand(0xEA); //11101010 1,VOP6,VOP5,VOP4,VOP3,VOP2,VOP1,VOP0
//倍压产生调节 Vop = 6.75+0.03*106 = 9.93 V
WriteCommand(0x12); //00010010 0,0,0,1,0,BS2,BS1,BS0 bias = 1/9
WriteCommand(0x40); //Start Line = com0
WriteCommand(0x30); //00110000 0,0,1,MX,MY,PD,H1,H0
//SET H[1:0]=00 ; MY=0(COM0->COM66);
//MX=1(SEG101->SEG0); PD=0
WriteCommand(0x80); //X Address = 0 (Col=0)
WriteCommand(0x40); //Y Address = 0
WriteCommand(0x05); //PRS=1,倍压输出大范围
WriteCommand(0x0C); //D=1,E=0,Normal Display ON
}
//定位函数
void LocateXY(unsigned char Page,unsigned char Col)
{
WriteCommand(0x30); //00110000 0,0,1,MX,MY,PD,H1,H0
//SET H[1:0]=00 ; MY=0(COM0->COM66);
//MX=1(SEG101->SEG0); PD=0
WriteCommand(0x80|Col); //X Address = 0 Col
WriteCommand(0x40|Page);//Y Address = 0 Page
}
//清屏(填充)
void LcdFill(unsigned char FillByte)
{
unsigned char i,j;
LocateXY(0,0);
for(i=0;i<8;i++)
{
for(j=0;j<102;j++)
{
WriteData(FillByte);
}
}
}
//显示点阵
void PutDot(unsigned char DotByte)
{
unsigned char i,j;
for(i=0;i<8;i++)
{
LocateXY(i,0);
for(j=0;j<64;j++)
{
WriteData(DotByte);
DotByte=~DotByte;
}
}
}
//显示图形
void PutBMP(unsigned char *puts)
{
unsigned char i,j;
unsigned int X=0;
for(i=0;i<8;i++)
{
LocateXY(i,0);
for(j=0;j<64;j++)
{
WriteData(puts[X]);
X++;
}
}
}
unsigned char code bmp1[]={
0xFF,0x01,0x01,0x01,0x01,0xF9,0x01,0xE1,0x01,0x81,0x01,0x01,0x01,0x01,0x01,0x81,
0x61,0xF9,0x61,0x81,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x81,0x81,0xE1,0x21,0x21,0x21,0xE1,0xE1,0xE1,0x21,0xE1,0xE1,
0xE1,0x21,0xE1,0xE1,0xE1,0x21,0xE1,0xE1,0xE1,0x21,0xE1,0x01,0x01,0x01,0x01,0xFF,
0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFE,0x00,0xF8,0x00,0xE1,
0x01,0xFF,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x07,0x07,0x1F,0x10,0x10,0x10,0x1F,0x1F,0x1F,0x10,0x1F,0x1F,
0x1F,0x10,0x1F,0x1F,0x1F,0x10,0x1F,0x1F,0x1F,0x10,0x1F,0x00,0x00,0x00,0x00,0xFF,
0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x20,0x20,0x20,0xF8,0x20,0x20,0x20,0x20,
0xE0,0x00,0x00,0x00,0xF8,0x08,0x28,0x28,0xE8,0x28,0x28,0x28,0x08,0xF8,0x00,0x00,
0x90,0x90,0xF0,0x88,0x88,0x40,0x20,0x58,0x90,0x50,0x30,0x00,0x00,0x80,0x90,0x90,
0x90,0x90,0x80,0x40,0x40,0xF8,0x40,0x40,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x02,0x02,0x02,0x7F,0x02,0x02,0x02,0x02,
0x07,0x00,0x00,0x00,0x7F,0x28,0x29,0x29,0x2F,0x29,0x2B,0x2D,0x28,0x7F,0x00,0x00,
0x18,0x06,0x7F,0x02,0x44,0x48,0x4A,0x25,0x2A,0x13,0x0A,0x06,0x00,0x18,0x14,0x13,
0x10,0x14,0x58,0x20,0x18,0x27,0x40,0x20,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
0xFF,0x00,0x00,0x18,0x84,0x44,0x24,0x18,0x00,0xF8,0x04,0x04,0x04,0xF8,0x00,0xF8,
0x04,0x04,0x04,0xF8,0x00,0x40,0xB0,0x88,0xFC,0x80,0x00,0x00,0x80,0x60,0x1C,0x00,
0x00,0x00,0x08,0xFC,0x00,0x00,0x00,0x18,0x84,0x44,0x24,0x18,0x00,0x00,0x80,0x60,
0x1C,0x00,0x00,0xF8,0x04,0x04,0x04,0xF8,0x00,0x00,0x08,0xFC,0x00,0x00,0x00,0xFF,
0xFF,0x00,0x00,0x03,0x02,0x02,0x02,0x02,0x00,0x01,0x02,0x82,0xE2,0xE1,0x00,0x01,
0x02,0x02,0x02,0x81,0xC0,0xE0,0x60,0x60,0x63,0xE2,0xC0,0x80,0x03,0x00,0x00,0x00,
0x00,0x00,0x02,0x83,0xC2,0xE0,0x60,0x63,0x62,0xE2,0xC2,0x82,0x00,0x00,0x03,0x80,
0xC0,0x60,0x60,0x61,0xE2,0xC2,0x82,0x01,0x00,0x00,0x02,0x03,0x02,0x00,0x00,0xFF,
0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x01,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x01,0x01,0x80,0xC0,0x60,0x30,0x18,0x0F,0x07,0x00,0x00,0x00,0x06,
0x06,0x00,0x00,0x01,0x01,0x80,0xC0,0x60,0x30,0x18,0x0F,0x07,0x00,0x00,0xFF,0xFF,
0x19,0x0C,0x0C,0x0C,0x1C,0xF9,0xF1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x87,0x87,0x80,0x80,
0x80,0x80,0x80,0x86,0x87,0x87,0x86,0x86,0x86,0x86,0x86,0x86,0x80,0x80,0x80,0x86,
0x86,0x80,0x80,0x86,0x87,0x87,0x86,0x86,0x86,0x86,0x86,0x86,0x80,0x80,0x80,0x83,
0x83,0x86,0x86,0x86,0x87,0x83,0x81,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFF,
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -