先上仿真图,图比较简单,一个51单片机最小系统,加上一个LM016L液晶显示器,需要注意的是,实际的LM016L芯片内部有上拉电阻,但是仿真中是没有的,如果用P0口传输数据的话,需要给P0口接上拉电阻。

然后上代码,有详细的注释,就不多解释了。
#include<reg51.h>
#include<intrins.h>
//引脚定义
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit BF=P0^7;
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:延时若干毫秒
入口参数: n
***************************************************/
void delaynms(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/********************
函数功能:判断液晶模块是否忙碌
入口参数:无
返回值:result 1忙碌 0空闲
**********************/
bit BusyTest(void)
{
bit result;
RS=0;
RW=1;//此时才可以读状态
E=1;//此时才允许读写
_nop_();
_nop_();
_nop_();
_nop_();//四个空操作,给硬件反应时间
result=BF;//将忙碌标值赋值给result
E=0;
return result;
}
/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数: dictate
***************************************************/
void WriteInstruction(unsigned char dictate)
{
while(BusyTest()==1);
RS=0;
RW=0;
E=0;
_nop_();
_nop_();
P0=dictate;
_nop_();
_nop_();
_nop_();
_nop_(); // 空操作四个机器周期,给硬件反应时间
E=1;
_nop_();
_nop_();
_nop_();
_nop_(); // 空操作四个机器周期,给硬件反应时间
E=0;
}
/*****************************************************
函数功能:指定字符显示的实际地址
入口参数: x
***************************************************/
void WriteAddress(unsigned char x)
{
WriteInstruction(x|0x80); // 显示位置的确定方法规定为 "80H+地址码 x"
}
/*****************************************************
函数功能:将数据 (字符的标准 ASCII 码) 写入液晶模块
入口参数: y( 为字符常量 )
***************************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1; //RS 为高电平, RW为低电平时,可以写入数据
RW=0;
E=0; //E 置低电平 ( 根据表 8-6 ,写指令时, E 为高脉冲,
// 就是让 E 从 0 到 1 发生正跳变,所以应先置 "0"
P0=y; // 将数据送入 P0 口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_(); // 空操作四个机器周期,给硬件反应时间
E=1; //E 置高电平
_nop_();
_nop_();
_nop_();
_nop_(); // 空操作四个机器周期,给硬件反应时间
E=0; // 当 E 由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:对 LCD的显示模式进行初始化设置
***************************************************/
void LcdInitiate(void)
{
delaynms(15); // 延时 15ms,首次写指令时应给 LCD一段较长的反应时间
WriteInstruction(0x38); // 显示模式设置: 16×2 显示, 5×7 点阵, 8 位数据接口
delaynms(5); // 延时 5ms ,给硬件一点反应时间
WriteInstruction(0x38);
delaynms(5); // 延时 5ms ,给硬件一点反应时间
WriteInstruction(0x38); // 连续三次,确保初始化成功
delaynms(5); // 延时 5ms ,给硬件一点反应时间
WriteInstruction(0x0c); // 显示模式设置:显示开,无光标,光标不闪烁
delaynms(5); // 延时 5ms ,给硬件一点反应时间
WriteInstruction(0x06); // 显示模式设置:光标右移,字符不移
delaynms(5); // 延时 5ms ,给硬件一点反应时间
WriteInstruction(0x01); // 清屏幕指令,将以前的显示内容清除
delaynms(5); // 延时 5ms ,给硬件一点反应时间
}
void main(void)
{
LcdInitiate(); // 将液晶初始化
WriteAddress(0x01); // 写 Date 的显示地址 , 将在第 1 行第 2 列开始显示
WriteData('Z'); // 将字符常量写入 LCD
WriteData('h'); // 将字符常量写入 LCD
WriteData('a'); // 将字符常量写入 LCD
WriteData('n'); // 将字符常量写入 LCD
WriteData('g'); // 将字符常量写入 LCD
WriteData(' '); // 将字符常量写入 LCD
WriteData('S'); // 将字符常量写入 LCD
WriteData('a'); // 将字符常量写入 LCD
WriteData('n'); // 将字符常量写入 LCD
}
上一篇:【51单片机】矩阵键盘逐行扫描法〈C语言+Keil5+Proteus仿真〉
下一篇:51单片机day6——中断控制PWM信号输出实现LED呼吸灯
推荐阅读最新更新时间:2026-03-15 10:46
- LTC3890HUH 高效双路 8.5V/3.3V 输出降压转换器的典型应用电路
- 使用 ROHM Semiconductor 的 BD4841 的参考设计
- 使用 ON Semiconductor 的 KA7805AE 的参考设计
- LTC1258CS8-4.1 低功率、低电压电源基准的典型应用电路
- LT8309 的典型应用 - 次级侧同步整流器驱动器
- AM1G-0515DH30Z ±15V 1 瓦 DC/DC 转换器的典型应用
- 具有 ATxmega32E5 参考设计的 DALI 从站
- TDA8932B D 类音频功率放大器的对称电源立体声 SE 配置
- 使用 Diodes Incorporated 的 ZXCD1010EQ16 的参考设计
- BB-BONE-WTHR-01,BeagleBone Weather Cape 为 BeagleBone 提供天气数据,包括温度、气压、湿度和环境光

89s51单片机USB-ISP下载线制作教程
51单片机产生高频方波信号的方法
液晶显示模块设计规范之COB设计
非常经典的关于LLC的杨波博士论文
XC6406PP60DL






京公网安备 11010802033920号