|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
) \' X0 w1 ~: `9 [我们将使用LCD1602模块让单片机用图形和文字来展现信息,因为LCD1602的操作相对比较简单。
* i: Q+ R2 J& Y4 W7 \& ]3 {3 }( J, Z4 @
一、LCD1602模块介绍
0 `$ y5 l- l7 l% j& }2 b$ ~6 k+ K& R3 hLCD1602是十分基础常见的显示模块,它有三位控制引脚与8位数据引脚,其中E为使能端口,RS代表接下来传输的是命令或是要显示的数据,RW则是代表下一步是要读出数据还是向模块中写入。
% X5 i- }4 }% I( C. V: p同时,LCD1602在CGROM(字符发生存储器)中集成了ASCII码表,每一个字符都有一个固定的地址,这让它可以轻松的展现英文单词以及一些常用字符。
- n( ]6 r# D9 `9 U- V比如'A'的存放地址为41H,显示A时就是将地址为41H的点阵字符图形取出,并显示在屏幕上。
; b# h$ i3 T7 `8 [. V! z: Z如果你对LCD1602模块足够熟悉,你甚至可以将它用于数据存储(虽然并不好用也不能断电保存),还能够利用让它显示自定义的字符图案,但这属于LCD1602的拓展功能,本文中只是简单一提,请大家下课自己通过查看LCD1602中文手册掌握。
1 r7 O9 Z; Y3 {* l% N9 I1、LCD1602引脚接口功能2 q! Q* r3 m4 O% H1 ^2 B
VSS:接地; _" x4 P/ h' E% r# d+ m% i3 w" C
VDD:接5V电源
1 p. S, d9 l% T! Q2 FVE:为对比电压,用于调整液晶屏显示对比度,
7 U, h9 G; r- n0 \% v5 S( lRS:数据/命令选择端口,高电平代表数据位传输的是数据,低电平相反
2 C+ b6 e# Y) ?! Q2 W+ G7 B+ VRW:读/写选择端口,高电平代表数据位用于外部读取RAM数据,低电平则相反0 ~/ a8 _" z7 O1 K
E:使能端口,低电平有效( A3 e1 d* B1 _* h
D0~D7: 数据位
+ N; [- F! @+ w/ Q# ?A:背光板正极9 e7 ?! I8 x6 L% ^
K:背光板负极 a4 O% a) V$ Y: ~1 }$ y b+ A
可以看到,在使能端口可用时,主要是靠RS、RW两个端口相互配合,以完成模块的初始化配置(命令/写入)以及字符显示(数据/写入)。. }' h8 _3 w/ c/ }
首先,我们会向LCD1602中依次写入如下命令来进行配置(RS、RW都为低电平)。 {3 h6 @6 ?6 t; C; y" m3 o
8 G( @$ u8 e" F7 \2、LCD1602常用控制命令; M# Y7 L. B8 S
设置模式 : 0x38
) Z. Y5 }! v) s; D/ X; A1 B9 @! t/ Z开显示,不显示光标,光标不闪烁 :0x0C0 |& i A4 Y: Z2 T. Y; l
读写字符后地址加一,屏显不移动 :0x06
% |. Q% @( u# J! u+ F( j9 ^清屏,数据指针清零: 0x01
* u- K8 b* j+ H h1 [( d. T设置数据地址指针初始值:0x808 J1 ~- [2 F) `. L% n5 W9 L
配置完成后,就可以将RS转换为数据模式,向8位数据端口输入ASCII码值,在屏幕上逐个逐行显示不同字符。& h$ \+ A* s# _, U( _
接下来,我们将会从项目创建开始,教给大家如何将项目构建的清晰明了。2 b; f' c1 @: r
: j- m% P/ X' v& ]2 D" \1 Y
二、一种规整的项目排布方式+项目代码
6 n; P' z! R. M' w( J首先,我们新建一个文件夹用于存放项目文件,并在其中新建Doc、User与Project文件夹,分别存放项目说明文件、代码文件以及KEIL项目文件。
0 K2 }5 e- n8 r( ]$ ~" B打开User文件夹,创建main.c、LCD1062.c与LCD1602.h文件。5 ^2 |1 r4 O% @/ O: \* {
main.c文件内存放的自然是主函数;9 F+ S5 c( ]- W$ W) Z+ E
LCD1602.c放的是定义好的LCD命令、数据读写函数,读者也可以自行将字符重定义函数放在里面;1 \) t8 ]% q O! V8 ?
LCD1602.h则是函数声明以及#define。* K& A7 B8 P5 F0 i, Y
项目构建完成后,Keil中排布如图所示 a( W, h W1 b. A; v
% H$ N* J( K1 x( ]; U1、LCD1602.h文件代码2 O, \- Q! X3 H1 }* {5 _+ h6 G/ ~
#ifndef __LCD1602_H
' v7 w( Z4 Q. f* S& b d#define __LCD1602_H
3 ` W) ~$ I9 A5 v4 ?! I8 a# U( W3 l Y
#define LCDData P0
1 Q( u* I S9 n- ?) I$ i: a; U#define uchar unsigned char: j5 j0 e( _* D! Y6 B; M! X
#define uint unsigned int- x; |% f; L* N* j0 Y
#define register_addr 0x00, k# u+ O9 b+ c& J1 }
#define device_addr 0x80
; n- L0 H4 m5 w' Y: w
/ m, N) `$ f1 x* T% kvoid delay(uchar c);2 ?; q8 \5 l7 \% [* {) ^
void LCDWriteCom(uchar i);
2 x2 Q L/ u; j0 j7 i9 ~9 Dvoid LCDWritEDAta(uchar i);
. d1 Y- a, M" n# d+ b: C; f' zvoid LCDClean();4 _$ d% K; g6 U! M0 X# \# {6 J
void LCDInit();# H4 f; w5 b, _; c% q4 t5 ]
#endif /*__LCD1602_H*/
/ z; L. h/ j4 }* J" y) u......: l' A' D" U5 E& f, H. Y
& V9 K! o2 t$ O5 y |
|