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

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

[复制链接]

该用户从未签到

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

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, ~

该用户从未签到

2#
 楼主| 发表于 2019-4-11 10:52 | 只看该作者
去掉红色两句,编译结果是:
4 @: S1 [  o6 o& p. J( b- `( g* y+ kBuild target 'Target 1'4 `  e1 K* ?( A  Y, e6 y# \9 }% b* {
compiling my1602mail.c...! J- W5 S1 q* z8 P* f! Q1 V
compiling LCD1602.C...
4 P7 b9 H7 \0 F0 [. j* Llinking...
6 j0 }: O5 }0 @2 b1 X*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS  B  ~+ a/ \. I$ b* W% g2 {* |1 m7 o
    SEGMENT: ?PR?_LCD_PRINTC?LCD16020 S3 N: j7 I. N7 n4 V1 Q
Program Size: data=12.0 xdata=0 code=230& ~$ W& t) {+ C3 o
creating hex file from "aaa"...
3 s9 _' S' ]& G& B+ i8 g"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& }  B1 i2 B' x7 D1 O5 a
去掉红色两句,编译结果是:
. V1 `; w5 w& J4 f& H) aBuild target 'Target 1'
8 Y9 ]* Y- G; R5 t, hcompiling my1602mail.c...

* W7 M- y. b: V; R6 @$ T4 V1 F警告一般是可以忽略的,这个警告只是告诉你printc没有被调用;
$ N4 P' c7 z" Z; R8 `- P  U编译器发现你设计了一个没有用到的函数printc,可以在LCD1602.C中将printc函数删除,就可以避免这个警告了;* q, E2 a- Y0 l% T( t( _

点评

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-27 20:33 , Processed in 0.140625 second(s), 28 queries , Gzip On.

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

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

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