数码之家

 找回密码
 立即注册
搜索
查看: 478|回复: 15

[C51] 小白学单片机之错误的宏定义示范

[复制链接]
发表于 2025-2-13 23:06:39 | 显示全部楼层 |阅读模式
本帖最后由 wangxiangtan2 于 2025-2-14 21:03 编辑

看了几分钟没看出来,出去取了个快递回来,错得很明显啊,真小白









本帖子中包含更多资源

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

x
发表于 2025-2-14 01:01:13 | 显示全部楼层
我也这样。几年不写还会忘记define A B,是令A=B还是令B=A
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-14 08:14:12 来自手机浏览器 | 显示全部楼层
dirtyacc 发表于 2025-2-14 01:01
我也这样。几年不写还会忘记define A B,是令A=B还是令B=A

是,隔段时间就不行了,觉得各种概念都清楚,一上手就写错……
回复 支持 反对

使用道具 举报

发表于 2025-2-14 09:14:42 | 显示全部楼层
本帖最后由 devcang 于 2025-2-16 09:01 编辑


#define P32 P3^2

这样可以

——————————————
经过实验,结论是定义可以,使用会出错。


但可以变通这样使用


本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2025-2-14 12:13:00 来自手机浏览器 | 显示全部楼层
编程语言学杂了就会这样,一直不明白原理都差不多,为什么各种语言不能统一下基本的语法
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-14 21:01:59 | 显示全部楼层
devcang 发表于 2025-2-14 09:14
#define P32 P3^2

这样可以

刚试了一下,咋还不行?


本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-14 21:03:17 | 显示全部楼层
flyrack 发表于 2025-2-14 12:13
编程语言学杂了就会这样,一直不明白原理都差不多,为什么各种语言不能统一下基本的语法 ...

因为“时代在进步”吧
回复 支持 反对

使用道具 举报

发表于 2025-2-14 22:50:07 | 显示全部楼层
wangxiangtan2 发表于 2025-2-14 21:01
刚试了一下,咋还不行?

19/20……咋写的
回复 支持 反对

使用道具 举报

发表于 2025-2-15 14:10:05 | 显示全部楼层
STC8H了,我才接触STC8G,其实STC8H几钱一片呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-15 16:50:08 | 显示全部楼层
aming_ou 发表于 2025-2-15 14:10
STC8H了,我才接触STC8G,其实STC8H几钱一片呢?

c从8毛9到3块5

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-15 16:51:21 | 显示全部楼层

我测试了一下用P3^2应该写成:
sbit HC595SER P3^2
回复 支持 反对

使用道具 举报

发表于 2025-2-15 18:25:19 | 显示全部楼层
wangxiangtan2 发表于 2025-2-15 16:51
我测试了一下用P3^2应该写成:
sbit HC595SER P3^2

得看头文件里面的定义,有些是P3^3,有些是P33,还有P3.3的.
回复 支持 反对

使用道具 举报

发表于 2025-2-15 18:27:53 | 显示全部楼层
本帖最后由 aming_ou 于 2025-2-15 18:32 编辑

c代码文件在头部#include "STC8G.H"后,直接使用P32即可,用P3^2也可以,
因为STC8H.h中P32是这样定义的
sbit        P32         =           P3^2;

而我们在c代码编程时,为了增加可读性,都把IO额外声明为更友好的名字,所以用到#define语法,变量跟变量值之间不需要用 = 字符,它除了简单的变量赋值外,其实它还可以 赋值为一段函数(合并为一行的),

#define KEY_PIN P32   // 定义按键引脚连接P32,不用 = 字符,最后不用分号

上面的KEY_PIN预处理宏定义,如果仅是简单的变量声明和赋值,还可以写为
sbit KEY_PIN = P3^2;  // 要用 = 字符分隔开,且最后要用分号

在单片机C语言编程中,#define 是一个预处理指令,主要用于宏定义。它的作用主要包括以下几个方面:
1. 定义常量#define 可以用来定义一个常量,这样可以在程序中多次使用同一个值时,避免重复书写,同时方便修改。
示例:

  1. #define PI 3.14159
  2. #define LED_PIN 13
复制代码

在程序中,每次使用 PI 或 LED_PIN 时,预处理器会将其替换为对应的值(3.14159 或 13)。如果需要修改这些值,只需在定义处修改即可,而不需要逐个查找替换。
2. 定义宏函数#define 可以用来定义简单的宏函数,通过参数替换实现简单的功能,提高代码的可读性和复用性。
示例:

  1. #define MAX(a, b) ((a) > (b) ? (a) : (b))
  2. #define SWAP(a, b) do { int temp = (a); (a) = (b); (b) = temp; } while(0)
复制代码

在程序中,MAX(a, b) 会根据传入的参数计算最大值,SWAP(a, b) 用于交换两个变量的值。
3. 条件编译#define 可以与条件预处理指令(如 #ifdef、#ifndef、#if 等)配合使用,实现条件编译,从而根据不同的条件编译不同的代码。
示例:

  1. #define DEBUG_MODE
  2. #ifdef DEBUG_MODE
  3.     void debug_print(char *msg) {        printf("%s\n", msg);    }
  4. #else
  5.     void debug_print(char *msg) {        // 空实现,不输出任何内容    }
  6. #endif
复制代码

在调试时定义 DEBUG_MODE,程序会包含调试信息;在发布时取消定义,调试代码会被忽略,从而减少代码体积和运行时间。
4. 简化代码通过 #define 定义一些复杂的表达式或操作,可以使代码更加简洁易读。
示例:

  1. #define SET_BIT(port, bit) ((port) |= (1 << (bit)))
  2. #define CLEAR_BIT(port, bit) ((port) &= ~(1 << (bit)))
复制代码

在操作单片机的端口时,使用这些宏可以简化代码,避免重复书写复杂的位操作。
5. 提高可移植性在单片机编程中,不同的硬件平台可能有不同的寄存器地址或引脚定义。通过 #define 定义这些硬件相关的部分,可以方便地在不同平台上移植代码。
示例:

  1. #define UART_TX_PIN P1_0
  2. #define UART_RX_PIN P1_1
复制代码

如果更换硬件平台,只需修改这些定义即可,而无需修改整个程序代码。
总结#define 是一个非常强大的工具,它可以用于定义常量、宏函数、实现条件编译、简化代码和提高代码的可移植性。


打赏

参与人数 1家元 +30 收起 理由
兔包公 + 30 以資鼓勵

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2025-2-16 09:02:35 | 显示全部楼层
wangxiangtan2 发表于 2025-2-14 21:01
刚试了一下,咋还不行?

在原 4楼 回复了。

不能直接使用,有变通的方法。
回复 支持 反对

使用道具 举报

发表于 2025-2-16 09:40:50 | 显示全部楼层
简单的宏定义还行,复杂的宏定义很少用
回复 支持 反对

使用道具 举报

发表于 2025-2-17 17:56:50 来自手机浏览器 | 显示全部楼层
引脚一般官方的头文件会有定义,多喵一眼一般不会错~但确实有时是会用错
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-3-17 23:03 , Processed in 0.140400 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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