找回密码
 注册
关于网站域名变更的通知
查看: 428|回复: 3
打印 上一主题 下一主题

请问:为什么非要先执行printc,再执行prints???

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-11 10:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

该用户从未签到

2#
 楼主| 发表于 2019-4-11 10:52 | 只看该作者
去掉红色两句,编译结果是:8 R; d; W% X) |  |
Build target 'Target 1'4 r1 \' y" E" m9 L+ v3 f
compiling my1602mail.c...  m7 a  `0 n- ]! `6 x7 z
compiling LCD1602.C...+ M# o+ T# p+ D4 a
linking...
% J* B& F" o( r2 i- J, j: P% v  ^; p9 q*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS- d# P+ ~$ M6 [2 |0 {( e" N* u( `) B
    SEGMENT: ?PR?_LCD_PRINTC?LCD1602! v. I' g) {: Z8 U" Q/ W* n2 a
Program Size: data=12.0 xdata=0 code=230
# J% l1 V2 a1 ~9 p1 c" J1 I+ `creating hex file from "aaa"...
+ P- z- {: G' t( c1 b8 A"aaa" - 0 Error(s), 1 Warning(s).

点评

警告一般是可以忽略的,这个警告只是告诉你printc没有被调用; 编译器发现你设计了一个没有用到的函数printc,可以在LCD1602.C中将printc函数删除,就可以避免这个警告了;  详情 回复 发表于 2019-4-11 11:38

该用户从未签到

3#
发表于 2019-4-11 11:38 | 只看该作者
罗斯 发表于 2019-4-11 10:52% `6 j6 X9 Q0 _3 v  [
去掉红色两句,编译结果是:
. v. g! Q9 m! n: p! |' ~! X$ wBuild target 'Target 1'7 G& K( T" T* I7 O; Z1 k6 l5 b) F
compiling my1602mail.c...
" n# V1 k# r* D
警告一般是可以忽略的,这个警告只是告诉你printc没有被调用;* d0 ?' h4 d  s6 Q& F/ b& p4 |
编译器发现你设计了一个没有用到的函数printc,可以在LCD1602.C中将printc函数删除,就可以避免这个警告了;) [& L; x$ e* V9 D/ M; P- l

点评

确实存在多余函数princ未被调用,谢谢你  详情 回复 发表于 2019-4-11 14:30

该用户从未签到

4#
 楼主| 发表于 2019-4-11 14:31 | 只看该作者
确实存在多余函数princ未被调用,谢谢你
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-3 19:55 , Processed in 0.094727 second(s), 28 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表