找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4292|回复: 8
打印 上一主题 下一主题
收起左侧

[完结撒花]移植ST7789V代码从单片机到Cortex-M4 LCD出现雪花屏

[复制链接]
跳转到指定楼层
楼主
ID:687759 发表于 2022-5-3 19:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 余金渠 于 2022-5-4 13:02 编辑

五一调试了以前买的LCD屏淘宝链接
商家给的资料只有51的我用51测试可以正常显示于是乎我想移植到HC32F460(Cortex-M4)中不过调试了2天半只是得到了个雪花屏的结果。
由于手上没有合适的拍摄工具只能给张差不多的图片

而且这是在初始化阶段就会出现的而不是调用显示字符函数时出现的,我初始化的参数全是照着51代码写的不知道是不是对齐的问题
后天就要去学校了在此把代码发出,不要求各位大佬给出完整解决方案,给个思路就行用以帮助我在下周的调试。希望能得到大家的回复。
我把代码和商家给的资料放在百度网盘了就不站论坛的空间了
链接:https://pan.baidu.com/s/1tMcx3yPxhYUFOMei0TagDQ
提取码:jgr4

还有初始化单片机代码贴在下面
  1. #include "lcd_init.h"


  2. void LCD_GPIO_Init(void)
  3. {
  4.         stc_port_init_t stcPortInit;
  5.     /* configuration structure initialization */
  6.     MEM_ZERO_STRUCT(stcPortInit);

  7.     stcPortInit.enPinMode = Pin_Mode_Out;
  8.     stcPortInit.enExInt = Enable;
  9.     stcPortInit.enPullUp = Enable;

  10. //    PORT_Init(LCD_PIN_PORT , LCD_BLK_PIN | LCD_RST_PIN | LCD_DC_PIN | LCD_SCLK_PIN | LCD_MOSI_PIN
  11. //        | LCD_CS_PIN, &stcPortInit);
  12.         PORT_Init(LCD_PIN_PORT , LCD_BLK_PIN | LCD_RST_PIN | LCD_DC_PIN , &stcPortInit);

  13.         PORT_Unlock();
  14.     M4_PORT->PSPCR  = 0x0Bu;
  15.     PORT_Lock();

  16.     LCD_BLK_Clr();

  17. }


  18. /******************************************************************************
  19.       函数说明:LCD串行数据写入函数
  20.       入口数据:dat  要写入的串行数据
  21.       返回值:  无
  22. ******************************************************************************/
  23. void LCD_Writ_Bus(u8 dat)
  24. {        
  25. //          u8 i;
  26. //      LCD_DC_Set();
  27. //      LCD_CS_Clr();
  28. //      for(i=0;i<8;i++)
  29. //      {
  30. //      if(dat&0x80)
  31. //      {
  32. //      LCD_MOSI_Set();
  33. //      }
  34. //      else LCD_MOSI_Clr();
  35. //      LCD_SCLK_Clr();
  36. //      LCD_SCLK_Set();
  37. //      dat<<=1;
  38. //      }
  39. //         
  40. //      LCD_CS_Set();
  41.                 while (Reset == SPI_GetFlag(SPI_UNIT, SpiFlagSendBufferEmpty))
  42.         {}
  43.                 SPI_SendData8(SPI_UNIT,dat);
  44. }


  45. /******************************************************************************
  46.       函数说明:LCD写入数据
  47.       入口数据:dat 写入的数据
  48.       返回值:  无
  49. ******************************************************************************/
  50. void LCD_WR_DATA8(u8 dat)
  51. {
  52.         LCD_DC_Set();
  53.         LCD_Writ_Bus(dat);
  54. }


  55. /******************************************************************************
  56.       函数说明:LCD写入数据
  57.       入口数据:dat 写入的数据
  58.       返回值:  无
  59. ******************************************************************************/
  60. void LCD_WR_DATA(u16 dat)
  61. {
  62.         LCD_Writ_Bus(dat>>8);
  63.         LCD_Writ_Bus(dat);
  64. }


  65. /******************************************************************************
  66.       函数说明:LCD写入命令
  67.       入口数据:dat 写入的命令
  68.       返回值:  无
  69. ******************************************************************************/
  70. void LCD_WR_REG(u8 dat)
  71. {
  72.         LCD_DC_Clr();//写命令
  73.         LCD_Writ_Bus(dat);
  74. }


  75. /******************************************************************************
  76.       函数说明:设置起始和结束地址
  77.       入口数据:x1,x2 设置列的起始和结束地址
  78.                 y1,y2 设置行的起始和结束地址
  79.       返回值:  无
  80. ******************************************************************************/
  81. void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
  82. {
  83.                 LCD_WR_REG(0x2a);//列地址设置
  84.                 LCD_WR_DATA(x1);
  85.                 LCD_WR_DATA(x2);
  86.                 LCD_WR_REG(0x2b);//行地址设置
  87.                 LCD_WR_DATA(y1);
  88.                 LCD_WR_DATA(y2);
  89.                 LCD_WR_REG(0x2c);//储存器写
  90. }

  91. /******************************************************************************
  92.       函数说明:LCD初始化函数
  93.       入口数据:无
  94.       返回值:  无
  95. ******************************************************************************/
  96. void LCD_Init(void)
  97. {
  98.   if(Chip_Selection==0)  //初始化ILI9341
  99.         {
  100.         LCD_GPIO_Init();//初始化GPIO
  101.         
  102.         LCD_RES_Clr();//复位
  103.         Ddl_Delay1ms(50);
  104.         LCD_RES_Set();
  105.         Ddl_Delay1ms(50);
  106.         
  107.         LCD_BLK_Set();//打开背光
  108.         Ddl_Delay1ms(50);
  109.         
  110.         //************* Start Initial Sequence **********//
  111.         LCD_WR_REG(0x11); //Sleep out
  112.         Ddl_Delay1ms(60);             //Delay 60ms
  113.         //************* Start Initial Sequence **********//
  114.         LCD_WR_REG(0xCF);
  115.         LCD_WR_DATA8(0x00);
  116.         LCD_WR_DATA8(0xC1);
  117.         LCD_WR_DATA8(0X30);
  118.         LCD_WR_REG(0xED);
  119.         LCD_WR_DATA8(0x64);
  120.         LCD_WR_DATA8(0x03);
  121.         LCD_WR_DATA8(0X12);
  122.         LCD_WR_DATA8(0X81);
  123.         LCD_WR_REG(0xE8);
  124.         LCD_WR_DATA8(0x85);
  125.         LCD_WR_DATA8(0x00);
  126.         LCD_WR_DATA8(0x79);
  127.         LCD_WR_REG(0xCB);
  128.         LCD_WR_DATA8(0x39);
  129.         LCD_WR_DATA8(0x2C);
  130.         LCD_WR_DATA8(0x00);
  131.         LCD_WR_DATA8(0x34);
  132.         LCD_WR_DATA8(0x02);
  133.         LCD_WR_REG(0xF7);
  134.         LCD_WR_DATA8(0x20);
  135.         LCD_WR_REG(0xEA);
  136.         LCD_WR_DATA8(0x00);
  137.         LCD_WR_DATA8(0x00);
  138.         LCD_WR_REG(0xC0); //Power control
  139.         LCD_WR_DATA8(0x1D); //VRH[5:0]
  140.         LCD_WR_REG(0xC1); //Power control
  141.         LCD_WR_DATA8(0x12); //SAP[2:0];BT[3:0]
  142.         LCD_WR_REG(0xC5); //VCM control
  143.         LCD_WR_DATA8(0x33);
  144.         LCD_WR_DATA8(0x3F);
  145.         LCD_WR_REG(0xC7); //VCM control
  146.         LCD_WR_DATA8(0x92);
  147.         LCD_WR_REG(0x3A); // Memory Access Control
  148.         LCD_WR_DATA8(0x55);
  149.         LCD_WR_REG(0x36); // Memory Access Control
  150.         if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x08);
  151.         else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC8);
  152.         else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x78);
  153.         else LCD_WR_DATA8(0xA8);
  154.         LCD_WR_REG(0xB1);
  155.         LCD_WR_DATA8(0x00);
  156.         LCD_WR_DATA8(0x12);
  157.         LCD_WR_REG(0xB6); // Display Function Control
  158.         LCD_WR_DATA8(0x0A);
  159.         LCD_WR_DATA8(0xA2);

  160.         LCD_WR_REG(0x44);
  161.         LCD_WR_DATA8(0x02);

  162.         LCD_WR_REG(0xF2); // 3Gamma Function Disable
  163.         LCD_WR_DATA8(0x00);
  164.         LCD_WR_REG(0x26); //Gamma curve selected
  165.         LCD_WR_DATA8(0x01);
  166.         LCD_WR_REG(0xE0); //Set Gamma
  167.         LCD_WR_DATA8(0x0F);
  168.         LCD_WR_DATA8(0x22);
  169.         LCD_WR_DATA8(0x1C);
  170.         LCD_WR_DATA8(0x1B);
  171.         LCD_WR_DATA8(0x08);
  172.         LCD_WR_DATA8(0x0F);
  173.         LCD_WR_DATA8(0x48);
  174.         LCD_WR_DATA8(0xB8);
  175.         LCD_WR_DATA8(0x34);
  176.         LCD_WR_DATA8(0x05);
  177.         LCD_WR_DATA8(0x0C);
  178.         LCD_WR_DATA8(0x09);
  179.         LCD_WR_DATA8(0x0F);
  180.         LCD_WR_DATA8(0x07);
  181.         LCD_WR_DATA8(0x00);
  182.         LCD_WR_REG(0XE1); //Set Gamma
  183.         LCD_WR_DATA8(0x00);
  184.         LCD_WR_DATA8(0x23);
  185.         LCD_WR_DATA8(0x24);
  186.         LCD_WR_DATA8(0x07);
  187.         LCD_WR_DATA8(0x10);
  188.         LCD_WR_DATA8(0x07);
  189.         LCD_WR_DATA8(0x38);
  190.         LCD_WR_DATA8(0x47);
  191.         LCD_WR_DATA8(0x4B);
  192.         LCD_WR_DATA8(0x0A);
  193.         LCD_WR_DATA8(0x13);
  194.         LCD_WR_DATA8(0x06);
  195.         LCD_WR_DATA8(0x30);
  196.         LCD_WR_DATA8(0x38);
  197.         LCD_WR_DATA8(0x0F);
  198.         LCD_WR_REG(0x29); //Display on
  199. }
  200.         else          //初始化ST7789
  201.         {
  202.                 LCD_GPIO_Init();//初始化GPIO
  203.                 LCD_RES_Set();//复位
  204.                 Ddl_Delay1ms(50);
  205.                 LCD_RES_Clr();
  206.                 Ddl_Delay1ms(50);
  207.                 LCD_RES_Set();
  208.                 Ddl_Delay1ms(50);
  209.                 LCD_BLK_Set();//打开背光
  210.                 Ddl_Delay1ms(250);
  211.                 LCD_WR_REG(0x11);
  212.                 Ddl_Delay1ms(60);//Delay 20ms
  213. //************* Start Initial Sequence **********//
  214. //------------------------------display and color format setting--------------------------------//
  215.         
  216.                 LCD_WR_REG(0X36);// Memory Access Control
  217.                 if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00);
  218.                 else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0);
  219.                 else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70);
  220.                 else LCD_WR_DATA8(0xA0);
  221.                 LCD_WR_REG(0X3A);
  222.                 LCD_WR_DATA8(0X05);
  223.         //--------------------------------ST7789S Frame rate setting-------------------------

  224.                 LCD_WR_REG(0xb2);
  225.                 LCD_WR_DATA8(0x0c);
  226.                 LCD_WR_DATA8(0x0c);
  227.                 LCD_WR_DATA8(0x00);
  228.                 LCD_WR_DATA8(0x33);
  229.                 LCD_WR_DATA8(0x33);
  230.                 LCD_WR_REG(0xb7);
  231.                 LCD_WR_DATA8(0x35);
  232.                 //---------------------------------ST7789S Power setting-----------------------------

  233.                 LCD_WR_REG(0xbb);
  234.                 LCD_WR_DATA8(0x1c);
  235.                 LCD_WR_REG(0xc0);
  236.                 LCD_WR_DATA8(0x2c);
  237.                 LCD_WR_REG(0xc2);
  238.                 LCD_WR_DATA8(0x01);
  239.                 LCD_WR_REG(0xc3);
  240.                 LCD_WR_DATA8(0x0b);
  241.                 LCD_WR_REG(0xc4);
  242.                 LCD_WR_DATA8(0x20);
  243.                 LCD_WR_REG(0xc6);
  244.                 LCD_WR_DATA8(0x0f);
  245. //                LCD_WR_REG(0xca);
  246. //                LCD_WR_DATA8(0x0f);
  247. //                LCD_WR_REG(0xc8);
  248. //                LCD_WR_DATA8(0x08);
  249. //                LCD_WR_REG(0x55);
  250. //                LCD_WR_DATA8(0x90);
  251.                 LCD_WR_REG(0xd0);
  252.                 LCD_WR_DATA8(0xa4);
  253.                 LCD_WR_DATA8(0xa1);
  254.                 //--------------------------------ST7789S gamma setting------------------------------
  255.                 LCD_WR_REG(0xe0);
  256.                 LCD_WR_DATA8(0xd0);
  257.                 LCD_WR_DATA8(0x00);
  258.                 LCD_WR_DATA8(0x03);
  259.                 LCD_WR_DATA8(0x09);
  260.                 LCD_WR_DATA8(0x13);
  261.                 LCD_WR_DATA8(0x1c);
  262.                 LCD_WR_DATA8(0x3a);
  263.                 LCD_WR_DATA8(0x55);
  264.                 LCD_WR_DATA8(0x48);
  265.                 LCD_WR_DATA8(0x18);
  266.                 LCD_WR_DATA8(0x12);
  267.                 LCD_WR_DATA8(0x0e);
  268.                 LCD_WR_DATA8(0x19);
  269.                 LCD_WR_DATA8(0x1e);
  270.                 LCD_WR_REG(0xe1);
  271.                 LCD_WR_DATA8(0xd0);
  272.                 LCD_WR_DATA8(0x00);
  273.                 LCD_WR_DATA8(0x03);
  274.                 LCD_WR_DATA8(0x09);
  275.                 LCD_WR_DATA8(0x05);
  276.                 LCD_WR_DATA8(0x25);
  277.                 LCD_WR_DATA8(0x3a);
  278.                 LCD_WR_DATA8(0x55);
  279.                 LCD_WR_DATA8(0x50);
  280.                 LCD_WR_DATA8(0x3d);
  281.                 LCD_WR_DATA8(0x1c);
  282.                 LCD_WR_DATA8(0x1d);
  283.                 LCD_WR_DATA8(0x1d);
  284.                 LCD_WR_DATA8(0x1e);
  285.                 LCD_WR_REG(0x29);
  286. }
  287. }
复制代码
他标的是ST7789S不过我用的是商家个的51代码中个的参数更改了的。
原本是用软SPI的后面用硬件SPI了逻辑分析仪解码的数据是一样的。
解码参数设置

我个人感觉是初始化参数有问题。要么是SPI的对齐方式有问题这些要看数据手册挺长的我明天再看看。

再放一张硬件SPI的波形是初始化的0x36命令的部分
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:687759 发表于 2022-5-3 20:05 | 只看该作者
如果需要示波器波形我可以在下周发出。
回复

使用道具 举报

板凳
ID:656419 发表于 2022-5-3 23:31 | 只看该作者
呃.....楼主好,,我想借楼问个问题,,,
ST7789 ST7789v 是通用的吗?
回复

使用道具 举报

地板
ID:687759 发表于 2022-5-4 12:29 | 只看该作者
这里纠正一个错误
javascript:;
这个标志只是数据完成并不是SPI传送完成所以代码是有BUG的。
这是我加了20us延时的波形
javascript:;
是很正常的
第3信号是DC(命令和数据)信号

LF9F]D[FC`CFKNULG[7S_K5.png (75.09 KB, 下载次数: 125)

LF9F]D[FC`CFKNULG[7S_K5.png

]1063$1LJU6E{B938~H@AOG.png (9.17 KB, 下载次数: 67)

]1063$1LJU6E{B938~H@AOG.png
回复

使用道具 举报

5#
ID:687759 发表于 2022-5-4 13:01 | 只看该作者
完结了可以使用了就是标准的问题希望给后面的人一个参考。这里再发一份可以使用的代码
搞了3天终于搞成了
代码

HC32F460lcd工程.zip

1.17 MB, 下载次数: 145

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:721377 发表于 2022-10-20 09:44 | 只看该作者
我也出现 花屏  参考看看 谢谢
回复

使用道具 举报

7#
ID:462526 发表于 2022-12-12 17:14 | 只看该作者
余金渠 发表于 2022-5-4 13:01
完结了可以使用了就是标准的问题希望给后面的人一个参考。这里再发一份可以使用的代码
搞了3天终于搞成了
...

谢谢分享,节约了很多排查时间!!
回复

使用道具 举报

8#
ID:1108075 发表于 2024-1-4 23:41 | 只看该作者
怎么解决的 求解
回复

使用道具 举报

9#
ID:517951 发表于 2024-1-8 08:34 | 只看该作者
出现雪花的原因很简单, 就是屏初始化成功了, 需要做clearscreen , 不做清屏动作,就是雪花显示. 因为显示RAM里面是随机数据.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表