|
发表于 2024-10-6 21:16:03
|
显示全部楼层
解决了吗?
/****************************************************************************************************
//=========================================电源接线================================================//
// LCD模块 STM32单片机
// VCC 接 DC5V/3.3V //电源
// GND 接 GND //电源地
//=======================================液晶屏数据线接线==========================================//
//本模块默认数据总线类型为SPI总线
// LCD模块 STM32单片机
// MOSI 接 PA7 //液晶屏SPI总线数据写信号
// MISO 接 PA6 //液晶屏SPI总线数据读信号,如果不需要读,可以不接线
//=======================================液晶屏控制线接线==========================================//
// LCD模块 STM32单片机
// LCD_BL 接 PB6 //液晶屏背光控制信号(如果不需要控制,可以不接)
// SCK 接 PA5 //液晶屏SPI总线时钟信号
// LCD_RS 接 PB7 //液晶屏数据/命令控制信号
// RESET 接 PB8 //液晶屏复位控制信号
// LCD_CS 接 PB9 //液晶屏片选控制信号
//=========================================触摸屏触接线=========================================//
//如果模块不带触摸功能或者带有触摸功能,但是不需要触摸功能,则不需要进行触摸屏接线
// LCD模块 STM32单片机
// CTP_INT 接 PA1 //电容触摸屏触摸中断信号
// CTP_SDA 接 PA9 //电容触摸屏IIC总线数据信号
// CTP_RST 接 PA10 //电容触摸屏触摸复位信号
// CTP_SCL 接 PB5 //电容触摸屏IIC总线时钟信号
**************************************************************************************************/
/* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, QD electronic SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
**************************************************************************************************/
#include "lcd.h"
#include "stdlib.h"
//管理LCD重要参数
//默认为竖屏
_lcd_dev lcddev;
//画笔颜色,背景颜色
uint16_t POINT_COLOR = 0x0000,BACK_COLOR = 0xFFFF;
uint16_t DeviceCode;
/*****************************************************************************
* @name :void LCD_WR_REG(uint8_t data)
* @date :2018-08-09
* @function :Write an 8-bit command to the LCD screen
* @parameters :data:Command value to be written
* @retvalue :None
******************************************************************************/
void LCD_WR_REG(uint8_t data)
{
LCD_CS_CLR;
LCD_RS_CLR;
SPI_WriteByte(SPI1,data);
LCD_CS_SET;
}
/*****************************************************************************
* @name :void LCD_WR_DATA(uint8_t data)
* @date :2018-08-09
* @function :Write an 8-bit data to the LCD screen
* @parameters :data:data value to be written
* @retvalue :None
******************************************************************************/
void LCD_WR_DATA(uint8_t data)
{
LCD_CS_CLR;
LCD_RS_SET;
SPI_WriteByte(SPI1,data);
LCD_CS_SET;
}
uint8_t LCD_RD_DATA(void)
{
uint8_t data;
LCD_CS_CLR;
LCD_RS_SET;
SPI1_SetSpeed(0);
data = SPI_ReadByte();
SPI1_SetSpeed(1);
LCD_CS_SET;
return data;
}
/*****************************************************************************
* @name :void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue)
* @date :2018-08-09
* @function :Write data into registers
* @parameters CD_Reg:Register address
LCD_RegValue ata to be written
* @retvalue :None
******************************************************************************/
void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue)
{
LCD_WR_REG(LCD_Reg);
LCD_WR_DATA(LCD_RegValue);
}
uint8_t LCD_ReadReg(uint8_t LCD_Reg)
{
LCD_WR_REG(LCD_Reg);
return LCD_RD_DATA();
}
/*****************************************************************************
* @name :void LCD_WriteRAM_Prepare(void)
* @date :2018-08-09
* @function :Write GRAM
* @parameters :None
* @retvalue :None
******************************************************************************/
void LCD_WriteRAM_Prepare(void)
{
LCD_WR_REG(lcddev.wramcmd);
}
void LCD_ReadRAM_Prepare(void)
{
LCD_WR_REG(lcddev.rramcmd);
}
/*****************************************************************************
* @name :void Lcd_WriteData_16Bit(uint16_t Data)
* @date :2018-08-09
* @function :Write an 16-bit command to the LCD screen
* @parameters ata ata to be written
* @retvalue :None
******************************************************************************/
void Lcd_WriteData_16Bit(uint16_t Data)
{
LCD_CS_CLR;
LCD_RS_SET;
SPI_WriteByte(SPI1,Data>>8);
SPI_WriteByte(SPI1,Data);
LCD_CS_SET;
}
uint16_t Lcd_ReadData_16Bit(void)
{
uint16_t r,g;
LCD_CS_CLR;
LCD_RS_CLR;
SPI_WriteByte(SPI1,lcddev.rramcmd);
SPI1_SetSpeed(0);
LCD_RS_SET;
SPI_ReadByte();
r = SPI_ReadByte();
g = SPI_ReadByte();
LCD_CS_SET;
r<<=8;
r|=g;
return r;
}
/*****************************************************************************
* @name :void LCD_DrawPoint(uint16_t x,uint16_t y)
* @date :2018-08-09
* @function :Write a pixel data at a specified location
* @parameters :x:the x coordinate of the pixel
y:the y coordinate of the pixel
* @retvalue :None
******************************************************************************/
void LCD_DrawPoint(uint16_t x,uint16_t y)
{
LCD_SetCursor(x,y);//设置光标位置
Lcd_WriteData_16Bit(POINT_COLOR);
}
uint16_t LCD_ReadPoint(uint16_t x,uint16_t y)
{
uint16_t color;
LCD_SetCursor(x,y);//设置光标位置
color = Lcd_ReadData_16Bit();
return color;
}
/*****************************************************************************
* @name :void LCD_Clear(uint16_t Color)
* @date :2018-08-09
* @function :Full screen filled LCD screen
* @parameters :color:Filled color
* @retvalue :None
******************************************************************************/
void LCD_Clear(uint16_t Color)
{
unsigned int i,m;
LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);
LCD_CS_CLR;
LCD_RS_SET;
for(i=0;i<lcddev.height;i++)
{
for(m=0;m<lcddev.width;m++)
{
SPI_WriteByte(SPI1,Color>>8);
SPI_WriteByte(SPI1,Color);
}
}
LCD_CS_SET;
}
/*****************************************************************************
* @name :void LCD_RESET(void)
* @date :2018-08-09
* @function :Reset LCD screen
* @parameters :None
* @retvalue :None
******************************************************************************/
void LCD_RESET(void)
{
LCD_RST_CLR;
HAL_Delay(100);
LCD_RST_SET;
HAL_Delay(50);
}
/*****************************************************************************
* @name :void LCD_RESET(void)
* @date :2018-08-09
* @function :Initialization LCD screen
* @parameters :None
* @retvalue :None
******************************************************************************/
void LCD_Init(void)
{
//如果mcu的复位引脚没有引出来,则接PB8,调用下列复位函数
LCD_RESET(); //LCD 复位
//*************3.5 ST7796S IPS初始化**********//
LCD_WR_REG(0x11);
HAL_Delay(120); //Delay 120ms
LCD_WR_REG(0x36); // Memory Data Access Control MY,MX~~
LCD_WR_DATA(0x48);
LCD_WR_REG(0x3A);
LCD_WR_DATA(0x55); //LCD_WR_DATA(0x66);
LCD_WR_REG(0xF0); // Command Set Control
LCD_WR_DATA(0xC3);
LCD_WR_REG(0xF0);
LCD_WR_DATA(0x96);
LCD_WR_REG(0xB4);
LCD_WR_DATA(0x01);
LCD_WR_REG(0xB7);
LCD_WR_DATA(0xC6);
//LCD_WR_REG(0xB9);
//LCD_WR_DATA(0x02);
//LCD_WR_DATA(0xE0);
LCD_WR_REG(0xC0);
LCD_WR_DATA(0x80);
LCD_WR_DATA(0x45);
LCD_WR_REG(0xC1);
LCD_WR_DATA(0x13); //18 //00
LCD_WR_REG(0xC2);
LCD_WR_DATA(0xA7);
LCD_WR_REG(0xC5);
LCD_WR_DATA(0x0A);
LCD_WR_REG(0xE8);
LCD_WR_DATA(0x40);
LCD_WR_DATA(0x8A);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x29);
LCD_WR_DATA(0x19);
LCD_WR_DATA(0xA5);
LCD_WR_DATA(0x33);
LCD_WR_REG(0xE0);
LCD_WR_DATA(0xD0);
LCD_WR_DATA(0x08);
LCD_WR_DATA(0x0F);
LCD_WR_DATA(0x06);
LCD_WR_DATA(0x06);
LCD_WR_DATA(0x33);
LCD_WR_DATA(0x30);
LCD_WR_DATA(0x33);
LCD_WR_DATA(0x47);
LCD_WR_DATA(0x17);
LCD_WR_DATA(0x13);
LCD_WR_DATA(0x13);
LCD_WR_DATA(0x2B);
LCD_WR_DATA(0x31);
LCD_WR_REG(0xE1);
LCD_WR_DATA(0xD0);
LCD_WR_DATA(0x0A);
LCD_WR_DATA(0x11);
LCD_WR_DATA(0x0B);
LCD_WR_DATA(0x09);
LCD_WR_DATA(0x07);
LCD_WR_DATA(0x2F);
LCD_WR_DATA(0x33);
LCD_WR_DATA(0x47);
LCD_WR_DATA(0x38);
LCD_WR_DATA(0x15);
LCD_WR_DATA(0x16);
LCD_WR_DATA(0x2C);
LCD_WR_DATA(0x32);
LCD_WR_REG(0xF0);
LCD_WR_DATA(0x3C);
LCD_WR_REG(0xF0);
LCD_WR_DATA(0x69);
HAL_Delay(120);
LCD_WR_REG(0x21);
LCD_WR_REG(0x29);
LCD_direction(USE_HORIZONTAL);//设置LCD显示方向
LCD_Clear(WHITE);//清全屏白色
}
/*****************************************************************************
* @name :void LCD_SetWindows(uint16_t xStar, uint16_t yStar,uint16_t xEnd,uint16_t yEnd)
* @date :2018-08-09
* @function :Setting LCD display window
* @parameters :xStar:the bebinning x coordinate of the LCD display window
yStar:the bebinning y coordinate of the LCD display window
xEnd:the endning x coordinate of the LCD display window
yEnd:the endning y coordinate of the LCD display window
* @retvalue :None
******************************************************************************/
void LCD_SetWindows(uint16_t xStar, uint16_t yStar,uint16_t xEnd,uint16_t yEnd)
{
LCD_WR_REG(lcddev.setxcmd);
LCD_WR_DATA(xStar>>8);
LCD_WR_DATA(0x00FF&xStar);
LCD_WR_DATA(xEnd>>8);
LCD_WR_DATA(0x00FF&xEnd);
LCD_WR_REG(lcddev.setycmd);
LCD_WR_DATA(yStar>>8);
LCD_WR_DATA(0x00FF&yStar);
LCD_WR_DATA(yEnd>>8);
LCD_WR_DATA(0x00FF&yEnd);
LCD_WriteRAM_Prepare(); //开始写入GRAM
}
/*****************************************************************************
* @name :void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)
* @date :2018-08-09
* @function :Set coordinate value
* @parameters :Xpos:the x coordinate of the pixel
Ypos:the y coordinate of the pixel
* @retvalue :None
******************************************************************************/
void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)
{
LCD_SetWindows(Xpos,Ypos,Xpos,Ypos);
}
/*****************************************************************************
* @name :void LCD_direction(uint8_t direction)
* @date :2018-08-09
* @function :Setting the display direction of LCD screen
* @parameters :direction:0-0 degree
1-90 degree
2-180 degree
3-270 degree
* @retvalue :None
******************************************************************************/
void LCD_direction(uint8_t direction)
{
lcddev.setxcmd=0x2A;
lcddev.setycmd=0x2B;
lcddev.wramcmd=0x2C;
lcddev.rramcmd=0x2E;
lcddev.dir = direction%4;
switch(lcddev.dir){
case 0:
lcddev.width=LCD_W;
lcddev.height=LCD_H;
LCD_WriteReg(0x36,(1<<3)|(1<<6));
break;
case 1:
lcddev.width=LCD_H;
lcddev.height=LCD_W;
LCD_WriteReg(0x36,(1<<3)|(1<<5));
break;
case 2:
lcddev.width=LCD_W;
lcddev.height=LCD_H;
LCD_WriteReg(0x36,(1<<3)|(1<<7));
break;
case 3:
lcddev.width=LCD_H;
lcddev.height=LCD_W;
LCD_WriteReg(0x36,(1<<3)|(1<<7)|(1<<6)|(1<<5));
break;
default:break;
}
}
uint16_t LCD_Read_ID(void)
{
uint8_t i,val[3] = {0};
LCD_WR_REG(0xF0); // Command Set Control
LCD_WR_DATA(0xC3);
LCD_WR_REG(0xF0);
LCD_WR_DATA(0x96);
LCD_CS_CLR;
for(i=1;i<4;i++)
{
LCD_RS_CLR;
SPI_WriteByte(SPI1,0xFB);
LCD_RS_SET;
SPI_WriteByte(SPI1,0x10+i);
LCD_RS_CLR;
SPI_WriteByte(SPI1,0xD3);
SPI1_SetSpeed(0);
LCD_RS_SET;
val[i-1] = SPI_WriteByte(SPI1,0xFF);
SPI1_SetSpeed(1);
LCD_RS_CLR;
SPI_WriteByte(SPI1,0xFB);
LCD_RS_SET;
SPI_WriteByte(SPI1,0x00);
}
LCD_CS_SET;
LCD_WR_REG(0xF0); // Command Set Control
LCD_WR_DATA(0x3C);
LCD_WR_REG(0xF0);
LCD_WR_DATA(0x69);
lcddev.id=val[1];
lcddev.id<<=8;
lcddev.id|=val[2];
return lcddev.id;
}
我这个可以读ID但是是花屏
|
|