战舰LCD小问题,请求大家指点

2019-10-15 20:28发布

//LCD???·?á????
typedef struct
{
 u16 LCD_REG;
 u16 LCD_RAM;
} LCD_TypeDef;
//????NOR/SRAM?? Bank1.sector4,???·??HADDR[27,26]=11 A10×÷???????ü????·???
//×????è???±STM32?????á????????????! 111110=0X3E      
#define LCD_BASE        ((u32)(0x6C000000 | 0x000007FE))
#define LCD             ((LCD_TypeDef *) LCD_BASE)     依我自己的理解,这样定义也行啊,可实际是不行的,请问差在哪?

//LCD???·?á????
typedef struct
{
 u32 LCD_REG;
 u32 LCD_RAM;

} LCD_TypeDef;
//????NOR/SRAM?? Bank1.sector4,???·??HADDR[27,26]=11 A10×÷???????ü????·???
//×????è???±STM32?????á????????????! 111110=0X3E      
#define LCD_BASE        ((u32)(0x6C000000 | 0x000007FC))
#define LCD             ((LCD_TypeDef *) LCD_BASE)

  A10的话数据和命令的控制信号是0x000007fe,结构体中定义的是16位的变量,两字节加上2就是RAM地址0x00000800.   如果定义的是32位的变量,是不是就是0x000007fc,四字节加上四后就是RAM的地址0x00000800了,但就是不好使,为什么呢?是因为给LCD的数据或是命令是16位的,结构体中就得定义成16位的变量吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
八度空间
1楼-- · 2019-10-15 21:50
1612103064 发表于 2016-12-26 20:52
2.//写寄存器函数
//regval:寄存器值
void LCD_WR_REG(u16 regval)

1、LCD->LCD_REG这个是FSMC的地址,regval这个是要写入的数据
2、LCD->LCD_RAM这个也是FSMC的地址
3、两个不同的地址,控制的就是FMSC的地址管脚FSMC_Ax,通过硬件连接,实际上就是控制LCD的RS管脚,让LCD知道此时发送过来的数据是个什么东西
正点原子
2楼-- · 2019-10-16 01:12
 精彩回答 2  元偷偷看……
正点妹子
3楼-- · 2019-10-16 06:09
回复【2楼】正点原子:
---------------------------------
原子哥好
      咱要的不就是那个LCD_REG,LCD_RAM的地址么,然后往这两个地址写数据就相当于向LCD写数据和命令了,LCD_REG/LCD_RAM是多少位的有什么关系啊
八度空间
4楼-- · 2019-10-16 11:23
回复【3楼】正点妹子:
---------------------------------
LCD_REG/LCD_RAM这两个东西是定义了FSMC的相关地址变量,看#define LCD_BASE        ((u32)(0x6C000000 | 0x000007FE))
#define LCD             ((LCD_TypeDef *) LCD_BASE)这里就强制性转换成结构体的指针了,当你往LCD_REG送数据的时候就是往0x6C000000 | 0x000007FE这个地址上面放上数据,如同51上的P0 = 0XFF一样,仔细看下有关于STM32的FSMC的介绍吧

我的这样写的
#define LCD_REG_ADD           ((u32)(0x6c000000 | 0x000007fe)) //寄存器地址,命令,RS = 0
      #define LCD_DAT_ADD           ((u32)(0x6c000000 | 0x00000800)) //显示数据地址,显示RAM,RS = 1

      #define LCD_WR_REG(index)     ((*(__IO u16 *)(LCD_REG_ADD)) = ((u16)index))
                                    //写LCD寄存器写入数值index
      #define LCD_WR_Data(val)      ((*(__IO u16 *)(LCD_DAT_ADD)) = ((u16)val))
                                    //往LCD的RAM写入数据val
八度空间
5楼-- · 2019-10-16 14:06
回复【3楼】正点妹子:
---------------------------------
LCD的寄存器数据是16位的,加上FSMC的数据总线也是16位的,所以你如果定义成了32位的话就访问两次了
正点妹子
6楼-- · 2019-10-16 14:33
回复【4楼】Badu_Space:
---------------------------------
谢谢您  您说的这个我明白,但是咱要的不就是那个LCD_REG,LCD_RAM的地址么,然后往这两个地址写数据就相当于向LCD写数据和命令了,LCD_REG/LCD_RAM是多少位的有什么关系啊? 如果我驱动八位的液晶,得定义成多少位的?      我知道我的问题很愚蠢,但就是没转过弯了,卡住了,谢谢不厌其烦的解答

一周热门 更多>