单片机学习小组
直播中

陈博

13年用户 591经验值
擅长:12268
私信 关注

如何对STM32F427VGT6的LCD进行配置

如何对STM32F427VGT6的LCD进行配置?

如何对STM32CubeMX的LCD触摸屏进行配置呢?


回帖(1)

王秀华

2022-2-21 09:25:45
STM32F427V系列的触摸屏驱动

提示:本程序主控为STM32F427VGT6,
LCD驱动为ILI9341
触摸驱动为2046
  前言

一、STM32CubeMX LCD配置

1,配置FMC

a,选择FMC


b,配置为LCD模式


注:LCD Register Select的选择要根据硬件设计来选择,以下为本例程的LCD接口原理图

c,配置时钟


注:以上数据可达最大刷新率
2,配置TIM作为LCD的专用延时函数

若程序中未添加滴答时钟写的延时函数则可按如下配置

3,LCD程序

到此,LCD配置结束,生成工程,添加lcd.c和lcd.h,直接调用相关API即可。

部分API函数:
void LCD_Init(void);                                                                                                                   //初始化
void LCD_DisplayOn(void);                                                                                                        //开显示
void LCD_DisplayOff(void);                                                                                                //关显示
void LCD_Clear(uint16_t Color);                                                                                 //清屏
void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos);                                                                                //设置光标
void LCD_DrawPoint(uint16_t x,uint16_t y,uint16_t RGB_Code)        ;                                //画点
void LCD_Fast_DrawPoint(uint16_t x,uint16_t y,uint16_t color);                        //快速画点
uint16_t  LCD_ReadPoint(uint16_t x,uint16_t y);                                                                                 //读点
void Draw_Circle(uint16_t x0,uint16_t y0,uint8_t r, uint16_t RGB_Code);                                        //画圆
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2,uint16_t RGB_Code);                        //画线
void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t RGB_Code);                           //画矩形
void LCD_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_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,uint8_t num,uint8_t size, uint16_t RGB_Code ,uint16_t back_color);                                                //显示一个字符
void LCD_ShowNum(uint16_t x,uint16_t y,uint32_t num,uint8_t len,uint8_t size ,uint16_t RGB_Code,uint16_t back_color); //显示一个数字
void LCD_ShowxNum(uint16_t x,uint16_t y,uint32_t num,uint8_t len,uint8_t size, uint16_t RGB_Code,uint16_t back_color);//显示 数字
提示:相关代码在后续附件中
二、STM32CubeMX LCD触摸屏配置

1,配置相关IO

a,原理图的接口


b,IO配置

T_MISO、T_PEN 配置为输入模式
T_MOSI、T_CS 、T_SCK配置为输出模式

2,程序

添加

到本工程中
stmflash.c用于储存触摸的校验数据
a,部分API


void TP_Write_Byte(uint8_t num);                                                //向控制芯片写入一个数据
uint16_t TP_Read_AD(uint8_t CMD);                                                        //读取AD转换值
uint16_t TP_Read_XOY(uint8_t xy);                                                        //带滤波的坐标读取(X/Y)
uint8_t TP_Read_XY(uint16_t *x,uint16_t *y);                                        //双方向读取(X+Y)
uint8_t TP_Read_XY2(uint16_t *x,uint16_t *y);                                        //带加强滤波的双方向坐标读取
void TP_Drow_Touch_Point(uint16_t x,uint16_t y,uint16_t color);//画一个坐标校准点
void TP_Draw_Big_Point(uint16_t x,uint16_t y,uint16_t color);        //画一个大点
void TP_Save_Adjdata(void);                                                //保存校准参数
uint8_t TP_Get_Adjdata(void);                                                //读取校准参数
void TP_Adjust(void);                                                        //触摸屏校准
void TP_Adj_Info_Show(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2,uint16_t x3,uint16_t y3,uint16_t fac);//显示校准信息
//电阻屏/电容屏 共用函数
uint8_t TP_Scan(uint8_t tp);                                                                //扫描
uint8_t TP_Init(void);                                                                //初始化


void Load_Drow_Dialog(void);        //清空屏幕并在右上角显示"Clear"
void rtp_test(void);                //电阻触摸屏测试函数
2,使用说明

在LCD初始化后调用tp_dev.init(); 触摸初始化,然后可以试用rtp_test()触摸测试函数。
也可编写自己的触摸功能函数
例子:

tp_dev.scan(0);                        //触摸扫描
if(tp_dev.sta&TP_PRES_DOWN)                        //触摸屏被按下
{       
        if(tp_dev.x[0]         {
                if(tp_dev.x[0] > x1 && tp_dev.x[0] < x2 && tp_dev.y[0] > y1 && tp_dev.y[0] < y2)                //判断按下的坐标与目标坐标是否相等
                {
                        //然后执行相应功能即可
                }
        }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分