本帖最后由 余金渠 于 2022-5-4 13:02 编辑
五一调试了以前买的LCD屏淘宝链接
商家给的资料只有51的我用51测试可以正常显示于是乎我想移植到HC32F460(Cortex-M4)中不过调试了2天半只是得到了个雪花屏的结果。
由于手上没有合适的拍摄工具只能给张差不多的图片
而且这是在初始化阶段就会出现的而不是调用显示字符函数时出现的,我初始化的参数全是照着51代码写的不知道是不是对齐的问题
后天就要去学校了在此把代码发出,不要求各位大佬给出完整解决方案,给个思路就行用以帮助我在下周的调试。希望能得到大家的回复。
我把代码和商家给的资料放在百度网盘了就不站论坛的空间了
链接:https://pan.baidu.com/s/1tMcx3yPxhYUFOMei0TagDQ
提取码:jgr4
还有初始化单片机代码贴在下面
- #include "lcd_init.h"
- void LCD_GPIO_Init(void)
- {
- stc_port_init_t stcPortInit;
- /* configuration structure initialization */
- MEM_ZERO_STRUCT(stcPortInit);
- stcPortInit.enPinMode = Pin_Mode_Out;
- stcPortInit.enExInt = Enable;
- stcPortInit.enPullUp = Enable;
- // PORT_Init(LCD_PIN_PORT , LCD_BLK_PIN | LCD_RST_PIN | LCD_DC_PIN | LCD_SCLK_PIN | LCD_MOSI_PIN
- // | LCD_CS_PIN, &stcPortInit);
- PORT_Init(LCD_PIN_PORT , LCD_BLK_PIN | LCD_RST_PIN | LCD_DC_PIN , &stcPortInit);
- PORT_Unlock();
- M4_PORT->PSPCR = 0x0Bu;
- PORT_Lock();
- LCD_BLK_Clr();
- }
- /******************************************************************************
- 函数说明:LCD串行数据写入函数
- 入口数据:dat 要写入的串行数据
- 返回值: 无
- ******************************************************************************/
- void LCD_Writ_Bus(u8 dat)
- {
- // u8 i;
- // LCD_DC_Set();
- // LCD_CS_Clr();
- // for(i=0;i<8;i++)
- // {
- // if(dat&0x80)
- // {
- // LCD_MOSI_Set();
- // }
- // else LCD_MOSI_Clr();
- // LCD_SCLK_Clr();
- // LCD_SCLK_Set();
- // dat<<=1;
- // }
- //
- // LCD_CS_Set();
- while (Reset == SPI_GetFlag(SPI_UNIT, SpiFlagSendBufferEmpty))
- {}
- SPI_SendData8(SPI_UNIT,dat);
- }
- /******************************************************************************
- 函数说明:LCD写入数据
- 入口数据:dat 写入的数据
- 返回值: 无
- ******************************************************************************/
- void LCD_WR_DATA8(u8 dat)
- {
- LCD_DC_Set();
- LCD_Writ_Bus(dat);
- }
- /******************************************************************************
- 函数说明:LCD写入数据
- 入口数据:dat 写入的数据
- 返回值: 无
- ******************************************************************************/
- void LCD_WR_DATA(u16 dat)
- {
- LCD_Writ_Bus(dat>>8);
- LCD_Writ_Bus(dat);
- }
- /******************************************************************************
- 函数说明:LCD写入命令
- 入口数据:dat 写入的命令
- 返回值: 无
- ******************************************************************************/
- void LCD_WR_REG(u8 dat)
- {
- LCD_DC_Clr();//写命令
- LCD_Writ_Bus(dat);
- }
- /******************************************************************************
- 函数说明:设置起始和结束地址
- 入口数据:x1,x2 设置列的起始和结束地址
- y1,y2 设置行的起始和结束地址
- 返回值: 无
- ******************************************************************************/
- void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
- {
- LCD_WR_REG(0x2a);//列地址设置
- LCD_WR_DATA(x1);
- LCD_WR_DATA(x2);
- LCD_WR_REG(0x2b);//行地址设置
- LCD_WR_DATA(y1);
- LCD_WR_DATA(y2);
- LCD_WR_REG(0x2c);//储存器写
- }
- /******************************************************************************
- 函数说明:LCD初始化函数
- 入口数据:无
- 返回值: 无
- ******************************************************************************/
- void LCD_Init(void)
- {
- if(Chip_Selection==0) //初始化ILI9341
- {
- LCD_GPIO_Init();//初始化GPIO
-
- LCD_RES_Clr();//复位
- Ddl_Delay1ms(50);
- LCD_RES_Set();
- Ddl_Delay1ms(50);
-
- LCD_BLK_Set();//打开背光
- Ddl_Delay1ms(50);
-
- //************* Start Initial Sequence **********//
- LCD_WR_REG(0x11); //Sleep out
- Ddl_Delay1ms(60); //Delay 60ms
- //************* Start Initial Sequence **********//
- LCD_WR_REG(0xCF);
- LCD_WR_DATA8(0x00);
- LCD_WR_DATA8(0xC1);
- LCD_WR_DATA8(0X30);
- LCD_WR_REG(0xED);
- LCD_WR_DATA8(0x64);
- LCD_WR_DATA8(0x03);
- LCD_WR_DATA8(0X12);
- LCD_WR_DATA8(0X81);
- LCD_WR_REG(0xE8);
- LCD_WR_DATA8(0x85);
- LCD_WR_DATA8(0x00);
- LCD_WR_DATA8(0x79);
- LCD_WR_REG(0xCB);
- LCD_WR_DATA8(0x39);
- LCD_WR_DATA8(0x2C);
- LCD_WR_DATA8(0x00);
- LCD_WR_DATA8(0x34);
- LCD_WR_DATA8(0x02);
- LCD_WR_REG(0xF7);
- LCD_WR_DATA8(0x20);
- LCD_WR_REG(0xEA);
- LCD_WR_DATA8(0x00);
- LCD_WR_DATA8(0x00);
- LCD_WR_REG(0xC0); //Power control
- LCD_WR_DATA8(0x1D); //VRH[5:0]
- LCD_WR_REG(0xC1); //Power control
- LCD_WR_DATA8(0x12); //SAP[2:0];BT[3:0]
- LCD_WR_REG(0xC5); //VCM control
- LCD_WR_DATA8(0x33);
- LCD_WR_DATA8(0x3F);
- LCD_WR_REG(0xC7); //VCM control
- LCD_WR_DATA8(0x92);
- LCD_WR_REG(0x3A); // Memory Access Control
- LCD_WR_DATA8(0x55);
- LCD_WR_REG(0x36); // Memory Access Control
- if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x08);
- else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC8);
- else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x78);
- else LCD_WR_DATA8(0xA8);
- LCD_WR_REG(0xB1);
- LCD_WR_DATA8(0x00);
- LCD_WR_DATA8(0x12);
- LCD_WR_REG(0xB6); // Display Function Control
- LCD_WR_DATA8(0x0A);
- LCD_WR_DATA8(0xA2);
- LCD_WR_REG(0x44);
- LCD_WR_DATA8(0x02);
- LCD_WR_REG(0xF2); // 3Gamma Function Disable
- LCD_WR_DATA8(0x00);
- LCD_WR_REG(0x26); //Gamma curve selected
- LCD_WR_DATA8(0x01);
- LCD_WR_REG(0xE0); //Set Gamma
- LCD_WR_DATA8(0x0F);
- LCD_WR_DATA8(0x22);
- LCD_WR_DATA8(0x1C);
- LCD_WR_DATA8(0x1B);
- LCD_WR_DATA8(0x08);
- LCD_WR_DATA8(0x0F);
- LCD_WR_DATA8(0x48);
- LCD_WR_DATA8(0xB8);
- LCD_WR_DATA8(0x34);
- LCD_WR_DATA8(0x05);
- LCD_WR_DATA8(0x0C);
- LCD_WR_DATA8(0x09);
- LCD_WR_DATA8(0x0F);
- LCD_WR_DATA8(0x07);
- LCD_WR_DATA8(0x00);
- LCD_WR_REG(0XE1); //Set Gamma
- LCD_WR_DATA8(0x00);
- LCD_WR_DATA8(0x23);
- LCD_WR_DATA8(0x24);
- LCD_WR_DATA8(0x07);
- LCD_WR_DATA8(0x10);
- LCD_WR_DATA8(0x07);
- LCD_WR_DATA8(0x38);
- LCD_WR_DATA8(0x47);
- LCD_WR_DATA8(0x4B);
- LCD_WR_DATA8(0x0A);
- LCD_WR_DATA8(0x13);
- LCD_WR_DATA8(0x06);
- LCD_WR_DATA8(0x30);
- LCD_WR_DATA8(0x38);
- LCD_WR_DATA8(0x0F);
- LCD_WR_REG(0x29); //Display on
- }
- else //初始化ST7789
- {
- LCD_GPIO_Init();//初始化GPIO
- LCD_RES_Set();//复位
- Ddl_Delay1ms(50);
- LCD_RES_Clr();
- Ddl_Delay1ms(50);
- LCD_RES_Set();
- Ddl_Delay1ms(50);
- LCD_BLK_Set();//打开背光
- Ddl_Delay1ms(250);
- LCD_WR_REG(0x11);
- Ddl_Delay1ms(60);//Delay 20ms
- //************* Start Initial Sequence **********//
- //------------------------------display and color format setting--------------------------------//
-
- LCD_WR_REG(0X36);// Memory Access Control
- if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00);
- else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0);
- else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70);
- else LCD_WR_DATA8(0xA0);
- LCD_WR_REG(0X3A);
- LCD_WR_DATA8(0X05);
- //--------------------------------ST7789S Frame rate setting-------------------------
- LCD_WR_REG(0xb2);
- LCD_WR_DATA8(0x0c);
- LCD_WR_DATA8(0x0c);
- LCD_WR_DATA8(0x00);
- LCD_WR_DATA8(0x33);
- LCD_WR_DATA8(0x33);
- LCD_WR_REG(0xb7);
- LCD_WR_DATA8(0x35);
- //---------------------------------ST7789S Power setting-----------------------------
- LCD_WR_REG(0xbb);
- LCD_WR_DATA8(0x1c);
- LCD_WR_REG(0xc0);
- LCD_WR_DATA8(0x2c);
- LCD_WR_REG(0xc2);
- LCD_WR_DATA8(0x01);
- LCD_WR_REG(0xc3);
- LCD_WR_DATA8(0x0b);
- LCD_WR_REG(0xc4);
- LCD_WR_DATA8(0x20);
- LCD_WR_REG(0xc6);
- LCD_WR_DATA8(0x0f);
- // LCD_WR_REG(0xca);
- // LCD_WR_DATA8(0x0f);
- // LCD_WR_REG(0xc8);
- // LCD_WR_DATA8(0x08);
- // LCD_WR_REG(0x55);
- // LCD_WR_DATA8(0x90);
- LCD_WR_REG(0xd0);
- LCD_WR_DATA8(0xa4);
- LCD_WR_DATA8(0xa1);
- //--------------------------------ST7789S gamma setting------------------------------
- LCD_WR_REG(0xe0);
- LCD_WR_DATA8(0xd0);
- LCD_WR_DATA8(0x00);
- LCD_WR_DATA8(0x03);
- LCD_WR_DATA8(0x09);
- LCD_WR_DATA8(0x13);
- LCD_WR_DATA8(0x1c);
- LCD_WR_DATA8(0x3a);
- LCD_WR_DATA8(0x55);
- LCD_WR_DATA8(0x48);
- LCD_WR_DATA8(0x18);
- LCD_WR_DATA8(0x12);
- LCD_WR_DATA8(0x0e);
- LCD_WR_DATA8(0x19);
- LCD_WR_DATA8(0x1e);
- LCD_WR_REG(0xe1);
- LCD_WR_DATA8(0xd0);
- LCD_WR_DATA8(0x00);
- LCD_WR_DATA8(0x03);
- LCD_WR_DATA8(0x09);
- LCD_WR_DATA8(0x05);
- LCD_WR_DATA8(0x25);
- LCD_WR_DATA8(0x3a);
- LCD_WR_DATA8(0x55);
- LCD_WR_DATA8(0x50);
- LCD_WR_DATA8(0x3d);
- LCD_WR_DATA8(0x1c);
- LCD_WR_DATA8(0x1d);
- LCD_WR_DATA8(0x1d);
- LCD_WR_DATA8(0x1e);
- LCD_WR_REG(0x29);
- }
- }
复制代码 他标的是ST7789S不过我用的是商家个的51代码中个的参数更改了的。
原本是用软SPI的后面用硬件SPI了逻辑分析仪解码的数据是一样的。
解码参数设置
我个人感觉是初始化参数有问题。要么是SPI的对齐方式有问题这些要看数据手册挺长的我明天再看看。
再放一张硬件SPI的波形是初始化的0x36命令的部分
|