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

问个问题:#define LCD1602_4PINS 宏定义

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
问个问题:#define LCD1602_4PINS 宏定义
9 D7 K$ q' ^/ H$ Q- P( Z( J$ b! ], ]; y" o1 x. [/ k7 W
(1)在LCD1602实验中,经常出现:
8 L  z" k* \$ ~( [3 x“#ifndef    LCD1602_4PINS    //当没有定义这个LCD1602_4PINS时”,而头文件中中好像定义LCD1602_4PINS也没干啥啊?
9 w9 p( X$ [/ h! C0 L
( Y+ i, H" B& z9 G
(2)是不是写完#define LCD1602_4PINS,之后的的代码都包含在其作用域下?
- q8 f. |; @9 C+ O 4 }" L# w- |( d" p# f

该用户从未签到

2#
发表于 2019-4-16 11:26 | 只看该作者
朋友,我和你一样,也在看这段程序,可是我发现,这个程序的给的真让人无语了,我怀疑他根本就是在增加程序的复杂度,然并卵啊,你完全可以把程序写成这样5 w0 P2 H3 X: \7 l
#include"lcd.h"
! G6 c( F! \! a# S4 _7 g& \6 R& X' r$ @! ^9 O
/*******************************************************************************% l5 n2 D3 I6 O4 O
* 函 数 名         : Lcd1602_Delay1ms" E" ?9 B& F/ \3 Q& `# F
* 函数功能                   : 延时函数,延时1ms
4 k) a" p  N4 a: H* 输    入         : c; P; w: ~7 A' @& Y$ K/ I- F0 h
* 输    出         : 无
* e+ n( J5 U5 t, V1 L9 o" z) \9 v* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。8 u' }) {* G) t# J
*******************************************************************************/
" o9 }8 T4 x; j# V5 r5 ?! |3 |! s$ k$ L& c9 [# k5 r
void Lcd1602_Delay1ms(uint c)   //误差 0us
6 r% J; F  `0 f* k{# Q) b5 v2 O8 i- w
    uchar a,b;9 j5 n) C; g. {7 @9 K, ^; X
        for (; c>0; c--): T: S" m9 g5 O: C0 I
        {' @- I7 f7 j+ D$ `9 R5 u4 w
                 for (b=199;b>0;b--)
3 V( ]/ D: J% S3 f                 {
/ R$ ?" S  O7 G5 f2 ?9 S                          for(a=1;a>0;a--);/ ~# u) g0 z. \$ u! K
                 }      
) n( k  H* n* E8 Z; V; {- C0 y0 g        }3 G; z- P! a8 ?7 \; R
            0 M) n7 t" E8 U# s
}, |. ^& r/ N. ^) t$ F5 e

% v: D' y& U, n/ c8 I/*******************************************************************************' T$ M/ `) E. i7 E) p. x! ]: N: K) W
* 函 数 名         : LcdWriteCom0 n6 a( D! X4 w
* 函数功能                   : 向LCD写入一个字节的命令- q7 U4 ?6 z- B: |4 W" {* B' t: C
* 输    入         : com
$ p" _" E5 ?. q% o! y; w* 输    出         : 无, |! z! ]/ d* g2 n3 v
*******************************************************************************/" d/ |$ X# v# @2 i5 q7 T# \+ y
//#ifndef         LCD1602_4PINS         //当没有定义这个LCD1602_4PINS时
7 i' r% x3 k6 V  /*   void LcdWriteCom(uchar com)          //写入命令
& B6 P" f; Y* P8 I9 I$ [3 P) o{
  s% N6 {8 w2 x2 a9 x! \& m7 u% _        LCD1602_E = 0;     //使能
: f2 u$ J: i1 ]- v8 M        LCD1602_RS = 0;           //选择发送命令
2 r, T' `) V, E# {" K8 C* J$ ?1 S        LCD1602_RW = 0;           //选择写入
# ?' J: ]: R/ ?# Q. N, Z        
0 M8 b2 D! j  s& q2 p        LCD1602_DATAPINS = com;     //放入命令
# Q! @2 g% z2 H, |* W* ?3 |        Lcd1602_Delay1ms(1);                //等待数据稳定
) Z6 {* ~" W  ~* [, V
: B5 U$ h, Q6 {5 k; l/ Y, S        LCD1602_E = 1;                  //写入时序/ ~1 ~+ x4 {, J, I& X# }. V
        Lcd1602_Delay1ms(5);          //保持时间% @' T8 n' U8 w& o$ o! Z5 t
        LCD1602_E = 0;
  V/ w% n! m1 z3 I7 T}         */2 d3 J) P6 ?+ e1 d: d& s* d
//#else 2 l3 o( p8 w4 H4 V
void LcdWriteCom(uchar com)          //写入命令
2 d5 i$ M  H% v) P# B# D+ n{! g  t: c8 @/ D8 |1 f" v+ h) C1 h
        LCD1602_E = 0;         //使能清零: \! W$ a. _; Y) c' x
        LCD1602_RS = 0;         //选择写入命令2 [- ?7 c4 l. F0 ?9 `4 c
        LCD1602_RW = 0;         //选择写入
" g7 k: V% ?" c$ o
) ^6 p  B3 w* N) {        LCD1602_DATAPINS = com;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
- h, ^; C; A6 b# I" n: z5 P        Lcd1602_Delay1ms(1);- E8 G& _9 {8 ]6 M/ _. ]5 b, }

! y- d1 y) q6 L/ L. k* k! ^        LCD1602_E = 1;         //写入时序
; a5 N3 L" d- d6 n2 X6 N2 z0 v        Lcd1602_Delay1ms(5);
4 K" m3 z( s1 @# v, \        LCD1602_E = 0;
8 {4 |! L, K, Q$ O. B8 n% e6 b
4 w6 P* L2 E( f7 ~- h; b- H" w2 g$ K4 k        Lcd1602_Delay1ms(1);
0 C4 u1 e1 ~0 a, U+ D( F        LCD1602_DATAPINS = com << 4; //发送低四位2 Y5 |1 U/ b" n8 U3 {5 o# Y
        Lcd1602_Delay1ms(1);. G' f& m& O) U' o

* X3 s0 [6 c. ~, \6 N2 U7 ^5 B        LCD1602_E = 1;         //写入时序0 t* @5 p% d9 L. e" j7 P
        Lcd1602_Delay1ms(5);7 R" j! v( U' m& O* s
        LCD1602_E = 0;1 f0 i1 Y# L: I; X* I! Z4 x
}
4 `5 @' ?4 [: e1 T/ L+ r//#endif6 M: z1 Q- u8 L
/*******************************************************************************
. h* E( ~/ |0 Q. e: i+ @* 函 数 名         : LcdWriteData6 [" s. ^$ ^  w
* 函数功能                   : 向LCD写入一个字节的数据/ u: g5 W9 N# ~2 a
* 输    入         : dat: @/ B& G, B2 G; p# |) [( u0 L
* 输    出         : 无0 v8 q- S9 v0 a  k& I1 @6 G* ]
*******************************************************************************/                   $ h0 i* c# ^% {8 Q5 B+ S
//#ifndef         LCD1602_4PINS                  
3 W$ R, r; B& [3 T* @/*void LcdWriteData(uchar dat)                        //写入数据' V, K! j5 ^0 K( X% R
{& t; t; t' Q& S7 c
        LCD1602_E = 0;        //使能清零! T5 M5 j$ d1 y
        LCD1602_RS = 1;        //选择输入数据" S& }- t) t# {: `5 E) b
        LCD1602_RW = 0;        //选择写入1 W5 e: b/ l3 e$ J# k: k3 \

9 B; p0 g' O7 N0 J- |2 k1 e        LCD1602_DATAPINS = dat; //写入数据& O3 q2 S' `- E- H( ?
        Lcd1602_Delay1ms(1);: e. j+ B7 f' u, }# H
5 M$ p4 @7 ~; K' y8 v2 ^) k
        LCD1602_E = 1;   //写入时序4 u5 r' O; ^( L- z+ s  t
        Lcd1602_Delay1ms(5);   //保持时间9 C" K& ^8 K  p0 a2 ^  L6 u
        LCD1602_E = 0;8 ?% D- K% o! J5 p' g
}  */
: b1 N9 F) h) J1 _& n7 c3 Q: o//#else: P1 x0 ?! G3 S) m$ Y) ]# A
void LcdWriteData(uchar dat)                        //写入数据  n& @9 P- p5 k$ Z
{
1 m$ j7 _$ p; f7 R        LCD1602_E = 0;          //使能清零( Q1 C9 }% t, w& q$ I
        LCD1602_RS = 1;          //选择写入数据
& g+ v. `+ `) s1 u        LCD1602_RW = 0;          //选择写入; D& u9 C2 f; N" i. w% [, Z( [# p
$ b7 C& Q+ }, g  K* k) E
        LCD1602_DATAPINS = dat;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
' ]% F/ N4 g: g. b, H5 W, s        Lcd1602_Delay1ms(1);! K* j% |: k( i' s- u

3 {0 e: u% T! o0 q# [- X- N        LCD1602_E = 1;          //写入时序
  e8 r* @4 p' ]        Lcd1602_Delay1ms(5);
7 L0 C: d' |0 z# U2 u        LCD1602_E = 0;
: _. Z0 _$ e; ^" ]5 P0 m* Q% J/ j% M& c! D6 y9 y
        LCD1602_DATAPINS = dat << 4; //写入低四位. E5 \' G9 w  n% t: h9 ^1 C
        Lcd1602_Delay1ms(1);
, ^6 n, q/ ~  U6 L
% j1 ~3 H9 W9 j# p* \        LCD1602_E = 1;          //写入时序8 @0 P2 h: @( l0 g# o4 T8 \+ |. r
        Lcd1602_Delay1ms(5);; E. f  [7 n& i! c+ G0 g# U
        LCD1602_E = 0;; v0 w4 \, \2 t: [6 W
}
8 }" z$ X+ i+ D( l  ~5 p3 Q: i//#endif
6 d; I( y' k( K  A+ w* K5 J/*******************************************************************************
& I! }9 L4 M8 U% u% Z* D) R, O* T* 函 数 名       : LcdInit()
" K3 I) B' \& ^. D7 U; j* 函数功能                 : 初始化LCD屏
5 p& K" T7 ^) Z& }- }1 Q% |9 s* 输    入       : 无6 a4 V/ @2 @$ v
* 输    出       : 无( d. M3 a6 H  D0 U3 q# Y1 z5 I
*******************************************************************************/                   ! ?" l4 O7 q& z
//#ifndef                LCD1602_4PINS
, J' G2 w" ~# w( J/*void LcdInit()                                                  //LCD初始化子程序; g& t9 R/ o  e3 h1 E/ B' i
{0 W& k& g" {1 e9 G- O8 r: Z2 ]
        LcdWriteCom(0x38);  //开显示
9 i& j. b3 W3 m        LcdWriteCom(0x0c);  //开显示不显示光标7 I% k. ~8 C# w4 t5 T
        LcdWriteCom(0x06);  //写一个指针加1% h% B$ ~! L! A5 ~
        LcdWriteCom(0x01);  //清屏3 T" B7 W; G% [/ Z  u! P$ y2 }7 C7 O
        LcdWriteCom(0x80);  //设置数据指针起点6 a+ x0 \* O+ H* e( s' C
} */' |; V; P1 K: Q4 [3 ]- t
//#else7 b' p" v5 Y9 V) w4 ]
void LcdInit()                                                  //LCD初始化子程序4 U5 ]* ]% @3 J8 G! i6 B& |. f
{
/ _- F: W7 }5 a, x# G( c* Z4 |        LcdWriteCom(0x32);         //将8位总线转为4位总线. P& g% ?: ]5 H: o$ P2 P
        LcdWriteCom(0x28);         //在四位线下的初始化
" k! r. Q* I# c$ Y        LcdWriteCom(0x0c);  //开显示不显示光标& Z, M; ?( Y! W: F' o5 C
        LcdWriteCom(0x06);  //写一个指针加1- l! q+ {* H; T6 X
        LcdWriteCom(0x01);  //清屏# L8 Q- n5 o! F' J  a2 ?2 e/ O/ t; z( {
        LcdWriteCom(0x80);  //设置数据指针起点
, H3 b& J! }. z* N/ c3 Y1 a}
  W3 H+ h( w) a/ k//#endif1 \) U' a- T( u
因为我发现,他之前在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 后的初始化可以删了: X6 ]0 Y6 Q0 [

该用户从未签到

4#
发表于 2019-4-16 13:27 | 只看该作者
Demyar 发表于 2019-4-16 11:26
* E* f% p# x) I) d2 u3 ~6 g朋友,我和你一样,也在看这段程序,可是我发现,这个程序的给的真让人无语了,我怀疑他根本就是在增加程序 ...

- h5 [# ?: V0 Z! J& [我用的也是普中的,其实他main 函数 里面没有定义 LCD1602_4PINS ;你那样修改是选择了4线传输,没有问题;确实实际写的话选择一种就可以了,不需要写这么复杂,还用到ifndfine;编者可能是想告诉读者可以有两种选择方式吧。9 h: _3 ]' f8 \+ R& `! r! D# f

该用户从未签到

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

点评

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

该用户从未签到

6#
发表于 2019-4-16 13:54 | 只看该作者
十一月 发表于 2019-4-16 13:44
% `( N/ P9 b" ~- X' I' i谢谢大家的回复 明白了

' l5 j& {: o/ [" V) N3 q没事 有问题多交流* V" [3 e! Y1 A* ~, }' Y
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-24 01:36 , Processed in 0.140625 second(s), 31 queries , Gzip On.

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

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

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