废话少说,上代码和图片:
#include <reg52.h>
#include <intrins.h>
/*根据实际电路配置*/
#define DataPort P0
#define BF ((DataPort&0x80)>>7)
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
//延时函数
void delay(unsigned char z)
{
unsigned char x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--)
;
}
/*检验LCD1602是否准备就绪*/
/*仿真似乎有问题*/
void CheckBusy()
{
DataPort=0xff;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
_nop_();
while(BF);
LCD_EN=0;
}
/*写入指令*/
void WriteCommand(unsigned char cmd)
{
//CheckBusy();
LCD_RS=0;
LCD_RW=0;
DataPort=cmd;
delay(5);
LCD_EN=1;
delay(5);
LCD_EN=0;
}
/*写入数据*/
void WriteData(unsigned char dat)
{
//CheckBusy();
LCD_RS=1;
LCD_RW=0;
DataPort=dat;
delay(5);
LCD_EN=1;
delay(5);
LCD_EN=0;
}
void WriteChar(unsigned char x,unsigned char y,unsigned char dat)
{
unsigned char line;
if(x==0)
line=0x80;
else
line=0xc0;
WriteCommand(line+y);
WriteData(dat);
}
void WriteString(unsigned char* str)
{
char* p=str;
while(*p!='\0')
WriteData(*p++);
}
void ClearLCD1602()
{
WriteCommand(0x01);
}
void InitLCD1602()
{
LCD_EN=0;
WriteCommand(0x83);
/*显示模式设置 00111000
设置16*2显示
5*7点阵
8位数据接口*/
WriteCommand(0x0c);
/*显示开关及光标设置 00001DCB
D=1,开显示 D=0, 关显示
C=1,显示光标 C=0,不显示光标
B=1,光标闪烁 B=0,光标不闪烁*/
WriteCommand(0x06);/*地址指针自动+1且光标+1,写字符屏幕不会移动*/
WriteCommand(0x3f);/*8位数据接口,双行显示*/
WriteCommand(0x01);/*清屏*/
}
void main()
{
InitLCD1602();
WriteString("Hello, world!");
while(1);
}
电路原理图:
评论