EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 罗斯 于 2019-4-11 14:33 编辑 ; p& T _: Q4 n
0 T- H) E5 |5 x为什么非要先执行printc,再执行prints???
/ H, I- L- s; Y0 n3 b- G& y5 G& ^; G. {, G6 v8 w
- }2 r2 {) y6 r( F( L& A. K#include<reg51.h>
- \% T8 r T+ c#include"LCD1602.h" 3 v; \7 r" x6 b. t4 z2 C& e
4 q; H! p* w& W; @) }- ?void main(void)
& u7 y: ?) q+ G3 x5 \{
$ e- c& t! B# j! tLCD_initial( );
) {3 S/ C; f" v& C4 ALCD_set_position(0);6 b$ \5 V5 Y+ k5 ^2 g4 s
LCD_printc('a'); //如果删除红色字体的这两句,keil就无法编译成功
) G- X y0 i+ _$ C5 v7 GLCD_cls( ); //为什么非要先执行printc,再执行prints???5 H' J- q8 U- |0 w O
LCD_prints("lele I love you!"); ^ g. t$ x7 o% K" j! H
LCD_set_position(0x40);# i a; f, _4 W _
LCD_prints("lele I love you!");
2 H+ h. W. z% f# @& `2 a+ z
Y3 R4 N) }$ `- [3 n
4 |8 a, ]9 o) m! f" j- a! E$ Iwhile(1)
3 k1 ^! x ?) M( ]: Q{
: N& v' }, r0 T q+ p( v}( y3 t1 K1 P) v8 v$ q2 y
}+ F6 j7 n, K9 S ^# }5 y
以下是LCD1602.h
; e3 l9 J8 j: A, |- h) N6 m5 n7 I
#ifndef __LCD_H__; @# L9 ]- g/ p7 t
#define __LCD_H__
4 w- R, p) j+ z9 I' c8 k. J7 f6 Q: `* H
#define LCD_GO_HOME 0x02 //AC=0,光标、画面回HOME位% d% q8 y3 w1 o: l# E6 k
) C# Y( c; r$ l6 _- O6 O. w6 p//输入方式设置/ r, W( c+ S3 s: |. M, {( {
#define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一9 i$ D3 R% X4 L4 v' o
#define LCD_AC_AUTO_DECREASE 0x04 //数据读、写操作后,AC自动减一5 U$ o* G/ s" a8 H# v5 w
#define LCD_MOVE_ENABLE 0x05 //数据读、写操作,画面平移
6 N& ~. k: @5 D7 d! F" p#define LCD_MOVE_DISENABLE 0x04 //数据读、写操作,画面不动- Y* f% G+ n0 \) X6 P( W( \
1 u( B' G# X* S. J1 H//设置显示、光标及闪烁开、关: }- u* J/ _/ b7 ~, s
#define LCD_DISPLAY_ON 0x0C //显示开* L$ f' N+ R# x/ V) n3 _7 X* C
#define LCD_DISPLAY_OFF 0x08 //显示关
& A" C9 A2 l2 G6 m/ B& T# d#define LCD_CURSOR_ON 0x0A //光标显示
: q7 ^( N: s: n2 T#define LCD_CURSOR_OFF 0x08 //光标不显示( o6 ^0 j; ]" @8 L
#define LCD_CURSOR_BLINK_ON 0x09 //光标闪烁
' E, {% L$ O7 D( S6 x0 L- ~#define LCD_CURSOR_BLINK_OFF 0x08 //光标不闪烁# i0 x' B3 H% G! y. v6 n" p# {0 c
/ N6 n5 Y. @5 d1 K/ M* ^- O//光标、画面移动,不影响DDRAM
% n5 F' [- b* }7 c: r#define LCD_LEFT_MOVE 0x18 //LCD显示左移一位
( q6 |: B+ g1 q$ F#define LCD_RIGHT_MOVE 0x1C //LCD显示右移一位
5 g5 z. p! A2 K#define LCD_CURSOR_LEFT_MOVE 0x10 //光标左移一位1 T2 S6 d9 L5 P+ i% l3 |. q4 N' w
#define LCD_CURSOR_RIGHT_MOVE 0x14 //光标右移一位 {& W" X8 G+ ?: C5 D" Z+ [
6 I! x1 }, X" l) q/ \
//工作方式设置
& b' n0 q" c w: d& Q$ t#define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示# H1 }* _; q. N7 {( ~# D) Z* n
#define LCD_DISPLAY_SINGLE_LINE 0x30 //单行显示8 G1 u U% C$ h9 W, A+ X; `% S: n
void LCD_cls(void);: n+ m/ M1 s8 `1 Q% x, t: L
void LCD_write_data(unsigned char);
4 C7 l6 w- X; L0 A* R& F2 Gvoid LCD_initial(void);3 _+ T2 y' S' u# U- o
void LCD_set_position(unsigned char);
' e6 W& Q- N7 {void LCD_prints(unsigned char *);: Q/ U' j; t7 t3 G j [, x
void LCD_printc(unsigned char);
0 q7 Y9 Z* E) }. N! F+ G
4 h% x% v8 i7 Y2 o& l2 `#endif
/ _" t' S5 z7 h. |+ f3 r+ q% z
: f" a$ d ]! ^5 c% w# i5 M( w; Z8 Y2 m9 [7 B. s+ v' V
这里以下是lcd1602.c程序+ d* `9 Z# r8 {) ^, ]( y
#include "hardware.h"
4 d0 F" J! @5 u#include "lcd1602.h"3 v5 _9 L! P6 k. H% ?* r& i5 x
, ^7 p7 b* h. ^& z9 Y! r0 Ivoid LCD_check_busy(void) //检测LCD状态,看它是不是还在忙呢
4 k' R1 r) Y6 Z( r% p6 h- D, D. }{
$ Q1 ]3 { ^: E2 Cwhile(1)
/ ~$ M/ j' }, K. g2 @3 ]9 } {1 t, A( t. g9 \4 v# e& N5 y
LCD_EN=0;
0 p A, x4 k9 e/ w3 q LCD_RS=0; # v W- Q, H+ F$ Z3 _6 B
LCD_RW=1; ( R1 M# W/ U2 p0 }; `
LCD_DATA=0xff;
+ W l" s% F- g, K. I LCD_EN=1; 6 V4 j+ Z* J& Q( E5 j
if(!LCD_BUSY)break;
1 k0 F9 P' R- S5 g$ p, m# S2 \ }
1 y( P1 ^; d' D) JLCD_EN=0;
0 ^, \* F' r Y}4 k3 ]2 @4 z" S
& y" [5 p- ~* r" j
void LCD_cls(void) //LCD清屏! \" ^+ u/ ^, a
{( _5 K; P! H; v' i7 ^
3 n7 b+ @8 l2 d! uLCD_check_busy();
( A0 L6 b) D" N1 wLCD_RS=0; ' T' l9 X) S9 r, L0 @; P
LCD_RW=0; ! F/ K! n. w6 k% ?
LCD_DATA=1; * Z. d- ?6 B, T9 ]' F; I( H2 b
LCD_EN=1; ! ^; y* c6 u2 @% R9 N) q
LCD_EN=0;
1 I% j! n- y; @* E. k; M& i% X: i& i- H+ {* W7 p
}
; `; r' W/ Y+ b1 m" ?7 n
+ b! R; I1 V6 P0 {void LCD_write_instruction(unsigned char LCD_instruction) //写指令到LCD
y9 P) O9 ~5 `6 t$ }! ]{6 x& c" t4 `3 V9 r3 \; A7 k
LCD_check_busy(); ! [$ b) T" y- n! g( _
LCD_RS=0; 2 M+ S# ?, e. {. c3 l8 X
LCD_RW=0; 3 V$ A0 E, b: ^& H" n7 L5 d
& E' E: \7 m) w( F) cLCD_DATA=LCD_instruction;
% i" x: o8 X5 e8 z: \- A: l8 H, q8 gLCD_EN=1; - |" S/ @! q, H* {" n, M
LCD_EN=0; 2 s0 ~0 i! `0 u/ Z2 c& z* y
}" x: M& X& g# f9 o* J
' ?6 u3 n% Z0 D6 m n) l
void LCD_write_data(unsigned char LCD_data) //输出一个字节数据到LCD
. W: I7 ?+ |' H{5 R" G1 T( M# j& T* t/ O! G
LCD_check_busy(); 1 U& R/ t* B. G) M
LCD_RS=1; 1 A, }8 l9 |/ K) Q
LCD_RW=0; % \* u" B5 O N; ]* C1 A2 e, D
LCD_DATA=LCD_data; B: ^- y) N2 {1 i- E
LCD_EN=1; ! J+ W& W3 j" Z& k. X$ T
LCD_EN=0; ) f; s' a @% J# a7 S4 d0 v
}$ F8 e# r% y4 {) z% ~/ {" n0 D% Q
! H) l9 [& a+ i6 b
void LCD_set_position(unsigned char x) //LCD光标定位到x处
! Z4 e% g# ]0 j* H{$ d/ i( Q7 v4 G P
LCD_write_instruction(0x80+x);
* X* @' \" B& e. u0 \! g}
; R* r2 U3 \% f5 V; P5 |. N7 b$ { f4 t
/*% e" J, Z( F. }
void LCD_go_home(void) //LCD光标归位
; B" x4 b, p+ s. }{
" ^! n3 Q4 I' PLCD_write_instruction(LCD_GO_HOME); , L. c" v. x6 o, j
}
- T! F- {4 \. g& o8 t6 @*/
3 R1 v* Y( d+ v( ~$ D( I4 p
; X" Z T' _! |7 G7 pvoid LCD_printc(unsigned char lcd_data) //输出一个字符到LCD7 L* G2 R* |$ D" n4 \; K6 ^8 x
{0 V2 e$ k' @6 e
LCD_write_data(lcd_data);
0 A+ U; E0 ]# [5 n" a/ r6 y2 Y}4 w! P" b) ~+ l7 f
5 L* Y2 m/ W/ }* T% X& B# r% T) S
void LCD_prints(unsigned char *lcd_string) //输出一个字符串到LCD
Y$ Z( m9 W* C. V# J- h{ t+ _ I) x: n
unsigned char i=0;
, X9 ?( W+ O9 J! xwhile(lcd_string!=0x00) w2 d& B4 ~& X9 a% ?; m( I* p
{$ J6 D9 a: V. i
LCD_write_data(lcd_string);3 o5 A& r5 ?; |; [2 g
i++;
- g, B. R x- O3 P; f+ n3 w5 I } # ^/ s8 l, n9 z4 f. M; p5 P
}# ?+ e) `3 @4 A* B+ E* a
% _5 E& ?# ~$ g- x# j
void LCD_initial(void) //初始化LCD
9 K# i0 h: P$ d+ k3 V7 o" {; v{
) v# V8 Q i+ f' ~. w- }LCD_write_instruction(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
$ x% B( D& x% W; @5 }* k7 qLCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF); ( w" I& q1 ]; t3 F2 W r9 k' g
LCD_write_instruction(LCD_DISPLAY_DOUBLE_LINE); ; G% r# Q6 L! v4 b9 b
LCD_cls();1 Y* S- v, ~5 p: v; F3 w% l f
}# S k/ M% T6 M& x* h
' U/ Q. ~( E2 \8 w' H, ~ |