[经验分享] 一段C语言结构体的程序

[复制链接]
1389|13
 楼主| Edisons 发表于 2016-7-19 19:26 | 显示全部楼层 |阅读模式
typedef struct
{
  vu16 LCD_REG;
  vu16 LCD_RAM;
} LCD_TypeDef;

/* Note: LCD /CS is CE4 - Bank 4 of NOR/SRAM Bank 1~4 */
#define LCD_BASE        ((u32)(0x60000000 | 0x0C000000))
#define LCD             ((LCD_TypeDef *) LCD_BASE)

-----------
以上定义是不是给结构体定义一个基地址为0x6c000000,成员LCD_REG 的地址为0x6c000000,成员LCD_RAM 的地址为0x6c000001,

那如果我这样定义绝对地址,是不是和上面的一样
#define LCD_REG   ((u32)0x6c000000)
#define LCD_RAM   ((u32)0x6c000001)

----
在STM32单片机中用FSMC刷LCD用到这样的语句有点看不明白
_gege 发表于 2016-7-19 19:31 | 显示全部楼层
C语言里结构体本就是有个首地址,各个成员按顺序依次排列存储的。
Mozarts 发表于 2016-7-19 19:31 | 显示全部楼层
#define LCD_REG   ((u32)0x6c000000)
    #define LCD_RAM   ((u32)0x6c000001)
    ...为什么用u32去强制转换呢?
Listate 发表于 2016-7-19 19:37 | 显示全部楼层
FSMC的A0接至LCD的数据与命令选择端

A0为0时表示写命令
A0为1时表示写数据
laozhongyi 发表于 2016-7-19 19:38 | 显示全部楼层
我知道按楼上这样写法是可以的

但我有看到别人写的程序是这样的
typedef struct
{
  vu16 LCD_REG;
  vu16 LCD_RAM;
} LCD_TypeDef;

#define LCD             ((LCD_TypeDef *) 0x6c000000)

LCD->LCD_REG = CMD;
LCD->LCD_REG = DATA;
wanglaojii 发表于 2016-7-19 19:45 | 显示全部楼层
LCD->LCD_REG = CMD;
LCD->LCD_REG = DATA;

不知这两种表示方法有啥区别。。
zhouhuanの 发表于 2016-7-19 19:48 | 显示全部楼层
((LCD_TypeDef *) 0x6c000000)是将0x6c000000地址开始的2个半字(现在看来数据总线是8位了)转换为LCD_TypeDef类型。
handleMessage 发表于 2016-7-19 19:54 | 显示全部楼层
应该是
   8位宽度
   *((volatile UINT8 * )0x6C000001) = DATA;
    *((volatile UINT8 * )0x6C000000) = DATA;
    16位宽度的话应该是这样:
    *((volatile UINT16 * )0x6C000002) = DATA;  //16位是两个字节,所以地址加2
    *((volatile UINT16 * )0x6C000000) = DATA;  
 楼主| Edisons 发表于 2016-7-19 19:56 | 显示全部楼层
Listate 发表于 2016-7-19 19:37
FSMC的A0接至LCD的数据与命令选择端

A0为0时表示写命令

恩是的,我知道这种写法是可以的。
 楼主| Edisons 发表于 2016-7-19 19:57 | 显示全部楼层
laozhongyi 发表于 2016-7-19 19:38
我知道按楼上这样写法是可以的

但我有看到别人写的程序是这样的

不错啊, 这个正好也需要啊,多谢分享了。
 楼主| Edisons 发表于 2016-7-19 19:57 | 显示全部楼层
:)谢谢上面各位大神,终于有点感觉了呀
bbapple 发表于 2016-7-19 20:04 | 显示全部楼层
写代码一定要仔细,一点忽略的地方可能几天都找不到哪里出错了。
ittechbay 发表于 2016-7-20 17:19 | 显示全部楼层
本帖最后由 ittechbay 于 2016-7-20 17:24 编辑

“#define  A   const”就是把一个常数const简写成符号A

"#define LCD_REG   ((u32)0x6c000000)
#define LCD_RAM   ((u32)0x6c000001)"
你这样定义符号常量LCD_RAM、 LCD_REG,不就和结构体的成员名重复了吗。虽然语法上能通过,但别人阅读时容易引起混淆

台湾笙泉MCU 发表于 2016-7-21 09:22 | 显示全部楼层
您好,我这边是笙泉总代理,您可以加我QQ3166720948,您可以加我QQ聊下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

58

主题

1426

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部