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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 罗斯 于 2019-4-11 14:33 编辑
/ V: j; o$ h- g4 z& F# J' a8 j, l6 c7 r: i2 ]4 M) A9 j1 |! A/ f1 o9 \
为什么非要先执行printc,再执行prints???, b) p/ q* G8 }; D5 L+ s3 O( e+ o1 J* t4 T
1 x7 Y- g/ X  L, i$ g
/ q% Y; b) {6 G! {  ^5 D
#include<reg51.h>
% Y3 s  [& \! U% e  P. A, N#include"LCD1602.h" 5 a" M, U. r1 D$ h1 P' a

) C. C0 x, r) Y! bvoid main(void)- V6 I: `5 h, t; w: E3 @
{- o2 S, c  R, n$ X# s. V
LCD_initial( );2 g6 E6 S8 a6 h; w
LCD_set_position(0);0 a4 S  e; D  ^# b) V; G
LCD_printc('a');               //如果删除红色字体的这两句,keil就无法编译成功
, d1 e6 |% k, H. c7 w5 J4 SLCD_cls( );                    //为什么非要先执行printc,再执行prints???: W$ M) n. L$ O. I3 Z% l7 W
LCD_prints("lele I love you!");1 {5 V) T2 G- i  F( k
LCD_set_position(0x40);
2 z( k) r6 @0 n1 ?/ n# N( MLCD_prints("lele I love you!");
/ W2 L. }- r5 a! V; n8 }+ D  ]: {# `

7 \3 |2 L3 G1 K! Bwhile(1)! h8 ~2 b6 K% Z; {5 `  V6 t
{$ C2 U) N- i, i) ?. B5 _& C
}1 J5 m* e+ [% p, y' T* L9 K
}9 V, Y: r; V: x" \8 ^9 {
以下是LCD1602.h, ~$ B1 a  I2 z1 |3 h, f9 U
+ @& l+ u9 O+ c& z) k2 C* h+ A! M
#ifndef __LCD_H__
& p! R, z+ r7 F) j; Z9 ]/ K#define __LCD_H__* j, Z4 U, e5 W+ S9 i' `7 H

' G) z! N" H0 j+ ?+ v#define LCD_GO_HOME               0x02         //AC=0,光标、画面回HOME位
5 M: s  P4 H% c2 n' v
5 f" I+ Y% R# _# h0 ^+ Q& D" U//输入方式设置& ~% G0 n% a! C6 b+ h
#define LCD_AC_AUTO_INCREMENT     0x06         //数据读、写操作后,AC自动增一
! T4 M% T; w3 g9 T+ r& V#define LCD_AC_AUTO_DECREASE      0x04         //数据读、写操作后,AC自动减一
* \+ D8 i' I/ O% I+ t/ u/ @#define LCD_MOVE_ENABLE           0x05         //数据读、写操作,画面平移
* }2 Q; X4 X; Y: s0 z! p#define LCD_MOVE_DISENABLE        0x04         //数据读、写操作,画面不动* V8 V, A' U0 h$ x% {5 O
) T6 P# p3 j0 T5 ~1 ]' u
//设置显示、光标及闪烁开、关! u* h& s( [. ^* T2 H8 [, X( J
#define LCD_DISPLAY_ON            0x0C         //显示开
! Y! m/ R4 ?1 }4 M& A#define LCD_DISPLAY_OFF           0x08         //显示关
+ q5 S/ \: J& H) S/ P#define LCD_CURSOR_ON             0x0A         //光标显示
( J2 ]* S1 O& ^1 K! E, |#define LCD_CURSOR_OFF            0x08         //光标不显示" Y, @9 X+ ~# ]& R
#define LCD_CURSOR_BLINK_ON       0x09         //光标闪烁
: N7 \- V8 S. @4 a#define LCD_CURSOR_BLINK_OFF      0x08         //光标不闪烁, E5 g8 B( |' f2 ^* I

! |' \; m+ ]8 f6 z8 A% x1 Z, p( ~, q//光标、画面移动,不影响DDRAM6 R+ g1 p0 d7 N6 H! O% J5 B
#define LCD_LEFT_MOVE             0x18         //LCD显示左移一位  B- Z6 T7 c" V: p" V) o9 c9 x
#define LCD_RIGHT_MOVE            0x1C         //LCD显示右移一位% W; ]9 K  e' G+ {
#define LCD_CURSOR_LEFT_MOVE      0x10         //光标左移一位
' ]7 J$ ?& R; u9 z2 c5 t! \0 L; s& a( X#define LCD_CURSOR_RIGHT_MOVE     0x14         //光标右移一位
: c  ~& T  ]  E6 J- S" v) V0 w1 D0 m6 Z
//工作方式设置$ c0 p: W  Y, `% o
#define LCD_DISPLAY_DOUBLE_LINE   0x38         //两行显示- A! p5 l7 g* [# }/ b. C
#define LCD_DISPLAY_SINGLE_LINE   0x30         //单行显示
/ h& ?' \  n9 n0 ~4 i0 S3 Pvoid LCD_cls(void);
; c2 f9 Y2 V6 e6 V* o% w4 v- ovoid LCD_write_data(unsigned char);" P- F5 `# v0 D, u2 E. ]
void LCD_initial(void);8 l; q* ^% y& W& D# r1 q1 c
void LCD_set_position(unsigned char);
: w6 r! ~1 S9 ^, wvoid LCD_prints(unsigned char *);
% X( g2 h& ^8 e. _2 m% A; mvoid LCD_printc(unsigned char); $ p: g  R8 H$ m  [( V2 B

: R3 I6 G% m) s9 z2 C#endif( T9 S" }! n- Y: W& E, F/ d" f
- Z. ]( q4 s; {
2 q7 X8 S2 N* r- Z
这里以下是lcd1602.c程序! Q4 V& b0 d* N1 i+ c
#include "hardware.h"
2 m2 `% g) h% F5 T/ h8 u#include "lcd1602.h"* X" }* M. G4 k) f
& P( B4 r1 j( {4 C( h% c% e$ _1 P
void LCD_check_busy(void)   //检测LCD状态,看它是不是还在忙呢5 A  j8 o, i9 @" ^
{
6 g% \$ h; F1 m: O' O# g  Qwhile(1)
3 P6 \! F1 t  v6 Q+ D  {- ]9 l! I0 u# h# _$ v$ z
   LCD_EN=0;            
; Z* w5 ^" R$ [$ T0 ^2 `4 x" x, K   LCD_RS=0;              / I( D: r/ W1 B. x
   LCD_RW=1;             - G4 |# F) n) @& K" p0 h9 ^
   LCD_DATA=0xff;      
% W' f2 Q6 A3 x7 U* }( O" a   LCD_EN=1;              6 x( ~' [2 ~# C' n1 s* L2 D
   if(!LCD_BUSY)break;    / R, h! e) S6 a4 i4 ~$ Y, J
  }0 i8 I# R2 B0 v1 e/ P* }7 Z
LCD_EN=0;               
. I" ^, w: w; F6 Z0 [}
" ]9 I; t( Z1 M7 i, C$ w( m7 `8 U  l9 i( M! ^/ F: o- C
void LCD_cls(void)          //LCD清屏
2 A( H4 S5 r/ u" d* B{( m: t' n. N# P% B2 ^
( Z8 G! ]4 p' b- X
LCD_check_busy();         
) Q1 N7 @9 T/ Y$ M7 m$ z2 G3 g$ hLCD_RS=0;               
4 j+ O9 u0 q1 c3 r3 f0 n7 zLCD_RW=0;            
& W* r4 R3 m! O! X3 |# s* B( }LCD_DATA=1;                2 Y' h! v+ u. t- g7 A" N% d% o
LCD_EN=1;                  : Y: k5 l: i. }  u8 M
LCD_EN=0;             ; Y  {9 ]  D1 g; S/ h
; J% e9 m& }4 N
}
7 I8 n6 c- p+ K  W
5 G- f0 y4 o9 M, K3 ovoid LCD_write_instruction(unsigned char LCD_instruction)   //写指令到LCD
6 u, s* m* y* i9 H: @{
$ Q7 k  f! q: y/ Z; Z" ~5 a+ w% NLCD_check_busy();      
6 t; K; ]1 j. S, s$ x1 i6 O( bLCD_RS=0;               
& r6 y# P  R4 @- OLCD_RW=0;               
# y. q  p/ Y. F1 {, r8 n
* T+ ~5 G/ V# H0 e" z$ ~$ O. }LCD_DATA=LCD_instruction;
0 \6 K0 t) I' D* x! x1 y' CLCD_EN=1;                 8 t' e( T. M& o1 @6 Y2 F
LCD_EN=0;                 
/ ~1 B# v6 ~" q5 m0 O}7 P6 g5 m7 M/ E! o7 w
* n" T3 J; e0 H8 i
void LCD_write_data(unsigned char LCD_data)      //输出一个字节数据到LCD
; [% d9 S! \9 V+ o1 N{
) `; r# s# J$ T* g5 NLCD_check_busy();        
0 {6 z, v' u4 l9 [: [2 [+ [LCD_RS=1;                  $ c$ `! Y/ b* k0 l1 W6 M
LCD_RW=0;                  
- l7 x5 p0 p/ N. g1 QLCD_DATA=LCD_data;      1 ~2 {8 m! f! b1 b8 [
LCD_EN=1;                , ?; `& |+ {' S) w. r- Z# i
LCD_EN=0;                  
8 A2 L- Y, h" a}
$ o. R7 ^7 e$ O. c7 J) J# ~# R! j% {2 S0 i$ ]6 |/ d" r
void LCD_set_position(unsigned char x)            //LCD光标定位到x处! J3 T8 J0 L" k6 e+ {5 ?8 ~
{+ `7 M4 {; ~0 g- S* T/ c
LCD_write_instruction(0x80+x); 6 n, n3 q1 z0 X' U. n  N) O- C
}2 D# H2 F+ }6 B4 K9 @- K

4 u. A) w: K3 d  F/*
8 |6 ^8 [6 a1 O5 |2 j1 W8 ^" Nvoid LCD_go_home(void)                         //LCD光标归位
. M' r. w4 ~/ l, J! ]{8 q: W) n/ Q8 |
LCD_write_instruction(LCD_GO_HOME);         
$ z$ g# X% u, d" \8 t; `: a}( A" H; D5 [! f5 E9 N& H
*/
$ K) _' S( i6 B; z. S% `: c7 V( V0 g* T* x- v$ i3 t
void LCD_printc(unsigned char lcd_data)          //输出一个字符到LCD
; J2 z7 Z" a  b1 D* K{
/ c4 s' R  B8 c$ sLCD_write_data(lcd_data);0 E2 z1 ^, ^. J& p; t, F% {
}
8 h% m8 M9 f/ q% B& y& n. T) x0 D% o8 |  j$ m
void LCD_prints(unsigned char *lcd_string)       //输出一个字符串到LCD
7 u  e7 A8 z: m1 t$ K) s7 c{
* }  F+ |( H. Q7 a/ A- s: O1 F3 Bunsigned char i=0;                           
) m& X1 _, n" ~4 ~. cwhile(lcd_string!=0x00)                     , K/ W+ b6 }3 w' X! ^% t
  {% u& v5 \9 x! o6 |8 o( L+ g; S
   LCD_write_data(lcd_string);: k7 Q' q7 K3 H- z
   i++;: |( Y4 H  [9 H5 l6 v9 v; j7 ~
  } , @- m2 W. T- i
}
4 K, I( d* R7 F9 _2 k! }% Y9 r  V! \5 n$ e3 M6 X8 d
void LCD_initial(void)                        //初始化LCD0 p) E5 ?9 [2 u6 y4 {
{4 a" y$ m1 y, M* k5 R& O0 [$ ^) n+ @
LCD_write_instruction(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);   " r& Y( L) }# l
LCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF);            
* _. X8 m/ D# sLCD_write_instruction(LCD_DISPLAY_DOUBLE_LINE);                 , r! `3 Z, e% H5 t: y; }% ~) I
LCD_cls();
4 E+ N4 F$ g/ Z, I5 ^}
; b4 |  q4 y" D- z

1 s2 B/ e4 o% W/ ^) L

该用户从未签到

2#
 楼主| 发表于 2019-4-11 10:52 | 只看该作者
去掉红色两句,编译结果是:4 z5 p; P0 i  v, h7 P: }4 _" {
Build target 'Target 1'
0 m7 H; W" R4 u1 e# z; s" a4 mcompiling my1602mail.c...
! P% O; }8 C& u7 G$ vcompiling LCD1602.C...
' X( k- F# j/ R6 o7 {linking...& o. C  x/ y# Z; x3 s
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS3 o5 L) X3 n! k% y3 n
    SEGMENT: ?PR?_LCD_PRINTC?LCD1602
) ^# y+ d9 f( F9 A6 o2 GProgram Size: data=12.0 xdata=0 code=230; l' b4 y) S/ q5 y5 f
creating hex file from "aaa"...
; N$ c/ {% ?% ~6 A! Z"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:524 f& B) |9 _6 W. N( Y  U
去掉红色两句,编译结果是:
, W, R4 ?$ X( C: HBuild target 'Target 1'
, E' m* X1 @1 u) h9 dcompiling my1602mail.c...

5 w. F7 V% n3 K/ |: i- w# k警告一般是可以忽略的,这个警告只是告诉你printc没有被调用;: H7 R: L5 G1 S' c: K* W
编译器发现你设计了一个没有用到的函数printc,可以在LCD1602.C中将printc函数删除,就可以避免这个警告了;0 J9 L. L. I' o1 o6 i+ F

点评

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-13 01:39 , Processed in 0.125000 second(s), 28 queries , Gzip On.

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

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

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