结合注释进行理解,应该算是写的比较详细了
#include <reg52.h> // 引入STC89C52的寄存器定义
#include <intrins.h> // 使用_nop_()函数
#define LCD_DataPort P0 // 连接液晶数据总线的P0口
sbit RS = P2^0; // 液晶RS引脚连接到P2.0口
sbit RW = P2^1; // 液晶RW引脚连接到P2.1口
sbit EN = P2^2; // 液晶EN引脚连接到P2.2口
// 函数:微秒级延时
void DelayUs2x(unsigned char t)
{
while (--t);
}
// 函数:毫秒级延时
void DelayMs(unsigned char t)
{
while (t--)
{
DelayUs2x(245);
DelayUs2x(245);
}
}
// 函数:向液晶写入命令
void LcdWriteCmd(unsigned char cmd)
{
RS = 0; // 选择命令模式
RW = 0; // 选择写入模式
LCD_DataPort = cmd; // 将传入的指令写入数据总线
EN = 1; // 使能液晶
_nop_();
_nop_();
EN = 0; // 禁止液晶
DelayUs2x(10);
}
// 函数:向液晶写入数据
void LcdWriteDat(unsigned char dat)
{
RS = 1; // 选择数据模式
RW = 0; // 选择写入模式
LCD_DataPort = dat; // 将数据写入数据总线
EN = 1; // 使能液晶
_nop_();
_nop_();
EN = 0; // 禁止液晶
DelayUs2x(10);
}
// 函数:液晶初始化
void LcdInit()
{
LcdWriteCmd(0x38); // 16x2显示,5x7点阵,8位数据接口
LcdWriteCmd(0x0C); // 开显示,光标不闪烁
LcdWriteCmd(0x06); // 光标自动右移,不移动屏幕
LcdWriteCmd(0x01); // 清屏
DelayMs(10);
}
// 函数:设置液晶光标位置
void LcdSetCursor(unsigned char x, unsigned char y)
{
unsigned char addr;
if (y == 0)
addr = 0x80 + x; // 第一行
else
addr = 0xC0 + x; // 第二行
LcdWriteCmd(addr);
}
// 函数:在液晶上显示字符串
void LcdDisplayStr(unsigned char x, unsigned char y, unsigned char *str)
{
LcdSetCursor(x, y);
while (*str)
{
LcdWriteDat(*str);
str++;
}
}
void main()
{
LcdInit(); // 初始化液晶显示器
LcdDisplayStr(0, 0, "Number: 520"); // 在液晶上显示字符串
while (1)
{
// 主循环
}
}