STM32F429GD32F450液晶RGBLCD驱动代码使⽤这段代码还需要使⽤SDRAM模块月光光吉他谱
⼯程代码可以参考正点原⼦的例程
LCD.h
#ifndef __LCD_H
#define __LCD_H
#include"sys.h"
#include"stdlib.h"
#include"delay.h"
//LCD重要参数集
typedef struct
{
uint16_t width;//LCD 宽度
uint16_t height;//LCD ⾼度
uint16_t id;//LCD ID
uint8_t  dir;//横屏还是竖屏控制:0,竖屏;1,横屏。
uint16_t wramcmd;//开始写gram指令
uint16_t setxcmd;//设置x坐标指令
uint16_t setycmd;//设置y坐标指令
}_lcd_dev;
//LCD参数
extern _lcd_dev lcddev;//管理LCD重要参数
//LCD的画笔颜⾊和背景⾊
#define DEFAULT_POINT_COLOR  YELLOW;//默认画笔颜⾊
#define DEFAULT_BACK_COLOR    BLACK;//默认背景颜⾊
extern uint32_t  PointColor;//画笔颜⾊,默认黄⾊
extern uint32_t  BackColor;//背景颜⾊,默认为⿊⾊
//
//LCD地址结构体
typedef struct
{
vuint16_t LCD_REG;
vuint16_t LCD_RAM;
} LCD_TypeDef;
/
/使⽤NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A18作为数据命令区分线
//注意设置时STM32内部会右移⼀位对其!
#define LCD_BASE        ((uint32_t)(0x60000000 | 0x0007FFFE))
#define LCD            ((LCD_TypeDef *) LCD_BASE)
//
//扫描⽅向定义
#define L2R_U2D  0  //从左到右,从上到下
#define L2R_D2U  1  //从左到右,从下到上
#define R2L_U2D  2  //从右到左,从上到下
#define R2L_D2U  3  //从右到左,从下到上
#define U2D_L2R  4  //从上到下,从左到右
#define U2D_R2L  5  //从上到下,从右到左
#define D2U_L2R  6  //从下到上,从左到右
#define D2U_R2L  7  //从下到上,从右到左
#define DFT_SCAN_DIR  L2R_U2D  //默认的扫描⽅向
//颜⾊
#define WHITE          0x0000FFFF //⽩⾊
#define BLACK          0x00000000 //⿊⾊
#define BLUE          0x0000001F //蓝⾊
老吉他
#define RED            0x0000F800 //红⾊
#define RED            0x0000F800 //红⾊
#define GREEN          0x000007E0 //绿⾊
#define YELLOW          0x0000FFE0 //黄⾊
#define BROWN    0X0000BC40 //棕⾊
#define BRRED    0X0000FC07 //棕红⾊
#define GRAY      0X00008430 //灰⾊
//左右屏
#define LEFT      0
#define RIGHT    1
void LCD_Init(void);//初始化
void LCD_DisplayOn(void);//开显⽰
void LCD_DisplayOff(void);//关显⽰
void LCD_BlackLightOn(void);//点亮背光
void LCD_BlackLightOff(void);//熄灭背光
void LCD_Clear(uint32_t Color);//清屏
void LCD_DrawPoint(uint16_t x,uint16_t y);//画点
林妹妹爱上了贾宝玉djvoid LCD_Fast_DrawPoint(uint16_t x,uint16_t y,uint32_t color);//快速画点
uint32_t  LCD_ReadPoint(uint16_t x,uint16_t y);//读点
void LCD_Draw_Circle(uint16_t x0,uint16_t y0,uint8_t r);//画圆
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);//画线
void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);//画矩形
void LCD_DrawCheckBox(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2);//画矩形复选框
void LCD_FillCheckBox(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2,uint32_t color);//填充复选框
void LCD_DrawTriangle(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2,uint16_t x,uint16_t y);//画三⾓形
void LCD_DrawTriangleRE(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2,uint16_t x,uint16_t y);//画反向三⾓形
void LCD_DrawHistogram(uint16_t x,uint16_t y,uint16_t w);//画柱形图
void LCD_FillHistogram(uint16_t x,uint16_t y,uint16_t w,uint16_t value,uint16_t range);//填充柱形图
void LCD_DrawHistogramLimit(uint16_t x,uint16_t y,uint16_t w,uint16_t limit,uint16_t range);//画柱状图上限值线
void LCD_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint32_t color);//填充单⾊
void LCD_Color_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t *color);//填充指定颜⾊
void LCD_ShowChar(uint16_t x,uint16_t y,char num,uint8_t size,uint8_t mode);//显⽰⼀个字符
void LCD_ShowString(uint16_t x,uint16_t y,uint16_t width,uint16_t height,uint8_t size,volatile char*p);//显⽰⼀个字符串,12/16字体void Show_Font(uint16_t x,uint16_t y,uint8_t size,const volatile char*p, uint8_t mode);//显⽰⼀个汉字
void LCD_ShowPicture(uint16_t x,uint16_t y,uint16_t width,uint16_t heigth,const uint8_t *data,uint8_t mode);//显⽰⼀个单⾊位图void LCD_ShowText(uint16_t x,uint16_t y,uint16_t width,uint16_t height,volatile char*str,uint8_t size,uint8_t mode);//显⽰⽂本(带汉字) char*FloatAsc2Right(float value, uint8_t dot);//把浮点数转换成字符串(右对齐)
char*FloatAsc2Left(float value, uint8_t dot);//把浮点数转换成字符串(左对齐)
void LCD_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue);
uint16_t  LCD_ReadReg(uint16_t LCD_Reg);
void LCD_WriteRAM_Prepare(void);
void LCD_WriteRAM(uint16_t RGB_Code);
我的心太乱mvvoid LCD_Display_Dir(uint8_t dir);//设置屏幕显⽰⽅向
void LCD_Set_Window(uint16_t sx,uint16_t sy,uint16_t width,uint16_t height);//设置窗⼝
//LCD分辨率设置
#define LCD_HOR_RESOLUTION  640  //LCD⽔平分辨率
#define LCD_VER_RESOLUTION  480  //LCD垂直分辨率
//LCD驱动参数设置
#define LCD_HOR_PULSE_WIDTH  1  //⽔平脉宽
#define LCD_HOR_BACK_PORCH  144  //⽔平后廊
#define LCD_HOR_FRONT_PORCH  16  //⽔平前廊
#define LCD_VER_PULSE_WIDTH  1  //垂直脉宽
#define LCD_VER_BACK_PORCH  35  //垂直后廊
#define LCD_VER_FRONT_PORCH  10  //垂直前廊
//如下⼏个参数,⾃动计算
#define LCD_HT (LCD_HOR_RESOLUTION+LCD_HOR_BACK_PORCH+LCD_HOR_FRONT_PORCH)
#define LCD_HPS (LCD_HOR_BACK_PORCH)
#define LCD_VT  (LCD_VER_RESOLUTION+LCD_VER_BACK_PORCH+LCD_VER_FRONT_PORCH)
#define LCD_VPS (LCD_VER_BACK_PORCH)
#endif
LCD.c
#include"lcd.h"
#include"stdlib.h"
#include"font.h"
#include"usart.h"
#include"delay.h"
#include"ltdc.h"
/** \addtogroup lcd_group 液晶显⽰模块 */
/*@{*/
//LCD的画笔颜⾊和背景⾊
uint32_t PointColor=DEFAULT_POINT_COLOR;//画笔颜⾊uint32_t BackColor =DEFAULT_BACK_COLOR;//背景⾊
//管理LCD重要参数
//默认为竖屏
_lcd_dev lcddev;
/**
* \brief      函数功能:写寄存器函数
*
* \param[in]  regval:寄存器值
*
* \return
*
*/
void LCD_WR_REG(vuint16_t regval)
{
regval=regval;//使⽤-O2优化的时候,必须插⼊的延时
LCD->LCD_REG=regval;//写⼊要写的寄存器序号
}
/**
* \brief      函数功能:写LCD数据
*
* \param[in]  data:要写⼊的值
*
* \return
*wangrong
*/
void LCD_WR_DATA(vuint16_t data)
{
data=data;//使⽤-O2优化的时候,必须插⼊的延时
LCD->LCD_RAM=data;
}
/
**
* \brief      函数功能:读LCD数据
*
* \param[in]
*
* \return    读到的值
*
*/
uint16_t LCD_RD_DATA(void)
{
vuint16_t ram;//防⽌被优化
ram=LCD->LCD_RAM;
return ram;
}
/**
* \brief      函数功能:写寄存器
*
* \param[in]  LCD_Reg:寄存器地址
*            LCD_RegValue:要写⼊的数据
* \return
*
*/
void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue) {
LCD->LCD_REG = LCD_Reg;//写⼊要写的寄存器序号
LCD->LCD_RAM = LCD_RegValue;//写⼊数据
}
/**
/**
* \brief      函数功能:读寄存器
*
* \param[in]  LCD_Reg:寄存器地址
*
* \return  读到的数据
*
*/
uint16_t LCD_ReadReg(uint16_t LCD_Reg)
{
LCD_WR_REG(LCD_Reg);//写⼊要读的寄存器序号
delay_us(5);
return LCD_RD_DATA();//返回读到的值
}
/**
* \brief      函数功能:开始写GRAM
*
* \param[in]
*
* \return
2011年新歌*
*/
void LCD_WriteRAM_Prepare(void)
{
LCD->LCD_REG=lcddev.wramcmd;
}
/**
* \brief      函数功能:LCD写GRAM
*
* \param[in]  RGB_Code:颜⾊值
*
* \return
*
*/
void LCD_WriteRAM(uint16_t RGB_Code)
{
LCD->LCD_RAM = RGB_Code;//写⼗六位GRAM
}
/**
* \brief      函数功能:当mdk -O1时间优化时需要设置
*
* \param[in]  i:延时
*
* \return
*
*/
void opt_delay(uint8_t i)
{
while(i--);
}
/
**
* \brief      函数功能:读取个某点的颜⾊值
*
* \param[in]  x,y:坐标
*
* \return    此点的颜⾊
*
*/
uint32_t LCD_ReadPoint(uint16_t x,uint16_t y)
{
if(x>=lcddev.width||y>=lcddev.height)return0;//超过了范围,直接返回return LTDC_Read_Point(x,y);
}
/**
* \brief      函数功能:LCD开启显⽰
*
* \param[in]
*
* \return
*
*/
void LCD_DisplayOn(void)
void LCD_DisplayOn(void)
{
LTDC_Switch(1);//开启LCD
}
/**
* \brief      函数功能:LCD关闭显⽰
*
* \param[in]
*
* \return
*
*/
void LCD_DisplayOff(void)
{
LTDC_Switch(0);//关闭LCD
}
/**
* \brief      函数功能:点亮LCD背光
*
* \param[in]
*
* \return
*
*/
void LCD_BlackLightOn(void)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET); }
/**
* \brief      函数功能:熄灭LCD背光
*
* \param[in]
*
* \return
*
*/
void LCD_BlackLightOff(void)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET); }
/**
* \brief      函数功能:画点
*
* \param[in]  x,y:坐标
*            PointColor:此点的颜⾊
* \return
*
*/
void LCD_DrawPoint(uint16_t x,uint16_t y)
{
LTDC_Draw_Point(x,y,PointColor);
}
/**
* \brief      函数功能:快速画点
*
* \param[in]  x,y:坐标
*            color:颜⾊
* \return
*
*/
void LCD_Fast_DrawPoint(uint16_t x,uint16_t y,uint32_t color) {
LTDC_Draw_Point(x,y,color);
return;
}
/**
* \brief      函数功能:设置LCD显⽰⽅向
*
* \param[in]  dir:0,竖屏;1,横屏
*
* \return
*
*/
void LCD_Display_Dir(uint8_t dir)