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

问个问题:#define LCD1602_4PINS 宏定义

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
问个问题:#define LCD1602_4PINS 宏定义0 u- W; _: B3 ^; y* h6 c
  A+ e+ P/ p/ L- m6 ~. ]1 z' X
(1)在LCD1602实验中,经常出现:
! _  q  c& u# ~& {% B$ t“#ifndef    LCD1602_4PINS    //当没有定义这个LCD1602_4PINS时”,而头文件中中好像定义LCD1602_4PINS也没干啥啊?

2 i6 D2 ~3 h: i( n4 q. w7 Z5 t9 h, \% y( e
(2)是不是写完#define LCD1602_4PINS,之后的的代码都包含在其作用域下?
" j. m* g0 ?5 w& y
8 w) b/ `8 W! j

该用户从未签到

2#
发表于 2019-4-16 11:26 | 只看该作者
朋友,我和你一样,也在看这段程序,可是我发现,这个程序的给的真让人无语了,我怀疑他根本就是在增加程序的复杂度,然并卵啊,你完全可以把程序写成这样9 n1 B; y3 }' B# _+ ?# S( ~& X
#include"lcd.h"
8 s' |( `$ S/ S1 T5 d0 X; ~; [- G. H, Z* G
/*******************************************************************************0 B$ _9 l0 `: k+ V4 s' [5 U
* 函 数 名         : Lcd1602_Delay1ms
3 _" T  y2 o. E* 函数功能                   : 延时函数,延时1ms
- U/ r5 _" s# X: `* 输    入         : c
- N4 L: a2 I1 |; z* 输    出         : 无
- m! m$ ?5 }/ w% t* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
8 R3 e9 N$ L) k6 h*******************************************************************************/% N. N) a5 J5 Y* U$ F0 o; s
) p  z4 ~2 }1 o7 F+ _$ O4 {8 }
void Lcd1602_Delay1ms(uint c)   //误差 0us. [( c) n- t6 m+ N$ q; G. e. y
{
6 [  M' F$ W! d4 M& P* D7 y    uchar a,b;
- X" v- J0 H- e5 H4 z        for (; c>0; c--)$ c' d) W% W: i$ T: p
        {
8 o6 N: a0 M! }  k                 for (b=199;b>0;b--)1 `1 E4 `% N8 u' c9 e5 J
                 {2 @$ W' y3 k3 U/ z
                          for(a=1;a>0;a--);
6 E* ~1 Q+ A- H* y: r0 f8 w) Y                 }      ; Q& r, n5 u/ G+ C
        }" e; {1 C, G! I* a2 H
            # [; L4 j& j! k, `- u, y
}
3 o" G3 T. _2 }0 z( }5 \' W. c7 j- K  e. s0 i) b! d
/*******************************************************************************
  }+ A/ H# n. A$ l* d* 函 数 名         : LcdWriteCom: ^3 r: V, g( r
* 函数功能                   : 向LCD写入一个字节的命令  N, C7 t8 M: _! O! u
* 输    入         : com
4 K- T6 S* P5 D* w* 输    出         : 无8 s* |3 O$ m- K+ T! S0 d
*******************************************************************************/$ O2 C3 i! I. N- C
//#ifndef         LCD1602_4PINS         //当没有定义这个LCD1602_4PINS时9 N9 \% d  \# z& v/ |+ y- t
  /*   void LcdWriteCom(uchar com)          //写入命令9 V, h3 v4 _# ]7 Z& p' j
{
8 a  t  t3 T$ W3 q* z0 `: F. S        LCD1602_E = 0;     //使能
3 `. Y) \% ~% a4 p, ?        LCD1602_RS = 0;           //选择发送命令
; |9 ^5 \; r5 n1 x- L        LCD1602_RW = 0;           //选择写入- r. M/ i. s5 `) w+ i4 _: ^1 M
        6 x1 o5 U7 K1 j0 G- \; M0 G+ ^$ T7 U
        LCD1602_DATAPINS = com;     //放入命令0 E# b2 r1 E$ I# E3 {* C
        Lcd1602_Delay1ms(1);                //等待数据稳定
  r; n% K9 s5 h. l9 c  J2 h
. \3 B1 g; ?. u) p" I! b        LCD1602_E = 1;                  //写入时序) F8 j% I7 F' V9 ]: J  V5 S# ~
        Lcd1602_Delay1ms(5);          //保持时间
4 H, e3 ~. v7 s% G        LCD1602_E = 0;
* y# {" T: ~1 y1 e}         */
0 U: i: Z' O& W+ `, Q$ s2 d2 ]//#else & n, t% E6 C+ n, N
void LcdWriteCom(uchar com)          //写入命令
/ [$ C' x3 u0 z: q% E- J' d{4 O) y5 K) z7 B& g5 K6 \! j
        LCD1602_E = 0;         //使能清零- O  L6 p  `7 |
        LCD1602_RS = 0;         //选择写入命令1 y4 M; d- l. I. b
        LCD1602_RW = 0;         //选择写入
8 F$ |, C+ z1 }* q5 x6 B1 V
# T% n$ g$ D+ s# o. ?        LCD1602_DATAPINS = com;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改, H2 P+ {1 S* f  M; f
        Lcd1602_Delay1ms(1);
! a; k+ ~# q8 S4 i
4 S0 |1 v- H7 A5 l. z" w        LCD1602_E = 1;         //写入时序
4 w# b- l$ i8 v, K7 G. q) Z  L4 `  _        Lcd1602_Delay1ms(5);6 q6 ~! o: X0 e7 D0 E! Y
        LCD1602_E = 0;6 Z- L% G5 N) ]0 n
! e; U4 T0 d8 k7 O
        Lcd1602_Delay1ms(1);) C/ f) Z& j7 ]" {: M
        LCD1602_DATAPINS = com << 4; //发送低四位
. S' X" W; A4 x: P        Lcd1602_Delay1ms(1);) o* Q' V5 m( m, S- P+ R7 P

* h  A4 j1 E/ a8 k6 m8 w        LCD1602_E = 1;         //写入时序! v3 h# G' m/ q
        Lcd1602_Delay1ms(5);# q( T# {' h' O- J2 a# V# W
        LCD1602_E = 0;. k! b, ~+ T. m  D8 `0 ^; f2 p" `; ~
}) _4 g0 _5 C6 c9 v* g' y% T
//#endif
3 t, }, T/ O% E/*******************************************************************************: _* i1 }; X# g# I' e1 l0 l
* 函 数 名         : LcdWriteData
: v) a: j" ?; O; }7 ]( D* 函数功能                   : 向LCD写入一个字节的数据
) w3 O- B9 k# h# f6 z* 输    入         : dat$ P" q7 J2 e8 H- L8 J8 n. E
* 输    出         : 无3 P4 a1 N5 y- C( ^, C( n4 l4 I* s
*******************************************************************************/                   6 P' ?- {7 S8 l- i8 V7 h. K
//#ifndef         LCD1602_4PINS                  
% L0 P+ l" S. U* p/*void LcdWriteData(uchar dat)                        //写入数据
0 _& y% E# t: c! I{& T4 G# A! k6 _0 g" i
        LCD1602_E = 0;        //使能清零% z4 K" f" |  ^% \0 P5 e# x/ y
        LCD1602_RS = 1;        //选择输入数据
9 b9 G# s5 B# Y5 k        LCD1602_RW = 0;        //选择写入
5 V* W7 }4 e* V& T' ~
& i/ M, f+ N3 L- F( d        LCD1602_DATAPINS = dat; //写入数据
9 @2 v  F, ?8 z$ @' f( W        Lcd1602_Delay1ms(1);  [: k, I. A# L2 H) \

& L' `0 J" z- c2 d- x        LCD1602_E = 1;   //写入时序) [$ z, N) a# w: q- \
        Lcd1602_Delay1ms(5);   //保持时间
3 d4 ~8 e0 d9 I: M" g6 O        LCD1602_E = 0;
+ P7 n' o8 Z* S5 `1 m* q( n}  */0 ^& R0 X+ M$ M. k( v. I  K9 z9 o
//#else
" [8 B$ d9 h0 y/ L' u$ cvoid LcdWriteData(uchar dat)                        //写入数据) n" J3 n: `7 ]+ K% I
{
2 c- a* g8 _9 C( J        LCD1602_E = 0;          //使能清零
: R& D2 v* L: f% `7 b. t        LCD1602_RS = 1;          //选择写入数据* d; W6 v! |0 F- D. J# S+ w8 n( e' R( D
        LCD1602_RW = 0;          //选择写入
3 f2 h# P' D: f' S3 t8 g9 d% _
. q  l5 [& w1 E- N" G% r4 K3 M        LCD1602_DATAPINS = dat;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改& [( r7 q$ y  t
        Lcd1602_Delay1ms(1);8 X9 d' m& `6 p1 d% G2 I
" W  |4 F4 l& r, ]& M
        LCD1602_E = 1;          //写入时序
! R! B/ J$ V- k- Y$ Z- I# z        Lcd1602_Delay1ms(5);
1 d3 T* {9 |* M        LCD1602_E = 0;
0 G; Z, n" Z1 ^
% Y, s! X4 B+ G- Q        LCD1602_DATAPINS = dat << 4; //写入低四位* ^+ F1 `: T+ {$ l% |
        Lcd1602_Delay1ms(1);  O: |1 g" M' ?' {4 d
; \$ U& S! T0 p! x3 ~7 a9 Q
        LCD1602_E = 1;          //写入时序
: E. I, |" G: ?6 N        Lcd1602_Delay1ms(5);
5 i4 }5 s+ H' @, Q7 x        LCD1602_E = 0;
) P- h/ V9 p/ F$ A" V}0 U/ b# y- \1 n$ Q0 t
//#endif
: o% D3 B- N) c) u/*******************************************************************************
7 X5 D! x, N, [* 函 数 名       : LcdInit()
, E' e6 T! m: G8 w; r* J( J# ]* 函数功能                 : 初始化LCD屏
/ x- t; F- `* @  ?# G* ]* q* 输    入       : 无
, ~4 x' y. r  Y9 s* 输    出       : 无5 K# A! j% ~3 Y1 }
*******************************************************************************/                   ( u" T: E& S5 N
//#ifndef                LCD1602_4PINS
/ `8 g! ^4 O5 D6 x* ^# o3 M# D5 \2 _) u/*void LcdInit()                                                  //LCD初始化子程序
( ^3 ]. K6 _+ c  A{- o2 b- h9 E8 F
        LcdWriteCom(0x38);  //开显示
( [8 O9 B0 P( R3 W! d( H6 C$ T- D0 k2 k        LcdWriteCom(0x0c);  //开显示不显示光标
1 ?  Y' t! x9 o6 @  z) [, P        LcdWriteCom(0x06);  //写一个指针加1
& w% |' p4 ?! s( Q% X" t6 _        LcdWriteCom(0x01);  //清屏
. m. U, \# B; D3 H0 p0 h        LcdWriteCom(0x80);  //设置数据指针起点
9 N( L. q6 Y/ t9 `: P8 M} */
8 s1 s2 g5 L4 L3 x* F//#else
+ _  k7 I1 z# r. H( x) O, I5 nvoid LcdInit()                                                  //LCD初始化子程序( }7 I* V5 B: \) a
{
/ v% C2 f9 B8 {3 r( G' K9 Q. e5 i        LcdWriteCom(0x32);         //将8位总线转为4位总线( j9 m8 R. t, y( h9 s4 M
        LcdWriteCom(0x28);         //在四位线下的初始化5 }  l! Q3 e; `' f1 S
        LcdWriteCom(0x0c);  //开显示不显示光标5 G! E, ~( L7 a9 ^+ p1 v/ S
        LcdWriteCom(0x06);  //写一个指针加1* q$ D4 T3 f  l  S. R
        LcdWriteCom(0x01);  //清屏
( s! h4 j, j% I        LcdWriteCom(0x80);  //设置数据指针起点. A7 D5 B* Y0 Y7 b4 n0 b
}' j* ?0 q0 Q/ R* J* [) V% f
//#endif
9 ]- i( f0 D6 v  V' }因为我发现,他之前在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 后的初始化可以删了# Q9 {$ v. ~1 G+ X4 j+ s

该用户从未签到

4#
发表于 2019-4-16 13:27 | 只看该作者
Demyar 发表于 2019-4-16 11:260 R5 }: C+ u/ J3 j  R- f
朋友,我和你一样,也在看这段程序,可是我发现,这个程序的给的真让人无语了,我怀疑他根本就是在增加程序 ...
9 y) p4 C& C2 d  y2 K3 s+ u* m/ h
我用的也是普中的,其实他main 函数 里面没有定义 LCD1602_4PINS ;你那样修改是选择了4线传输,没有问题;确实实际写的话选择一种就可以了,不需要写这么复杂,还用到ifndfine;编者可能是想告诉读者可以有两种选择方式吧。. J5 L( j! B4 B* I

该用户从未签到

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

点评

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

该用户从未签到

6#
发表于 2019-4-16 13:54 | 只看该作者
十一月 发表于 2019-4-16 13:44
, K4 S, D/ C& L5 b  U" }8 \谢谢大家的回复 明白了

1 n  W/ W; Y6 o/ b% \, y没事 有问题多交流% c7 w: i8 ~' c4 \0 N9 G
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-18 20:40 , Processed in 0.156250 second(s), 31 queries , Gzip On.

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

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

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