|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
) F! q, g% h) Y
我们将使用LCD1602模块让单片机用图形和文字来展现信息,因为LCD1602的操作相对比较简单。
! y# h' |$ H& f% ~) R* G. H/ ?# ~, |3 d& o7 X
一、LCD1602模块介绍9 O7 w, [5 T* e+ R
LCD1602是十分基础常见的显示模块,它有三位控制引脚与8位数据引脚,其中E为使能端口,RS代表接下来传输的是命令或是要显示的数据,RW则是代表下一步是要读出数据还是向模块中写入。1 l+ V, l$ k" A, w& J
同时,LCD1602在CGROM(字符发生存储器)中集成了ASCII码表,每一个字符都有一个固定的地址,这让它可以轻松的展现英文单词以及一些常用字符。
, V+ I% _; d! p3 B- [4 q# P1 M比如'A'的存放地址为41H,显示A时就是将地址为41H的点阵字符图形取出,并显示在屏幕上。1 W, x) @- R" R
如果你对LCD1602模块足够熟悉,你甚至可以将它用于数据存储(虽然并不好用也不能断电保存),还能够利用让它显示自定义的字符图案,但这属于LCD1602的拓展功能,本文中只是简单一提,请大家下课自己通过查看LCD1602中文手册掌握。4 l/ G3 Y! z2 c: ]
1、LCD1602引脚接口功能
" E- [, T. A N2 D( w" o# D. `VSS:接地; u" z6 l. o5 t; ~
VDD:接5V电源% ]- X$ Y! j$ a+ V* ]
VE:为对比电压,用于调整液晶屏显示对比度,. {9 s; U/ z2 a( |3 |6 e
RS:数据/命令选择端口,高电平代表数据位传输的是数据,低电平相反
( x" p3 z O5 f" G4 KRW:读/写选择端口,高电平代表数据位用于外部读取RAM数据,低电平则相反
I9 |, ~/ w; _2 f& K( o6 z! BE:使能端口,低电平有效
$ Q8 \8 Y- O5 RD0~D7: 数据位
% `/ z- s, t; k$ G6 G' f9 fA:背光板正极# @3 m' X7 h2 D. n8 C- t2 [
K:背光板负极" Y6 m- f0 Q$ {, W! b; L3 X8 Q
可以看到,在使能端口可用时,主要是靠RS、RW两个端口相互配合,以完成模块的初始化配置(命令/写入)以及字符显示(数据/写入)。
6 W% |) T' B! v: Z/ a1 j* `首先,我们会向LCD1602中依次写入如下命令来进行配置(RS、RW都为低电平)。8 A* o1 T! `2 f) K3 B2 T9 f7 i
/ O: A ?' l* w. u* ?
2、LCD1602常用控制命令. ~5 g5 } k$ [4 b* ^
设置模式 : 0x389 N# c3 i, i! M8 P
开显示,不显示光标,光标不闪烁 :0x0C2 |/ k* ^4 H- j& x; q3 E
读写字符后地址加一,屏显不移动 :0x068 r% k& i0 l6 l! D: U; K; A
清屏,数据指针清零: 0x017 I4 k9 g1 o& |) n, i
设置数据地址指针初始值:0x80
; z+ Y- Q8 {- f$ m4 S6 X' o配置完成后,就可以将RS转换为数据模式,向8位数据端口输入ASCII码值,在屏幕上逐个逐行显示不同字符。
5 I0 f7 N2 F" ^1 \接下来,我们将会从项目创建开始,教给大家如何将项目构建的清晰明了。* d7 G5 z& J1 q! D: \
) A3 q3 v7 S$ }二、一种规整的项目排布方式+项目代码
, ^( a( {' }5 `" j. w0 V首先,我们新建一个文件夹用于存放项目文件,并在其中新建Doc、User与Project文件夹,分别存放项目说明文件、代码文件以及KEIL项目文件。
- M U7 @# L. _5 w9 A" E# ~ D打开User文件夹,创建main.c、LCD1062.c与LCD1602.h文件。
, i! ~1 ]; n3 Z8 C: J% z2 Omain.c文件内存放的自然是主函数;3 c0 r0 h8 i+ @( \7 y. ~
LCD1602.c放的是定义好的LCD命令、数据读写函数,读者也可以自行将字符重定义函数放在里面; C- U- ^2 x# z9 w. U% Z8 N( c& e' b- T
LCD1602.h则是函数声明以及#define。
0 F) U& v' J! a2 w项目构建完成后,Keil中排布如图所示2 S; U+ a* y7 g7 Z" g
* z* s5 B& i* Y. H1、LCD1602.h文件代码
! ^, z: i4 V! V: N1 p; B+ ~4 ?#ifndef __LCD1602_H) {; c5 ]4 @9 J# Q1 M1 r
#define __LCD1602_H
% ] A( H4 k% @
* @; C4 s- m8 a7 W3 ?0 ?4 _#define LCDData P0: ^. D/ [% S/ T, c& Y9 N
#define uchar unsigned char1 Y5 ~5 g( i" `; ]6 h% k8 F
#define uint unsigned int
# [6 I9 K+ [! S- r, k- ^#define register_addr 0x00! u7 y$ ~# u* O E2 }) f
#define device_addr 0x80
' x9 V6 {& m: A" P" V/ ]1 z R' C1 l
void delay(uchar c);( s; G; _1 _4 O& u
void LCDWriteCom(uchar i);( Q4 R. `0 ^. b6 ~0 ~
void LCDWritEDAta(uchar i);- q* [1 ?0 D+ ~( E& x6 W5 U# X
void LCDClean();- e k* z( R) ^0 R. q/ C
void LCDInit();
6 L! e3 @8 A$ O4 W#endif /*__LCD1602_H*/ m0 Q6 K/ A/ b* [
......2 i8 ?1 @* Q' L7 Y7 d8 i, a
. ~( Y& N/ O) F% L5 [
|
|