EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 罗斯 于 2019-4-11 14:33 编辑
6 \; h9 V! k* z# y* }( Z
: V; b. J* B1 H+ J为什么非要先执行printc,再执行prints???: ?: O3 o/ n! Q3 x: V
5 S" j( P; B! R- y; b7 M, i# K
( f! `; c* W; F8 f#include<reg51.h>( ]3 F+ s2 i; Z" u+ Y8 N
#include"LCD1602.h" 6 H: X& U/ ^# M/ X+ V, j: a
3 @1 K3 O, {7 z R+ C
void main(void)
& }8 e. Z7 f/ q2 Z6 L4 ~ I{
0 k2 H; d- V$ M! z0 D/ X, rLCD_initial( );
1 I7 R9 \$ W3 j) O* PLCD_set_position(0);
' ^* q5 V0 o; ]3 p5 hLCD_printc('a'); //如果删除红色字体的这两句,keil就无法编译成功
2 N/ H+ x% @- rLCD_cls( ); //为什么非要先执行printc,再执行prints???7 W8 m4 g# V/ P: O$ F% K" b
LCD_prints("lele I love you!");
4 J9 R z: @- k5 l) U+ j, iLCD_set_position(0x40);
3 J! k- j) v. T/ @5 OLCD_prints("lele I love you!");0 V0 Z. Y5 G8 B2 m- `* a0 p' v
2 U- Q- w0 I3 a9 @+ ^- J' i4 z; V+ s1 c( b T2 U
while(1)3 l, |% k; ~2 W2 @* b% h# \
{
7 l4 m- ~' x* d4 w% O}# w- ~7 b0 p1 P# V
} k& P/ q' }7 n& A* w+ Y+ K
以下是LCD1602.h7 _# S4 ~0 s$ q# C: g+ ~4 S) Y
5 n- Q$ {$ K( E0 @2 y( K#ifndef __LCD_H__
! B* x& r# [6 G4 a#define __LCD_H__6 ]3 ]# Z5 r6 l& w0 H) O9 J \
7 P- K$ l/ X& i+ ?) k& n3 m
#define LCD_GO_HOME 0x02 //AC=0,光标、画面回HOME位
8 v) d1 M/ [+ d/ g* ^& J" U) X: d, }6 D8 R
//输入方式设置
* U, a( i# G; t% }* O9 T#define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一' O% L2 F+ J! u
#define LCD_AC_AUTO_DECREASE 0x04 //数据读、写操作后,AC自动减一
0 Z6 F6 J: J# k#define LCD_MOVE_ENABLE 0x05 //数据读、写操作,画面平移
9 S, }# Z b: S1 ^: v0 |: K#define LCD_MOVE_DISENABLE 0x04 //数据读、写操作,画面不动
7 T6 X3 K' ?& W) h9 Q- p2 T' c8 ?* I8 Z6 S% g
//设置显示、光标及闪烁开、关9 C* |# `( Y3 p& [9 J7 M; v6 K) \
#define LCD_DISPLAY_ON 0x0C //显示开
6 s& h* w- U" ^0 M# {* h# `#define LCD_DISPLAY_OFF 0x08 //显示关
: G7 d V( B2 s& P2 i) n#define LCD_CURSOR_ON 0x0A //光标显示
- Y* N, L# Q# }3 f$ L#define LCD_CURSOR_OFF 0x08 //光标不显示
6 D! `) w" a: b6 x- A#define LCD_CURSOR_BLINK_ON 0x09 //光标闪烁9 H4 _9 m* m: {9 U/ C
#define LCD_CURSOR_BLINK_OFF 0x08 //光标不闪烁
" K' o; t3 l8 @9 Y( c. _: u* T/ e: c
//光标、画面移动,不影响DDRAM- k* c& p( Z, `. [
#define LCD_LEFT_MOVE 0x18 //LCD显示左移一位
8 M r. j7 G3 H3 N2 R: y#define LCD_RIGHT_MOVE 0x1C //LCD显示右移一位/ v8 v: I0 `2 e I: u; E
#define LCD_CURSOR_LEFT_MOVE 0x10 //光标左移一位
$ ]2 g0 d1 X- t+ M#define LCD_CURSOR_RIGHT_MOVE 0x14 //光标右移一位
* X# C7 v+ P0 }/ [) ^
9 k% @3 a) k9 ~* F$ R, s; Y//工作方式设置( `6 P. ]+ z. o0 q5 R1 R T- y$ C
#define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示. ?/ Y+ G* R; Q# S% ]
#define LCD_DISPLAY_SINGLE_LINE 0x30 //单行显示
9 J& z4 `3 x, g' ~* C6 ^: svoid LCD_cls(void);0 A2 D1 s4 {' q: C
void LCD_write_data(unsigned char);
$ v9 Y5 L* j4 Zvoid LCD_initial(void);$ ^' Y8 t, A# G4 q
void LCD_set_position(unsigned char);+ H! ?- Q' }) l& I1 P+ m- J8 y
void LCD_prints(unsigned char *);' s2 L: W1 v( P3 N
void LCD_printc(unsigned char);
9 X p+ u g! q! g9 y2 B% z1 T) {- S: H( H4 _% d
#endif. w7 ?9 ]$ a7 \
/ _& D6 }9 M. P) f" j* j: Z4 p% P1 ]9 \8 @- d2 h5 F+ `7 }3 |
这里以下是lcd1602.c程序7 y! x+ H; i3 m9 p* S( y
#include "hardware.h"
/ `' r+ y8 ?. A; A#include "lcd1602.h"
5 F( r3 w6 d& @
# ` o$ Q8 R' Uvoid LCD_check_busy(void) //检测LCD状态,看它是不是还在忙呢6 G/ Y c; J: r) |+ `( k
{
" U' |3 Z$ \! U8 {while(1)
1 J. ?- z* y: A) w, m- _ {$ l2 Z; m! `8 K0 g' x: o$ Q8 f8 U
LCD_EN=0; / P$ W4 I0 ?( T0 }
LCD_RS=0;
3 s( o5 }$ \4 T9 q# V: V& n! g1 _5 ~ LCD_RW=1;
- p. N; @5 X' z) _, v4 e7 Y LCD_DATA=0xff; 6 C/ }# ~8 [& i8 |0 f9 r% k/ q6 g% o
LCD_EN=1; , M4 w+ X- Z( J* y; s4 N) `5 a
if(!LCD_BUSY)break; ; v! [- b2 H7 h3 p
}% ~; E: ~0 o3 C7 P4 \
LCD_EN=0; $ x6 k3 b8 b8 e% h- x6 u0 M
}6 E# v3 S; n9 u4 u9 d. V' A6 X# f& t
' S8 p3 K% s, D2 C
void LCD_cls(void) //LCD清屏& E: L9 E8 q5 g$ b- w/ G
{7 s/ Y; ~, @& A1 @4 x. r( a$ @
* n7 U3 ]* Q4 W$ j
LCD_check_busy(); 3 W9 Q3 U! e4 f! v0 W/ J! [
LCD_RS=0; # y+ h# M. m7 S$ K2 j% F
LCD_RW=0; 0 B9 c5 k) `2 g: y# {
LCD_DATA=1; # G" w5 I5 u( H x) w
LCD_EN=1; # N% S2 K' f9 X# [; ]8 m" {
LCD_EN=0; 3 T: t- f' D/ ~5 D1 M
1 C9 N* J l1 D% d- y
}# R! [5 k7 F9 j% q8 t: @4 B( ]
! K% M* h3 }* K) w. a
void LCD_write_instruction(unsigned char LCD_instruction) //写指令到LCD& Y. D4 b& m2 u Q& z: W( G
{9 @8 Q3 C. n. n5 u$ m6 D' B
LCD_check_busy();
( m! I9 f* n9 I/ ]( s6 f xLCD_RS=0;
+ U: o" V- T. X p2 p9 c6 cLCD_RW=0; 6 S; I) }) T* L- ^) U/ G
1 b, A; J9 L! g4 j- e9 q8 r
LCD_DATA=LCD_instruction;
- f; U/ k+ e# H( uLCD_EN=1; 7 E$ |2 G- b9 V+ `
LCD_EN=0; + B. H% `6 I$ i8 }/ \ G
}
9 Y* B7 P; q6 \( o9 k& g. E1 a5 V4 w' D3 H, @' B- Z; F0 Q0 f% z" k
void LCD_write_data(unsigned char LCD_data) //输出一个字节数据到LCD
; {5 F4 m" p/ Z& L{2 i, J& f3 A. \, r9 ]/ ^6 ^6 C
LCD_check_busy();
4 ?- N2 t4 {- c1 E9 gLCD_RS=1; ( ^: L9 ]1 a) {; b+ ^# K
LCD_RW=0; / t b* ?4 K% x2 p: @: u- @5 H" O0 w% \
LCD_DATA=LCD_data; : }' M! P$ s' r4 |
LCD_EN=1;
' Z% T' q) K' C. ALCD_EN=0; : l0 F1 s0 J2 \, u/ T3 w! n
}7 B0 I+ b# m3 U
5 C9 v9 L' `" P! q# K/ N9 Zvoid LCD_set_position(unsigned char x) //LCD光标定位到x处
2 d# H8 b+ O; R9 `! ^7 \{, u0 S# J8 B8 [: M; x2 j
LCD_write_instruction(0x80+x); Q3 d9 G" t& G, y2 c3 L" b* J
}" p) q; b: W. d0 b8 p; L
1 F( V- }/ `$ O3 R, {. L/*
. `, D0 p( p% Yvoid LCD_go_home(void) //LCD光标归位* v+ L1 M' M, V* l0 a8 f
{6 N- R* r- F5 O$ Y* A. [
LCD_write_instruction(LCD_GO_HOME);
6 ~4 _( @% ]6 a! Y}" j! A6 P: `% I3 O: p
*/
0 C$ v% o X; Y. D& q3 S R2 I' V3 M* S
void LCD_printc(unsigned char lcd_data) //输出一个字符到LCD
3 Q/ \& \7 _# V J) h' a9 K{
+ C8 G8 [6 m$ B; F% V7 rLCD_write_data(lcd_data);
8 d- b3 e8 T; V' M1 I- ?4 g. h; L( S}
! V4 r, F% ]# T! k$ P9 o5 R' ]* @5 K- p3 O7 Q" A8 `, \7 j
void LCD_prints(unsigned char *lcd_string) //输出一个字符串到LCD4 Z" P9 f* ^7 a8 o
{6 X& F6 k# ?7 j" y
unsigned char i=0; / t8 j' _1 e# Q+ o
while(lcd_string!=0x00) 3 l( A. ]" @$ d
{
3 F, E# N" E4 |& l! K% X* i6 B LCD_write_data(lcd_string);
' q) x Z" @1 p/ R) B5 E% K* \$ Y i++;
; S& c, e+ |8 e8 t; t/ G }
# M/ T& t6 @1 c4 ^}! d8 s6 r! u+ [! j% Q: }
4 Q6 H" d8 P/ i' T$ n$ W
void LCD_initial(void) //初始化LCD
3 I; N' V, v! W9 N! ~% J{
, J6 M1 K8 W8 f) T$ dLCD_write_instruction(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
5 \+ f9 P: z1 @2 b1 I7 H& L" m5 aLCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF); , U6 U8 W6 u/ e- G
LCD_write_instruction(LCD_DISPLAY_DOUBLE_LINE); ! ?& j7 z4 v; |8 k; E/ [9 `
LCD_cls();$ E" K! P$ J( z2 w
}5 ^4 p9 t! }2 M
) \1 L& R- w" h& ^4 q r |