鱼C论坛

 找回密码
 立即注册
查看: 3027|回复: 4

对宏定义的疑问

[复制链接]
发表于 2016-11-25 09:26:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
  1. #define GPFCON      (*(volatile unsigned long *)0x56000050)
  2. #define GPFDAT      (*(volatile unsigned long *)0x56000054)

  3. #define GPGCON      (*(volatile unsigned long *)0x56000060)
  4. #define GPGDAT      (*(volatile unsigned long *)0x56000064)

  5. /*
  6. * LED1,LED2,LED4对应GPF4、GPF5、GPF6
  7. */
  8. #define        GPF4_out        (1<<(4*2))
  9. #define        GPF5_out        (1<<(5*2))
  10. #define        GPF6_out        (1<<(6*2))

  11. #define        GPF4_msk        (3<<(4*2))
  12. #define        GPF5_msk        (3<<(5*2))
  13. #define        GPF6_msk        (3<<(6*2))

  14. /*
  15. * S2,S3,S4对应GPF0、GPF2、GPG3
  16. */
  17. #define GPF0_in     (0<<(0*2))
  18. #define GPF2_in     (0<<(2*2))
  19. #define GPG3_in     (0<<(3*2))

  20. #define GPF0_msk    (3<<(0*2))
  21. #define GPF2_msk    (3<<(2*2))
  22. #define GPG3_msk    (3<<(3*2))

  23. int main()
  24. {
  25.         unsigned long dwDat;
  26.         // LED1,LED2,LED4对应的3根引脚设为输出
  27.         GPFCON &= ~(GPF4_msk | GPF5_msk | GPF6_msk);
  28.         GPFCON |= GPF4_out | GPF5_out | GPF6_out;
  29.         
  30.         // S2,S3对应的2根引脚设为输入
  31.         GPFCON &= ~(GPF0_msk | GPF2_msk);
  32.         GPFCON |= GPF0_in | GPF2_in;

  33.         // S4对应的引脚设为输入
  34.         GPGCON &= ~GPG3_msk;
  35.         GPGCON |= GPG3_in;

  36.         while(1){
  37.             //若Kn为0(表示按下),则令LEDn为0(表示点亮)
  38.             dwDat = GPFDAT;             // 读取GPF管脚电平状态
  39.         
  40.             if (dwDat & (1<<0))        // S2没有按下
  41.                 GPFDAT |= (1<<4);       // LED1熄灭
  42.             else   
  43.                 GPFDAT &= ~(1<<4);      // LED1点亮
  44.                
  45.             if (dwDat & (1<<2))         // S3没有按下
  46.                 GPFDAT |= (1<<5);       // LED2熄灭
  47.             else   
  48.                 GPFDAT &= ~(1<<5);      // LED2点亮
  49.    
  50.             dwDat = GPGDAT;             // 读取GPG管脚电平状态
  51.             
  52.             if (dwDat & (1<<3))         // S4没有按下
  53.                 GPFDAT |= (1<<6);       // LED3熄灭
  54.             else   
  55.                 GPFDAT &= ~(1<<6);      // LED3点亮
  56.     }
复制代码



这是一个开发板点亮led灯的程序,有一点不理解,#define        GPF4_out        (1<<(4*2))这条指令执行后,GPF4_out的第8位被置为1,但是我查了一下,说宏定义不会分配内存,既然不分配内存,那又何来的相应位置1呢?求教!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-11-26 03:19:19 | 显示全部楼层
...........

不知道你想表达什么,gpf4应该还可以再跟踪进去的,这个东西本身就是一个io口寄存器地址,这个定义是为该io口赋值。

建议你多看看芯片手册。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-26 10:30:02 | 显示全部楼层
宏定义只是做文字替换,不会分配内存。
所以在正文中使用该宏定义的地方会被文字替换,替换后该处将GPF4_out的第8位置为1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-26 14:01:11 | 显示全部楼层
#define        GPF4_out        (1<<(4*2))这条指令只是替换数值,是个常量。
GPFCON |= GPF4_out | GPF5_out | GPF6_out;在这个运算中起到左移的作用,这里才对GPFCON所代表的地址进行操作起到操控灯亮灭的作用。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-7 12:46:10 | 显示全部楼层
楼主好像对不分配内存这句话有点误解吧。宏定义会直接文本替换源代码的语句,所以宏本身不会占用内存。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-9 18:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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