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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 罗斯 于 2019-4-11 14:33 编辑
' m0 p8 B' ~+ l7 ^! X2 W# F
1 O4 B/ m/ R; a  y& D为什么非要先执行printc,再执行prints???0 |2 i8 g, q( K  h
, c+ t6 D" r. z+ s$ ^/ v

- _& I1 S. z! Z+ T  S- {#include<reg51.h>+ ]+ U2 ?, c' J* m5 D
#include"LCD1602.h" , m( h, ~% b$ B6 L5 Z

7 ]6 `1 U4 t- L0 q1 O. R4 U. cvoid main(void)
1 k5 L2 }$ F2 {{
# C" r6 _6 I. c# sLCD_initial( );2 p$ R6 L7 }, \
LCD_set_position(0);
8 u' R6 c! @! VLCD_printc('a');               //如果删除红色字体的这两句,keil就无法编译成功
0 J, o) y3 i, X  u' D# b' P* @LCD_cls( );                    //为什么非要先执行printc,再执行prints???* R9 K# d9 G) G, B
LCD_prints("lele I love you!");  \- q) K$ a: R7 h/ H" C
LCD_set_position(0x40);6 e) ^' _. B; V0 {1 f
LCD_prints("lele I love you!");+ l# Y, t; Q6 R7 F: y! Q& ^$ m8 Q

4 g5 M, S/ Z0 X
. Z; O. C. p/ H/ }6 U4 hwhile(1)3 F: U- b( s7 l+ F0 o0 k* F( K
{
4 \& Z2 H& d, p9 Y}* N3 y0 W. y! D8 m! u" B
}
8 f1 g$ C; U* [以下是LCD1602.h+ t; L. A& D2 ^
4 H4 h0 U5 d4 m0 r
#ifndef __LCD_H__
3 J) M. {. g4 b6 _- u#define __LCD_H__! @  Z: j) E' M  t3 l+ a9 @) l
+ z5 M. T5 [% m& K& T" V
#define LCD_GO_HOME               0x02         //AC=0,光标、画面回HOME位
8 A5 s4 D# N) u( C6 D' }  `: T$ s3 f, J2 S4 o
//输入方式设置* k7 R/ K+ z) G6 p" ^
#define LCD_AC_AUTO_INCREMENT     0x06         //数据读、写操作后,AC自动增一' S7 t& o1 ?2 p, P3 C) x/ z
#define LCD_AC_AUTO_DECREASE      0x04         //数据读、写操作后,AC自动减一
: C3 T- M5 O+ ], N) D4 v# C#define LCD_MOVE_ENABLE           0x05         //数据读、写操作,画面平移: T5 O3 |1 }, T' i$ |& a! b# N1 |
#define LCD_MOVE_DISENABLE        0x04         //数据读、写操作,画面不动. f7 o  i2 y- K4 W" R
) }$ p2 H1 M: N! G; L0 ?7 H
//设置显示、光标及闪烁开、关' {7 g0 h+ _( w# R4 ^
#define LCD_DISPLAY_ON            0x0C         //显示开
7 K! l& H& X0 N- _4 P#define LCD_DISPLAY_OFF           0x08         //显示关8 T; p( l( B5 t1 J) f9 Q( g
#define LCD_CURSOR_ON             0x0A         //光标显示
# ~- K' G) ^+ Q0 c6 R+ R. j#define LCD_CURSOR_OFF            0x08         //光标不显示- z6 s2 ]. k$ N" w7 X" C+ A# J
#define LCD_CURSOR_BLINK_ON       0x09         //光标闪烁/ N$ I' x- I7 z6 E, B! U  `
#define LCD_CURSOR_BLINK_OFF      0x08         //光标不闪烁* c0 |/ C# u3 Z, q1 f9 c

$ C: [. O# s& `0 Y% O//光标、画面移动,不影响DDRAM
) r0 {1 b2 I1 H' b' v#define LCD_LEFT_MOVE             0x18         //LCD显示左移一位
9 L+ w# _' R1 P#define LCD_RIGHT_MOVE            0x1C         //LCD显示右移一位3 }5 }3 N1 I, u; T; z
#define LCD_CURSOR_LEFT_MOVE      0x10         //光标左移一位
1 n& u/ F/ m3 ]' f4 n#define LCD_CURSOR_RIGHT_MOVE     0x14         //光标右移一位
0 Z- `$ p- h9 ~; O* w3 S
6 {9 e$ ]8 o; W% G$ {) R/ V2 i" g//工作方式设置7 a8 h' r# Q* x- D3 r
#define LCD_DISPLAY_DOUBLE_LINE   0x38         //两行显示
: y7 h- A) P2 |. d( W8 R8 A* C#define LCD_DISPLAY_SINGLE_LINE   0x30         //单行显示
. [0 R3 o6 Z7 M' f, |void LCD_cls(void);5 z# O: |- b$ D
void LCD_write_data(unsigned char);9 c1 I" y; B0 G1 |+ [; g
void LCD_initial(void);- e8 k1 U7 y9 N5 t
void LCD_set_position(unsigned char);$ L& G: s: Y1 v+ G, F
void LCD_prints(unsigned char *);
: C' A! W$ Z! [  `: M8 |void LCD_printc(unsigned char);
; a  y$ s0 K! U6 Q0 U# O$ L- ~5 |0 A% L: Y; n* M9 g$ E
#endif2 `  }/ Y& v: D# l# `" s  ]5 v, K
" s. [& Z- V1 z, O! P6 n

' }8 r) G; d9 E0 [+ O$ h. v1 W这里以下是lcd1602.c程序
- }. _: F# M, f% A, h1 B0 Z3 Q#include "hardware.h"3 m' [6 R, N6 R4 s& w
#include "lcd1602.h"4 [. g. m/ o8 e

$ _+ i/ x- I) H4 B9 }5 Y, ~0 \void LCD_check_busy(void)   //检测LCD状态,看它是不是还在忙呢
6 B* n( j! \6 |' ?) q  s9 e( v{
- e2 @1 ]9 v; [$ `while(1)$ {5 x3 f' C; e: u, W
  {
: n: `" W; e1 V' y/ s" y9 G" g   LCD_EN=0;            
2 u7 O' H* e( p( X' [" W   LCD_RS=0;              
. c) y8 F& @7 J$ W+ g6 g   LCD_RW=1;            
8 E$ s6 K; H$ G   LCD_DATA=0xff;      
# j: Z0 I5 t9 P& c' @7 K   LCD_EN=1;              
1 S$ |* C) }6 B/ r) L6 q* _$ Q0 A   if(!LCD_BUSY)break;   
) F$ E. J) M( U5 E; u& B" m  }" j! r9 M0 B, Y( q( w
LCD_EN=0;               
' O6 D) e( e+ d) `% M6 Y# \! K}: [$ g( D) ^/ h, d9 Y, M. F6 W
5 I9 I0 i1 c7 j; s0 p
void LCD_cls(void)          //LCD清屏/ D. Z4 Z) {$ P: \6 ~
{7 l" _2 D" l+ m5 p' N$ [* q. [

  Q' D0 O% a7 Q7 t0 [LCD_check_busy();          8 q6 D: P# S) b* s  J- I
LCD_RS=0;               ' j. A7 }& R' f1 |: o9 O$ j
LCD_RW=0;            
2 C: c; n' @' lLCD_DATA=1;               
5 n1 F# f# K0 Q4 a& R  K2 M5 eLCD_EN=1;                  
4 L! b* P- H) [( N$ I- ?- b- {LCD_EN=0;            
6 N! ^+ S& A8 e; Z. o
3 E0 o! G1 |- R2 u0 X% a8 ?+ {! `& _}
- H% f/ x+ ^, \% ?$ p) k" }! v+ |% {- O. t6 i3 h0 S5 }
void LCD_write_instruction(unsigned char LCD_instruction)   //写指令到LCD
6 Z9 ?, s# R9 E+ c; e{
, a8 b# M/ u/ Z0 A$ O" w2 pLCD_check_busy();         p' h! o# `) D3 H; E$ d
LCD_RS=0;               2 u. B7 R: g. _7 D5 J( V& P
LCD_RW=0;                5 l+ R, F2 J& ^5 w9 F  M% s, _6 O
: U% j, W8 c8 B+ v7 r1 V) a
LCD_DATA=LCD_instruction;
6 a# S2 U6 i( j# `- P* E3 u+ j7 ?LCD_EN=1;                 
* `5 m5 r( G7 j' h6 o6 Q9 ?& pLCD_EN=0;                 8 o! x( Q2 }% f  u! t
}3 u4 Z0 I' ^; Z8 z

% @( [3 P' r" A" h6 h5 Tvoid LCD_write_data(unsigned char LCD_data)      //输出一个字节数据到LCD7 @: N+ p, e+ W; H( G3 I4 y
{* Z" n" [8 A4 p: `; w4 f
LCD_check_busy();        
+ j' C# k  _( q( _) ILCD_RS=1;                  
: A& E4 O& P3 V0 FLCD_RW=0;                  - q+ m$ @) W$ g- f. |9 M9 |
LCD_DATA=LCD_data;        u$ y" @4 p  D' {
LCD_EN=1;               
" c9 d5 I# K5 ]LCD_EN=0;                  1 `8 P* u$ [1 E1 ^1 Q7 e, x9 O
}$ P( k/ U  P4 v* I+ A* C' }0 s2 E

. Y! ?) T& K$ A5 ?6 k) n7 k) Evoid LCD_set_position(unsigned char x)            //LCD光标定位到x处2 l- o+ R$ f. Y0 D; O8 g0 h
{7 b9 T1 G' S: |/ w8 ]
LCD_write_instruction(0x80+x);
6 q" c2 ~+ X( [. ^& ~  V8 _/ r! f/ N4 B}
/ @; X3 f( L% z$ H3 E" b5 a2 B' _) f" q. Z' b
/*
8 G6 J4 C0 g7 b( d" F5 s, H% y1 |void LCD_go_home(void)                         //LCD光标归位
; _% T3 q4 W8 H, H$ h" @{
1 K. d: i+ e  `, M. A; i& Z) N3 p( fLCD_write_instruction(LCD_GO_HOME);          4 }% l& @! p1 P6 R* w
}
! Y2 A" g2 H+ Q5 E8 K/ P6 f. U*/
, y. V* N2 M5 z, y. ]* X+ b3 J% @6 ]& g$ \
void LCD_printc(unsigned char lcd_data)          //输出一个字符到LCD
' R2 q8 h1 y- c' z  Z{& A  }) s$ p+ c! W6 [
LCD_write_data(lcd_data);
- [3 y, B. ^6 k/ d( p: o; L9 _}
- y! @+ K) b+ z3 o1 N$ q. [
2 F! G+ Y, z! t1 H- p7 c2 @void LCD_prints(unsigned char *lcd_string)       //输出一个字符串到LCD7 m' k) W- V3 ~8 a. N/ t" z' O7 \, f$ [# `
{% J. _$ B7 M* j
unsigned char i=0;                           9 N+ o0 t4 I  F& c
while(lcd_string!=0x00)                     
& a" ~% X1 }& ^9 c  {7 D; _' Q% g  q2 I4 n
   LCD_write_data(lcd_string);
) j# F7 l6 T7 l( ~# P# J& x! D   i++;
, W( j/ G) j5 T* x+ s; l  }
# D0 r& v& r' h" t8 O}
! N7 e2 o! ?: r3 i+ M
8 ?+ z$ r% O$ o9 Avoid LCD_initial(void)                        //初始化LCD
) {; @" n6 E% d, @" U; R# y# X: a{
, K6 n$ e4 A/ ?8 _LCD_write_instruction(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);   
- U+ u* k' H. Q% ^6 VLCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF);            
5 y4 C. M* d2 `6 O8 DLCD_write_instruction(LCD_DISPLAY_DOUBLE_LINE);                 ) D' b4 q9 m: u! Z; K& I
LCD_cls();% Q* z; j5 t6 C. L* ?
}
+ A0 e6 h3 F9 F6 Z
* E3 F7 K( C  `7 u9 [9 P

该用户从未签到

2#
 楼主| 发表于 2019-4-11 10:52 | 只看该作者
去掉红色两句,编译结果是:1 @3 Q# B0 o- \- e& y5 M
Build target 'Target 1'
* F- t% g2 u! d0 P& ?compiling my1602mail.c..., t9 i) O7 ?: A8 ^% b
compiling LCD1602.C...
' r, j: F$ D1 R8 x; W) U" [- Blinking...8 s9 S( ]$ v# N9 B( [* e0 e
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS# Q* m1 t( d+ {# b7 Y
    SEGMENT: ?PR?_LCD_PRINTC?LCD1602* y/ ?: l! x, I( _6 q
Program Size: data=12.0 xdata=0 code=2304 m3 f2 B# h: G+ `/ {% L
creating hex file from "aaa"...2 a- j' r% s7 k& o7 W+ I
"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
7 G7 N5 b5 _0 B- _7 s. G去掉红色两句,编译结果是:
0 M3 {# a/ |. i8 n/ j9 z7 YBuild target 'Target 1'* f4 L( r! Z4 {+ }: k0 X; I5 r
compiling my1602mail.c...
5 ]5 w+ I6 e- A! m+ d2 O) h
警告一般是可以忽略的,这个警告只是告诉你printc没有被调用;3 _3 ^! h7 q7 V$ V. s* P7 R9 B
编译器发现你设计了一个没有用到的函数printc,可以在LCD1602.C中将printc函数删除,就可以避免这个警告了;
8 _: e5 L- A' b

点评

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-11 08:52 , Processed in 0.140625 second(s), 28 queries , Gzip On.

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

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

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