📄 lcdinti.c
字号:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//*************************************************************
sbit rst=P1^4;
sbit psb=P1^3;
sbit rs=P1^0;
sbit rw=P1^1;
sbit e=P1^2;
void delay_50us(uint t);
void delay_50ms(uint t);
void wri(uint t);
void wrd(uint t);
void welcome();
void WriteLCD(unsigned char StartAddress,unsigned char Size,unsigned char Charactors[]);
void WriteLCD_Command(unsigned char Command);
void WriteLCD_Data(unsigned char Data);
unsigned char ChangeAddress(unsigned char StartAddress);
unsigned char LCDBusyWait();
//*************************************************************
void lcd_init()//LCD初始化程序
{
rst=0;
rst=1; //LCD复位
psb=1; //将PSB置1,通信方式为8位数据并口
delay_50ms(1);//延时40ms
//功能设置---8BIT控制界面,基本指令集
wri(0x30); //调用写指令子程序
delay_50us(1); //延迟50us
//显示打开,光标关,反白显示关
wri(0x0c); //调用写指令子程序
delay_50us(1); //延迟50uS
//清除屏幕显示,将DDRAM的地址计数器归零
wri(0x01); //调用写指令子程序
delay_50us(1); //延迟39uS
//DDRAM的地址计数器(AC)加1
wri(0x06); //调用写指令子程序
delay_50us(1); //延迟39uS
}
void welcome()
{ uchar i,j;
wri(0x01);
delay_50ms(1);
WriteLCD(0x82,0,"欢迎使用");
WriteLCD(0x92,0,"Welcome ");
//WriteLCD(0x89,0,"系统正忙");
WriteLCD(0x89,0,"Waiting.");
//WriteLCD(0x88,0,"正在加载初始化");
//WriteLCD(0x99,0,"Waiting ");
for(j=0;j<=1;j++)
{
wri(0x8d);
wrd(0x20);
wrd(0x20);
wrd(0x20);
wrd(0x20);
wrd(0x20);
wri(0x8d);
for(i=0;i<=4;i++)
{
wrd(0x2e);
delay_50ms(10);
}
}
}
//*************************************下面是延时程序(包括50us和50ms)
void delay_50us(uint t) //50us延时程序
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--)
;
}
void delay_50ms(uint t)//50ms延时程序
{
uint j;
for(;t>0;t--)
for(j=6245;j>0;j--)
;
}
//***********************************************************
void wri(uint com)
{
rs=0;
rw=1;
loop1: P0=0xff;
e=1;
ACC=P0;
delay_50us(2);
if(ACC^7!=1)
{
rw=0;
P0=com;
e=1;
e=0;
}
else
goto loop1;
}
//******************************************以上是写指令子程序
void wrd(uint dat)
{
rs=0;
rw=1;
loop2:
P0=0xff;
e=1;
ACC=P0;
delay_50us(3);
if(ACC^7!=1)
{
rs=1;
rw=0;
P0=dat;
e=1;
e=0;
}
else
goto loop2;
}
//******************************************以上是写数据子程序
void WriteLCD(unsigned char StartAddress,unsigned char Size,unsigned char Charactors[])
{
unsigned char *i=Charactors; //字符串的首地址
WriteLCD_Command(StartAddress);
if(Size) //Size不为0
{
bit Over=0;
while(i<(Charactors+Size)) //判断字符串结尾
{
if(Over)
{
WriteLCD_Data(' ');i++;
if(i>=(Charactors+Size)) break;
WriteLCD_Data(' ');i++;
}
else
{
switch(((*i)*256)+(*(i+1)))
{
}
}
StartAddress=ChangeAddress(StartAddress); //改变地址,实现了逐行显示
}
}
else //Size为0
{
while(*i) //判断字符串结尾,*i为0代表结束
{
WriteLCD_Data(*i);
i++;
WriteLCD_Data(*i);
i++;
StartAddress=ChangeAddress(StartAddress);
}
}
}
void WriteLCD_Data(unsigned char Data) //向LCD写入一个字节的数据
{
LCDBusyWait();
rs=1;
P0 = Data;
e=1;
e=0;
}
void WriteLCD_Command(unsigned char Command) //向LCD写入一个字节的命令
{
LCDBusyWait();
rs=0;
P0=Command;
e=1;
e=0;
}
unsigned char ChangeAddress(unsigned char StartAddress)
{
switch(StartAddress)
{
case 0x87:WriteLCD_Command(0x90);StartAddress=0x90;break;
case 0x8F:WriteLCD_Command(0x98);StartAddress=0x98;break;
case 0x97:WriteLCD_Command(0x88);StartAddress=0x88;break;
default:StartAddress+=1;
}
return StartAddress;
}
unsigned char LCDBusyWait() //等待LCD就绪
{
unsigned char Status;
rs=0;
rw=1;
P0=0xFF;
e=1;
Status=P0;
e=0;
while(Status & 0x80)
{
e=1;
Status=P0;
e=0;
}
rw=0;
return Status;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -