当前位置: 首页 > news >正文

字符型液晶显示器LCD 1602的显示控制(Keil+Proteus)

 前言

趁机把LCD 1602的实验完成了,那个电路图有几个地方没弄懂,但是去掉也没有报错,就没管了。

LCD1602_百度百科 (baidu.com)icon-default.png?t=N7T8https://baike.baidu.com/item/LCD1602/6014393?fr=ge_ala

LCD1602液晶显示屏通过电压来改变填充在两块平行板之间的液晶材料内部分子的排列状况,以达到遮光和透光的目的来显示深浅不一,错落有致的图像。而且只要在两块平板间再加上三元色的滤光层,就可实现显示。

液晶是具有流动特性的物质,所以只需外加很微小的力量即可使液晶分子运动。以最常见普遍的向列型液晶为例,液晶分子可轻易的借着电场作用使得液晶分子转向,由于液晶的光轴与其分子轴相当一致,故可借此产生光学效果。当加于液晶的电场移除消失时,液晶将借着其本身的弹性及黏性,液晶分子将十分迅速的回撤销来未加电场前的状态。

“16”表示液晶显示模块每行可显示16个字符,“02”表示显示2行。

基础操作参考下面的这篇文章:

LED数码管的静态显示与动态显示(Keil+Proteus)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_64066303/article/details/134101256?spm=1001.2014.3001.5501

Keil

要注意的是Sbit RS=P2^2;

符号"^"前面是特殊功能寄存器的名字,“^”后面的数字定义的可寻址位在特殊功能寄存器中的位置。

LCD 1602的命令字

命令RSR/~WD7D6D5D4D3D2D1D0
清屏0000000000
光标返回000000000X
显示模式设置00000001I/DS
显示开/关及光标设置0000001DCB
光标或字符移位000001S/CR/LXX
功能设置00001DLNFXX
CGROM地址设置0001字符库ROM地址
DDRAM地址设置001显示数据RAM地址
读忙标志或地址01BF计数器地址
写数据10要写的数据
读数据11读出的数据

LCD 1602的读写操作规定如下

单片机发给LCD 1602 的控制信号LCD 1602 的输出
读状态RS=0,R/~W=1,E=1D0~D7=状态字
写命令RS=0,R/~W=0,D0~D7=命令,E=正脉冲
读数据RS=1,R/~W=1,E=1D0~D7=数据
写数据RS=1,R/~W=0,D0~D7=数据,E=正脉冲

 我这里取消了光标右移,是直接打印出来的.

第一行字符的地址为80H~8FH.

第二行字符的地址为C0H~CFH.

#include<reg51.h>
#include<intrins.h>	//包含_nop_()空函数指令的头文件
#define uchar unsigned char 
#define uint unsigned int
#define out P0
sbit RS=P2^0;//位变量
sbit RW=P2^1;//位变量
sbit E=P2^2;//位变量
//函数声明部分
void lcd_initial(void);//LCD初始化函数
void check_busy(void);//检查忙标志位函数
void write_command(uchar com);//写命令函数
void write_data(uchar dat);//写数据函数
void string(uchar ad,uchar *s);//显示字符串
void delay(uint);//延时void main(void){lcd_initial();//对LCD初始化while(1){string(0x83,"I LOVE YOU");//显示第一行的字符string(0xC4,"FOREVER");//显示第二行的字符delay(100);//延时write_command(0x01);//清屏delay(100);//延时}
}//延时
void delay(uint j){uchar i=250;for(;j>0;j--){while(--i);i=249;while(--i);i=250;}
}//检查忙标志
void check_busy(void){uchar dt;do{dt=0xff;//dt为变量单元,初值为0xff//RS=0,E=1时才可以读忙标志位E=0;RS=0;RW=1;E=1;dt=out;//out为P0口,P0口的状态送入dt中}while(dt&0x80);//如果忙标志位BF=1,继续循环检测,等待BF=0E=0;//BF=0,LCD 1602不忙,结束检测
}//写命令
void write_command(uchar com){check_busy();//按规定RS和E同时为0时,才可以写命令E=0;RS=0;RW=0;out=com;//将命令com写入P0口E=1;//写命令时,E应为正脉冲,即正跳变,所以前面先置E=0_nop_();//空操作1个机器周期,等待硬件反应E=0;//E由高电平变为低电平,LCD 1602开始执行命令delay(1);//延时,等待硬件反应
}//写数据
void write_data(uchar dat){check_busy();//检测忙标志位BF=1则等待,若BF=0,则可对LCD 1602写入命令E=0;//按规定写数据时,E应为正脉冲,所以先置E=0//按规定RS=1和RW=0时,才可以写入数据RS=1;RW=0;out=dat;//将数据”dat“从P0口输出,即写入LCD 1602E=1;//E产生正跳变_nop_();//空操作1个机器周期,等待硬件反应E=0;//E由高电平变为低电平,写数据操作结束delay(1);
}//液晶显示器初始化函数
void lcd_initial(void){write_command(0x38);//8位两行显示,5*7点阵字符_nop_();//空操作1个机器周期,等待硬件反应write_command(0x0C);//开整体显示,光标关,无闪烁_nop_();//空操作1个机器周期,等待硬件反应//write_command(0x05);//光标右移_nop_();//空操作1个机器周期,等待硬件反应write_command(0x01);//清屏delay(1);
}
//输出显示字符串
void string(uchar ad,uchar *s){write_command(ad);while(*s>0){write_data(*s++);//输出字符串,且指针增1delay(100);}
}

Proteus

所需器件

元件名称Proteus关键字
51单片机AT89C51
复位按钮BUTTON
电容CAP
电解电容CAP-ELEC
晶体振荡器CRYSTAL
字符型LCD 1602显示器LM016L
滑动变阻器POT-HG
电阻RES
排阻RESPACK-8

 运行结果

参考链接

Proteus-51单片机-LCD1602液晶显示DS1302实时时钟_51单片机lcd1602显示时间_爱上电路设计的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/liht_1634/article/details/131524016一、51单片机 使用Proteus掌握LCD1602显示屏的使用(仿真及代码)_51单片机1602显示汉字-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_47235364/article/details/128294254STC89C51基础及项目第10天:LCD显示字符(非标协议外设)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/Jaci133/article/details/133429036[89C51单片机]LCD1602静态显示-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zitech/article/details/9200203【精选】【常用传感器】LCD1602液晶工作原理详解及例程代码_lcd1602工作原理-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/as480133937/article/details/113148712

总结

基本上就是按照书上来了,也没有什么技巧,简单记录一下吧。

相关文章:

  • 自定义 Spring Boot Starter 组件
  • 劝学:Android 14 Framework 引入了哪些“新”技术栈
  • 【C++数据结构】异常简介与异常类的构建
  • 【云原生】使用nginx反向代理后台多服务器
  • 安全防御——三、网络安全理论知识
  • npm ERR! code ERESOLVE,npm ERR! ERESOLVE unable to resolve dependency tree
  • word统计全部字符数。
  • IDEA使用Git进行代码管理教程
  • 利用shp文件构建mask【MATLAB和ARCGIS】两种方法
  • 【达梦数据库】mysql与达梦整数类型对比关系
  • Web逆向-某网络学院学习的”偷懒“思路分析
  • swift语言下SurfGen库做的爬虫是什么样的 ?
  • Stable Diffusion源码调试(二)
  • Spring Cloud学习(一)【SpringCloud介绍/服务远程调用】
  • springcloud商城源码
  • ➹使用webpack配置多页面应用(MPA)
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • canvas 高仿 Apple Watch 表盘
  • IDEA常用插件整理
  • javascript面向对象之创建对象
  • JavaScript设计模式与开发实践系列之策略模式
  • Laravel Telescope:优雅的应用调试工具
  • php面试题 汇集2
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • springboot_database项目介绍
  • Vue UI框架库开发介绍
  • 百度小程序遇到的问题
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 解决iview多表头动态更改列元素发生的错误
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 为视图添加丝滑的水波纹
  • 学习ES6 变量的解构赋值
  • 学习Vue.js的五个小例子
  • No resource identifier found for attribute,RxJava之zip操作符
  • C# - 为值类型重定义相等性
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • #### go map 底层结构 ####
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (3)llvm ir转换过程
  • (31)对象的克隆
  • (JS基础)String 类型
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (Python第六天)文件处理
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (转)Google的Objective-C编码规范
  • .NET MVC第三章、三种传值方式
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .net对接阿里云CSB服务
  • .NET开发人员必知的八个网站
  • .ui文件相关