STM32使用FSMC驱动LCD

关于FSMC驱动LCD的函数LCD_WR_REG的理解

    • 首先你需要理解使用结构体LCD_BASE
    • 若有错误,请各位师兄师姐指点
  • 原理框图
    • 重要的函数理解
    • 关于LCD_BASE和函数LCD_WR_REG(u16 regval)的理解
    • 至于0X6C00 0802地址也是一样的。
    • LCD显示实验之函数***LCD_SetCursor***

首先要说的是这是我个人的理解,很可能是错的!!!!!
首先要说的是这是我个人的理解,很可能是错的!!!!!
首先要说的是这是我个人的理解,很可能是错的!!!!!
首先要说的是这是我个人的理解,很可能是错的!!!!!
首先要说的是这是我个人的理解,很可能是错的!!!!!
首先要说的是这是我个人的理解,很可能是错的!!!!!

首先你需要理解使用结构体LCD_BASE


若有错误,请各位师兄师姐指点


原理框图

STM32使用FSMC驱动LCD_第1张图片
至于这里其中的详细讲解,可以参考:https://blog.csdn.net/RongLin02/article/details/121445952

重要的函数理解

首先来看一个结构体:
STM32使用FSMC驱动LCD_第2张图片
然后是几个非常重要的函数:
STM32使用FSMC驱动LCD_第3张图片
在这里我们先解释第一个函数:

void LCD_WR_REG(u16 regval)
{
	LCD->LCD_REG = regval;        //写入要写的寄存器序号
}

调用这个函数:

int main() {
	LCD_WR_REG(0xd3);	
}

关于LCD_BASE和函数LCD_WR_REG(u16 regval)的理解

在LCD_WR_REG函数中,可以发现居然是直接给LCD_REG赋值,很奇怪是吧,(这里用VS跑了一下输出LCD_REG居然是coredump)。

然后找了一些资料,发现说FSMC已经将地址0X6C00 07FE映射了(如何映射我也不知道)
这里的大概意思是向LCD_REG这个地址所指向的空间写入0XD3,然后FSMC自动通过数据线FSMC_D[15:0]发给LCD了。
也就是说这里的
LCD->LCD_REG = regval
的操作相当于
int *p; *p = regval;
这就是说并没有改变p(指针的值,即LCD_REG所指向的地址是0X6C00 07FE,那么就是说FSMC_A[0:25]其中的A10即LCD的RS没有改变,仍然是0)的值,那么就实现了向LCD写数据/命令的效果。
STM32使用FSMC驱动LCD_第4张图片

至于0X6C00 0802地址也是一样的。

LCD显示实验之函数LCD_SetCursor

函数实现:

void LCD_SetCursor(u16 Xpos, u16 Ypos){

	if (lcddev.id == 0x9341) {
	
		LCD_WR_REG(lcddev.setxcmd);
		LCD_WR_DATA((Xpos>>8));
		LCD_WR_DATA((Xpos & 0XFF));
		
		LCD_WR_REG(lcddev.setycmd);
		LCD_WR_DATA(Ypos>>8);
		LCD_WR_DATA(Ypos&0xff);
  }
}

就是说先发送了X坐标的高八位,然后发送了X坐标的低八位
即下图中的SC0-SC15
STM32使用FSMC驱动LCD_第5张图片
因为设置LCD的命令时,其数据宽度为8bit,所以需要先设置8位设置一次

你可能感兴趣的:(STM32,FSMC,stm32,单片机,嵌入式硬件)