proteus元件库
自20世纪79年代末,单片机诞生以来,人们对于单片机的开发已经有相当长的历史。
因为单片机更适用于嵌入式系统,并且对体积管理相当严格,所以你现在看到的每件电子设备中几乎都集成有单片机。
广泛的应用意味着单片机学习者有大量前人的经验可以借鉴,而对经典范例的复现,也是掌握单片机的一条捷径。
因此,在完成我们的第一个粗糙的单片机作品后,我们将开始一个新的篇章,用六节课程,对常见的单片机范例进行复现。
第一天,我们将使用LCD1602模块让单片机用图形和文字来展现信息,因为LCD1602的操作相对比较简单,我们还会在今天通过这个例程规范大家的项目文件,让代码清晰易读。
LCD1602模块介绍
LCD1602是十分基础常见的显示模块,它有三位控制引脚与8位数据引脚,其中E为使能端口,RS代表接下来传输的是命令或是要显示的数据,RW则是代表下一步是要读出数据还是向模块中写入。
同时,LCD1602在CGROM(字符发生存储器)中集成了ASCII码表,每一个字符都有一个固定的地址,这让它可以轻松的展现英文单词以及一些常用字符。
比如’A’的存放地址为41H,显示A时就是将地址为41H的点阵字符图形取出,并显示在屏幕上。
如果你对LCD1602模块足够熟悉,你甚至可以将它用于数据存储(虽然并不好用也不能断电保存),还能够利用让它显示自定义的字符图案,但这属于LCD1602的拓展功能,本文中只是简单一提,请大家下课自己通过查看LCD1602中文手册掌握
01
LCD1602引脚接口功能
VSS :接地
VDD:接5V电源
VE:为对比电压,用于调整液晶屏显示对比度,
RS :数据/命令选择端口,高电平代表数据位传输的是数据,低电平相反
RW :读/写选择端口,高电平代表数据位用于外部读取RAM数据,低电平则相反
E :使能端口,低电平有效
D0~D7 : 数据位
A :背光板正极
K :背光板负极
可以看到,在使能端口可用时,主要是靠RS、RW两个端口相互配合,以完成模块的初始化配置(命令/写入)以及字符显示(数据/写入)。
首先,我们会向LCD1602中依次写入如下命令来进行配置(RS、RW都为低电平)。
02
LCD1602常用控制命令
设置模式 : 0x38
开显示,不显示光标,光标不闪烁 : 0x0C
读写字符后地址加一,屏显不移动 : 0x06
清屏,数据指针清零: 0x01
设置数据地址指针初始值: 0x80
配置完成后,就可以将RS转换为数据模式,向8位数据端口输入ASCII码值,在屏幕上逐个逐行显示不同字符。
接下来,我们将会从项目创建开始,教给大家如何将项目构建的清晰明了。
一种规整的项目排布方式+项目代码
首先,我们新建一个文件夹用于存放项目文件,并在其中新建Doc、User与Project文件夹,分别存放项目说明文件、代码文件以及Keil项目文件。
打开User文件夹,创建main.c、LCD1062.c与LCD1602.h文件。
main.c文件内存放的自然是主函数;
LCD1602.c放的是定义好的LCD命令、数据读写函数,读者也可以自行将字符重定义函数放在里面;
LCD1602.h则是函数声明以及#define。
项目构建完成后,Keil中排布如图所示
01
LCD1602.h文件代码
#ifndef __LCD1602_H#define __LCD1602_H
#define LCDData P0#define uchar unsigned char#define uint unsigned int#define register_addr 0x00#define device_addr 0x80
void delay(uchar c);void LCDWriteCom(uchar i);void LCDWriteData(uchar i);void LCDClean();void LCDInit();#endif /*__LCD1602_H*/
其中
#ifndef __LCD1602_H#define __LCD1602_H
……
……
#endif /*__LCD1602_H*/
这种结构,是为了避免该头文件被多次重复引用。
02
LCD1602.c代码
#include <reg52.h>#include <LCD1602.h>
sbit RS = P1^3;sbit RW = P1^4;sbit E = P1^5;
void delay(uchar c){uchar a,b;for(;c>0;c–)for(a=199;a>0;a–)for(b=1;b>0;b–);}
void LCDWriteCom(uchar i){E = 0;RS = 0;RW = 0;LCDData = i;delay(1);E = 1;delay(5);E = 0;}
void LCDWriteData(uchar i){E = 0;RS = 1;RW = 0;LCDData = i;delay(1);E = 1;delay(5);E = 0;}
void LCDClean(){LCDWriteData(0x01);}
void LCDInit(){E = 0;RS = 0;RW = 0;LCDWriteCom(0x38);LCDWriteCom(0x0c);LCDWriteCom(0x06);LCDClean();LCDWriteCom(0x80);}
LCDWriteCom()为命令写入函数
LCDWrite Data()为数据写入函数
LCDClean()清屏(因为常用所以单独列出为函数)
LCDInit()为模块初始化函数,集合写入了上面讲的初始化命令
03
main.c代码
#include <reg52.h>#include <LCD1602.h>
void main(){uchar a[]=”I LOVE YOU”;uchar i;LCDInit();while(1);{LCDClean();LCDInit();i = 10;while(i–)LCDWriteData(a[9-i]);}}
如果你还没有购买开发板与LCD1602显示模块,可以继续在Proteus中进行仿真,LCD1602在Proteus元件库中叫 LM016L ,效果大概如下图所示(图片来自网络)
完成了今天的课程,以后我们就可以通过LCD1602让设备给我们一些反馈,也可以用来给程序排错,比如设置显示错误代码,用于指示程序或模块哪一部分出了错。
扫码关注我们
小白白AI学习
扫码获取更多精彩