|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
. [/ g! I6 M" D% f, N
我们将使用LCD1602模块让单片机用图形和文字来展现信息,因为LCD1602的操作相对比较简单。, k8 x, ~/ H- ~$ Y
3 ^9 o# P$ j8 J; `* r
一、LCD1602模块介绍
. h" k9 c! w0 A, B+ M$ y. l9 oLCD1602是十分基础常见的显示模块,它有三位控制引脚与8位数据引脚,其中E为使能端口,RS代表接下来传输的是命令或是要显示的数据,RW则是代表下一步是要读出数据还是向模块中写入。
' C7 @4 b! j9 O! O d( E同时,LCD1602在CGROM(字符发生存储器)中集成了ASCII码表,每一个字符都有一个固定的地址,这让它可以轻松的展现英文单词以及一些常用字符。
3 }0 V& t& H/ n$ b% y8 t, u比如'A'的存放地址为41H,显示A时就是将地址为41H的点阵字符图形取出,并显示在屏幕上。
% p4 b/ y6 w, _9 B如果你对LCD1602模块足够熟悉,你甚至可以将它用于数据存储(虽然并不好用也不能断电保存),还能够利用让它显示自定义的字符图案,但这属于LCD1602的拓展功能,本文中只是简单一提,请大家下课自己通过查看LCD1602中文手册掌握。
; I- y7 {( S! u8 t* X$ S3 K1、LCD1602引脚接口功能% C, c) n7 B1 Z* _
VSS:接地0 x) N1 f* b. J6 `) U( K, i
VDD:接5V电源
' p: @& f$ @4 ~/ [VE:为对比电压,用于调整液晶屏显示对比度,6 @$ R) m1 X9 S. ]& e1 E+ P+ y
RS:数据/命令选择端口,高电平代表数据位传输的是数据,低电平相反' B5 q) s$ n% h" e# C5 \* u& j
RW:读/写选择端口,高电平代表数据位用于外部读取RAM数据,低电平则相反: a( e& K6 ^" _5 F8 W
E:使能端口,低电平有效
4 A& q4 S! ^* u4 c5 oD0~D7: 数据位7 i; V( [1 J6 B1 O" V# m% h
A:背光板正极
% a. e0 d" W" M5 x" j' P# n+ CK:背光板负极- T/ N9 B: B% h7 ]; P! }
可以看到,在使能端口可用时,主要是靠RS、RW两个端口相互配合,以完成模块的初始化配置(命令/写入)以及字符显示(数据/写入)。
2 A% e) ~8 G$ U* B @5 l* W" r1 ]首先,我们会向LCD1602中依次写入如下命令来进行配置(RS、RW都为低电平)。, N! \4 O, ~9 w3 }
! {9 R" i. j8 m2、LCD1602常用控制命令2 m" m7 l/ N O
设置模式 : 0x38
4 l: X9 e9 q( S- w开显示,不显示光标,光标不闪烁 :0x0C& g; r% ^. s5 v4 e! O7 g/ Y
读写字符后地址加一,屏显不移动 :0x06
+ K, g! u# W, l; r7 s7 j清屏,数据指针清零: 0x01- U. W0 r( h- m
设置数据地址指针初始值:0x802 M2 l# Q! f9 \
配置完成后,就可以将RS转换为数据模式,向8位数据端口输入ASCII码值,在屏幕上逐个逐行显示不同字符。
$ t- G- ^! L0 u1 c接下来,我们将会从项目创建开始,教给大家如何将项目构建的清晰明了。
& U" S* y6 o& n" `+ F/ d
% P. L" X$ Z8 ?) y. ^+ z: }/ M( j7 \二、一种规整的项目排布方式+项目代码6 k# l$ ^* q9 P0 @' C4 \+ `
首先,我们新建一个文件夹用于存放项目文件,并在其中新建Doc、User与Project文件夹,分别存放项目说明文件、代码文件以及KEIL项目文件。
+ h! y3 W% m0 _6 H9 j7 F& x打开User文件夹,创建main.c、LCD1062.c与LCD1602.h文件。
' ?& T. S# ^' i/ Amain.c文件内存放的自然是主函数;
8 [# A$ {& d. D- E& m4 ELCD1602.c放的是定义好的LCD命令、数据读写函数,读者也可以自行将字符重定义函数放在里面;
* V8 U5 K* G2 [1 c% C. q% O7 MLCD1602.h则是函数声明以及#define。
$ m9 U6 E: N% \1 S& |2 l项目构建完成后,Keil中排布如图所示
" v5 n, e0 g, d4 C1 u5 k
* J9 q! x* v; [1 w
1、LCD1602.h文件代码: p: [0 X2 x! ?0 {4 e( d
#ifndef __LCD1602_H2 f& F7 V' d: c- E
#define __LCD1602_H
& Y6 \' @4 R0 E1 o$ T, ~( \$ d0 S+ B! i1 f5 q3 N
#define LCDData P0+ q! t8 p& h; B7 }' H
#define uchar unsigned char$ i# L) i) Y' U: E. d
#define uint unsigned int/ G$ [2 W" Y$ V2 B2 h5 S v
#define register_addr 0x00; |9 D" W3 |3 z
#define device_addr 0x80
6 _6 V) k+ x6 n2 n0 A) Z" R4 C% l5 c$ S
void delay(uchar c);" b& S4 g! U4 h7 _" J* Q4 p
void LCDWriteCom(uchar i);
& m' |* ~! r6 v9 a) F- qvoid LCDWritEDAta(uchar i);
, L/ c+ x8 A+ r! m+ h: u2 Wvoid LCDClean();' _2 M) L) O1 }$ } {' I" {
void LCDInit();
7 P! l( K) a, ~( {/ L#endif /*__LCD1602_H*/8 `$ W" a3 S$ E1 k4 r
......
. \5 T& A' m) G+ e2 l3 J4 L( {# g" m/ O' ~( C4 ]( d( K
|
|