【正点原子探索者STM32F4】TFTLCD实验学习记录

本文详细介绍了如何在STM32F407单片机上连接4.3寸LCD屏幕,包括硬件连接、变量类型定义、LCD参数和地址结构体、以及六个基本函数的实现,如坐标设置、画点、读点、字符显示和LCD初始化,为STM32F4的使用者提供了一个实践教程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

硬件

STM32F407、4.3寸LCD屏

硬件连接

在这里插入图片描述

LCD_BL(背光控制)对应 PB15;
LCD_CS 对应 PG12 即 FSMC_NE4;
LCD _RS 对应 PF12 即 FSMC_A6;
LCD _WR 对应 PD5 即 FSMC_NWE;
LCD _RD 对应 PD4 即 FSMC_NOE;
LCD _D[15:0]则直接连接在 FSMC_D15~FSMC_D0;

软件设计

变量类型定义

LCD参数结构体

//LCD重要参数集
typedef struct  
{
   
   										    
	u16 width;			//LCD 宽度
	u16 height;			//LCD 高度
	u16 id;				//LCD ID
	u8  dir;			//横屏还是竖屏控制:0,竖屏;1,横屏。	
	u16	wramcmd;		//开始写gram指令
	u16  setxcmd;		//设置x坐标指令
	u16  setycmd;		//设置y坐标指令 
}_lcd_dev; 	  

LCD地址结构体

LCD _RS 对应 PF12,即 FSMC_A6,RS:命令/数据标志(0,读写命令; 1,读写数据)
STM32F4 的 FSMC 存储块 1(Bank1)被分为 4 个区,每个区管理 64M 字节空间,每个区都有独立的寄存器对所连接的存储器进行配置。
Bank1 的 256M 字节空间由 28 根地址线(HADDR[27:0])寻址。
228 等价于210 ×210 ×256 ,** 对应256M的字节。**
这 里 HADDR 是内 部 AHB 地址总 线 ,其 中 HADDR[25:0]来自外部存储器地 址FSMC_A[25:0],而 HADDR[26:27]对 4 个区进行寻址。
在这里插入图片描述

这里 LCD是 16 位宽度存储器: HADDR[25:1]→ FSMC_A[24:0],16位正好是2个字节,所以地址是一个隔一个,即低位都为0.相当于右移了一位。因此,FSMC_A[6]对应0x00000080,作为数据的地址偏移量,此地址减2得到命令的地址偏移量。
不论外部接 8 位/16 位宽设备, FSMC_A[0]永远接在外部设备地址 A[0]。

//LCD地址结构体
typedef struct
{
   
   
	vu16 LCD_REG;//命令变量  ((u32)(0x6C000000 | 0x0000007E))
	vu16 LCD_RAM;//数据变量  ((u32)(0x6C000000 | 0x00000080))
} LCD_TypeDef;
//使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A6作为数据命令区分线 
//注意设置时STM32内部会右移一位对其! 111 1110=0X7E			    
#define LCD_BASE        ((u32)(0x6C000000 | 0x0000007E))
#define LCD             ((LCD_TypeDef *) LCD_BASE)//强制类型转换,LCD为LCD_TypeDef的指针

函数定义

读写命令和数据简介

LCD->LCD_REG=CMD; //写命令
LCD->LCD_RAM=DATA; //写数据
CMD= LCD->LCD_REG;//读 LCD 寄存器
DATA = LCD->LCD_RAM;//读 LCD 数据

6个基本函数

//写寄存器函数
//regval:寄存器值
void LCD_WR_REG(vu16 regval)
{
   
    
	regval=regval; //使用-O2 优化的时候,必须插入的延时
	LCD->LCD_REG=regval;//写入要写的寄存器序号
}

//写 LCD 数据
//data:要写入的值
void LCD_WR_DATA(vu16 data)
{
   
    
	data=data; //使用-O2 优化的时候,必须插入的延时
	LCD->LCD_RAM=data;
}
//读 LCD 数据
//返回值:读到的值
u16 LCD_RD_DATA(void)
{
   
    
	vu16 ram; //防止被优化
	ram=LCD->LCD_RAM;
	return ram;
}
//写寄存器
//LCD_Reg:寄存器地址
//LCD_RegValue:要写入的数据
void LCD_WriteReg(vu16 LCD_Reg, vu16 LCD_RegValue)
{
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值