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

问个问题:#define LCD1602_4PINS 宏定义

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
问个问题:#define LCD1602_4PINS 宏定义
3 t% J0 r4 ]6 W2 I0 _2 O. |
! H: ~: X% _3 V(1)在LCD1602实验中,经常出现:
! _" T! j% x3 H$ p" N“#ifndef    LCD1602_4PINS    //当没有定义这个LCD1602_4PINS时”,而头文件中中好像定义LCD1602_4PINS也没干啥啊?

1 B) G1 G# l) w
' M/ I$ x5 d8 J* l(2)是不是写完#define LCD1602_4PINS,之后的的代码都包含在其作用域下?
& V- w! O4 x# O" K
6 s7 \+ ~* j3 B

该用户从未签到

2#
发表于 2019-4-16 11:26 | 只看该作者
朋友,我和你一样,也在看这段程序,可是我发现,这个程序的给的真让人无语了,我怀疑他根本就是在增加程序的复杂度,然并卵啊,你完全可以把程序写成这样
0 j6 t5 x% i9 F#include"lcd.h"( S6 K" }) f8 Y( B  S( y

5 j9 F" }2 i& d$ l& {* Q4 F, ?/*******************************************************************************& p% @! w8 P( Q( t# C) }$ Q( g8 b
* 函 数 名         : Lcd1602_Delay1ms
# n7 |3 j/ e9 q8 N* 函数功能                   : 延时函数,延时1ms" k# A7 F: L# j$ `' C. E- ~
* 输    入         : c
6 Y% a" N. d+ l: q+ x* 输    出         : 无) }# s* C% [- F' F
* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
/ M1 c/ U4 x+ i* v/ e# q*******************************************************************************/  Z0 ?' E4 M$ e$ o8 K2 g2 w2 b
- T* W7 i$ Z0 z! W1 l9 ]1 f, n
void Lcd1602_Delay1ms(uint c)   //误差 0us
2 @- B9 q6 ?+ Q{  M: Y; \1 R& Q* |& z* r; m  k
    uchar a,b;
" z% H; P- R& O7 o1 @        for (; c>0; c--)
% }  a7 l: V. _- P: C, {        {* I" K! l1 [/ B
                 for (b=199;b>0;b--)1 y) b$ B; b6 X6 j# L
                 {
, c" N6 M: e; O* B1 K                          for(a=1;a>0;a--);
" Q/ G5 `, j/ N% T. [* @) B                 }      
: W5 F: j7 s. }$ w+ y        }
) |8 p0 v$ z7 ^! W- x            
* M: P7 R2 V9 I7 j$ b9 }}
# C) ]! A. K0 ~8 E) \
- x0 K: J7 c- ~4 Y0 ^. q/*******************************************************************************
6 s4 C) l* {) Y  x* 函 数 名         : LcdWriteCom
- b, l$ O/ ~4 K: }- a- J* M" n. G* 函数功能                   : 向LCD写入一个字节的命令1 M: g; t6 j7 o5 ]1 c
* 输    入         : com) j9 @3 ]8 ^* r+ {5 `5 u1 Q
* 输    出         : 无
' Z# P# o5 J* }" s6 `*******************************************************************************/" Y% k# J& _4 |  K1 ]0 R
//#ifndef         LCD1602_4PINS         //当没有定义这个LCD1602_4PINS时$ d( \  H- K& I; [8 H* v1 M
  /*   void LcdWriteCom(uchar com)          //写入命令
. `9 K& k$ Z( P  D" x( R# B8 K, y{
& i& z2 [. y  K2 e' r8 o3 S0 A2 \        LCD1602_E = 0;     //使能
  J5 L+ S( |' A5 F; S        LCD1602_RS = 0;           //选择发送命令' p' v/ f. y0 p' z
        LCD1602_RW = 0;           //选择写入# }5 s2 |2 l  e1 \
        
8 |: M& y" a4 G8 M+ x& }3 F        LCD1602_DATAPINS = com;     //放入命令
5 G* v: d, i0 C1 g        Lcd1602_Delay1ms(1);                //等待数据稳定
- A) V6 F% d2 n% x8 i4 x8 O& s; i2 d. f- Z4 O% a& g" h
        LCD1602_E = 1;                  //写入时序8 s5 e, ]: f" f1 s& L5 i
        Lcd1602_Delay1ms(5);          //保持时间
3 G5 E6 N- b4 F2 w8 Y7 y; E. `* Q8 i        LCD1602_E = 0;
/ I1 M2 T. C' ~% D) b}         */
1 v  U, y6 A& O8 N5 N//#else
2 t2 z. x1 x3 U  v1 j! }% u8 A" Xvoid LcdWriteCom(uchar com)          //写入命令2 X% j, R6 O! S; e
{- o. z3 w! ~; y- C$ H) ^4 {$ H
        LCD1602_E = 0;         //使能清零1 `  q: Z4 ^: q/ I
        LCD1602_RS = 0;         //选择写入命令
0 h: B8 T  H3 W( Y$ S5 w+ a        LCD1602_RW = 0;         //选择写入) \! `, S7 q( \  z: _% d

# C* }% O' ^' k. U        LCD1602_DATAPINS = com;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
$ q; {5 A% L) V- M4 T" y1 t  f        Lcd1602_Delay1ms(1);5 |! t% q3 z: z  M, U1 \
. s- ^2 w' [. Y; z! E7 r. Y3 o' s
        LCD1602_E = 1;         //写入时序! k0 o+ p; M, L" a
        Lcd1602_Delay1ms(5);
/ T& D* H$ U8 o4 L* J. {; q        LCD1602_E = 0;1 x$ }( m5 g3 \) o: R4 x

# Q& Z# u- ^& k+ Q7 R        Lcd1602_Delay1ms(1);
" N' \! {; X" [: u% Y2 d        LCD1602_DATAPINS = com << 4; //发送低四位
% A7 B# f4 h0 c$ m        Lcd1602_Delay1ms(1);
4 h5 v+ y$ E% l' ?
- q  Z6 K& c% p9 \) D& z6 Z2 e        LCD1602_E = 1;         //写入时序" l3 Z5 J/ G9 d% b, k: n3 q
        Lcd1602_Delay1ms(5);% M* v9 K1 a8 a5 Q* j
        LCD1602_E = 0;, j  w: A( C5 P2 e! F
}
; ]* E& f* \7 p8 V" |" {; p& r//#endif
4 x# |. ~$ X2 p/*******************************************************************************- H  e/ k/ U, ~. o+ z  U
* 函 数 名         : LcdWriteData
  \$ ?& i, o" U3 A* }; t* 函数功能                   : 向LCD写入一个字节的数据0 K2 p  ^; d, ?5 o/ d, D5 ?
* 输    入         : dat
1 F& A# c- w; H0 _; U* 输    出         : 无
: ~" ?# \+ v) z/ e! `/ l+ m*******************************************************************************/                     O" A8 g+ |1 _  |
//#ifndef         LCD1602_4PINS                  
& M. K- C( {" r8 j9 ~/*void LcdWriteData(uchar dat)                        //写入数据* ~  C) H$ C0 S/ `3 h( C1 f
{
6 ~; W" \$ S" S! |' f' p        LCD1602_E = 0;        //使能清零9 m' Q4 ?' j2 o/ C
        LCD1602_RS = 1;        //选择输入数据
0 {/ @1 Y# U9 c  a7 ~5 }        LCD1602_RW = 0;        //选择写入- {9 e! |8 }- ~8 r; S
9 N( g+ [6 H4 X/ x5 A
        LCD1602_DATAPINS = dat; //写入数据: T6 @- A. Y3 z% B* t# I) s
        Lcd1602_Delay1ms(1);
/ C" [# I  J: x/ `2 c" Y5 D* E3 c- u) U+ O* C: U1 @7 e
        LCD1602_E = 1;   //写入时序
" z# b% E; r  k9 x5 l        Lcd1602_Delay1ms(5);   //保持时间7 B- Q8 h. }) r8 q8 f
        LCD1602_E = 0;
; w+ A1 C6 |  u. ^6 Y}  */' Z3 W) a" R/ k2 X2 [
//#else
! w. M4 U; Q9 Y$ K6 ]" l& x, y' ^8 Bvoid LcdWriteData(uchar dat)                        //写入数据
$ w9 y: L* e8 T1 P0 c. k{
+ t  K" C5 D' q; T( p1 |        LCD1602_E = 0;          //使能清零
2 x* z: {! X/ ?& x4 q        LCD1602_RS = 1;          //选择写入数据
8 e& H% I6 ~/ C2 Z& c        LCD1602_RW = 0;          //选择写入! t- p8 p! p# B  V6 V
) z/ {) x) z& {
        LCD1602_DATAPINS = dat;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
1 [3 q4 J6 O* j$ S: y1 K        Lcd1602_Delay1ms(1);
5 a% t. j! O, p& T+ d# d' M6 E% |& A$ A, Z& V2 u, a0 z
        LCD1602_E = 1;          //写入时序/ w( j, M5 i. N: Z$ i) l
        Lcd1602_Delay1ms(5);+ r. m+ ]8 j' E% ~% t
        LCD1602_E = 0;, f. c( X3 _  e, l: v% G- x  v/ q
; T4 a% T: ?% U+ i, m6 e# Y
        LCD1602_DATAPINS = dat << 4; //写入低四位
/ I  e" v& y5 Q3 t- _7 ^8 Q        Lcd1602_Delay1ms(1);* ]: Y9 x; o6 N4 Z1 O+ k5 }

, L2 X3 V7 S% d: ?1 D# w; l# z& w        LCD1602_E = 1;          //写入时序
8 ]: w! }2 r2 R1 A+ q# u. [$ x        Lcd1602_Delay1ms(5);9 k* ~# J  b' x; Z$ ?
        LCD1602_E = 0;
. Z5 y  Y8 {/ Q9 I7 ?: A% W. R' J% R}
3 K. v# X' x7 C; ?0 n//#endif! z  o' |* L/ w! y, o8 W$ Z) _: ?8 T
/*******************************************************************************
7 i  i0 @( i6 S( @* 函 数 名       : LcdInit()  T3 E6 U) x' F7 r: x
* 函数功能                 : 初始化LCD屏
# O( @# u, S! ^! N1 q2 y6 q* 输    入       : 无
; L) r9 P# w1 j" O9 P* 输    出       : 无
" l# X* ?1 C7 }: x, b. \$ N*******************************************************************************/                  
$ Q% y2 @+ E: {# B//#ifndef                LCD1602_4PINS! T* k0 L  j! N+ `3 k9 G0 U8 g
/*void LcdInit()                                                  //LCD初始化子程序  k3 v% a0 o& L& \$ h& w
{
  R7 o" A0 d  K. ]3 y        LcdWriteCom(0x38);  //开显示8 i! w# S. D* ^. B1 [: u
        LcdWriteCom(0x0c);  //开显示不显示光标
7 k3 Q) @+ P( D$ L0 f: \, \        LcdWriteCom(0x06);  //写一个指针加1- n& f, G; Y1 z
        LcdWriteCom(0x01);  //清屏
5 v2 k! R  n) I4 `* P" j        LcdWriteCom(0x80);  //设置数据指针起点
5 Q, n$ f& T9 T6 I9 j) ^, l3 R} */
0 o+ M- t9 e6 N. f* G//#else
% m( H- B! p/ k; J3 ^4 F* E1 vvoid LcdInit()                                                  //LCD初始化子程序
6 x0 b' q4 x9 B/ d: z{
/ p6 p' k4 ?: ?* M# Z1 X9 B  {# K        LcdWriteCom(0x32);         //将8位总线转为4位总线0 M: R7 z: D! }. j$ B8 P
        LcdWriteCom(0x28);         //在四位线下的初始化
" n: \9 x1 k  T5 j        LcdWriteCom(0x0c);  //开显示不显示光标
, \  Z- l8 p) s" n& E" v) @        LcdWriteCom(0x06);  //写一个指针加1) I& o  G. ~) h1 V- `$ |
        LcdWriteCom(0x01);  //清屏4 g3 T6 f9 f, i2 B& `- l" u9 q
        LcdWriteCom(0x80);  //设置数据指针起点
8 U( \3 Y2 N) ?; I" @' Q}
( v( z2 r2 O; k8 Q//#endif# |( s$ d  E6 T7 T
因为我发现,他之前在main函数里面就定义了LCD1602_4PINS  也就是他还说什么  #ifndef  LCD1602_4PINS(假如没有定义 LCD1602_4PINS),这不是让人无语吗?我怀疑他们只是在某个程序里面截取了一段程序过来,然后改成可以实现功能的程序即可,他们根本就没有考虑程序的简洁性,不负责任的卖家

点评

我用的也是普中的,其实他main 函数 里面没有定义 LCD1602_4PINS ;你那样修改是选择了4线传输,没有问题;确实实际写的话选择一种就可以了,不需要写这么复杂,还用到ifndfine;编者可能是想告诉读者可以有两种选择  详情 回复 发表于 2019-4-16 13:27

该用户从未签到

3#
发表于 2019-4-16 13:26 | 只看该作者
是可以省去四位数据传输时的情况,不写这条语句的时候默认为8位数据传输,        用8位就ok了,程序还变简单了,将#ifndef    LCD1602_4PINS 后的初始化可以删了5 q* X# v' T. S# }; M$ H; d

该用户从未签到

4#
发表于 2019-4-16 13:27 | 只看该作者
Demyar 发表于 2019-4-16 11:26& G' V, g( ^  Q- e, j
朋友,我和你一样,也在看这段程序,可是我发现,这个程序的给的真让人无语了,我怀疑他根本就是在增加程序 ...

: V, k$ X& H1 @+ X) }我用的也是普中的,其实他main 函数 里面没有定义 LCD1602_4PINS ;你那样修改是选择了4线传输,没有问题;确实实际写的话选择一种就可以了,不需要写这么复杂,还用到ifndfine;编者可能是想告诉读者可以有两种选择方式吧。
+ }: y# B1 ^* F+ [0 T

该用户从未签到

5#
 楼主| 发表于 2019-4-16 13:44 | 只看该作者
谢谢大家的回复 明白了

点评

没事 有问题多交流  详情 回复 发表于 2019-4-16 13:54

该用户从未签到

6#
发表于 2019-4-16 13:54 | 只看该作者
十一月 发表于 2019-4-16 13:44( m8 T3 c$ P& \! q, W; M
谢谢大家的回复 明白了
1 t0 n% J; R$ m: C& S* F5 K
没事 有问题多交流
, r# c7 ~" `/ J# o, `; ^5 ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-26 13:27 , Processed in 0.109375 second(s), 27 queries , Gzip On.

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

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

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