找回密码
 立即注册
查看: 491|回复: 10

麻烦看下我这那里有问题了,软件驱动屏幕正常,硬件驱动就不行了 | 已解决

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:340
  • 最近打卡:2025-05-01 18:31:16

5

主题

23

回帖

1161

积分

金牌会员

积分
1161
发表于 2025-1-25 11:39:51 | 显示全部楼层 |阅读模式
用STC8H8K64U驱动2.4寸tft屏,IC是HX8347I,采用16bit模式,初始化的命令和数据均低8位有效,P0接低八位,P2接高八位,不需要LCM中断,我用io模拟能驱动,说明接线,初始化都没有问题。下面是改的硬件LCM驱动屏,最后的效果就是红色和青色正反方向循环刷屏。

  1. #include "STC8H.H"
  2. #include "IO_int.H"
  3. #include "uart.H"
  4. //液晶屏IC所需要的信号线的接口定义
  5. sbit CS0=P1^3;    //CS
  6. sbit reset=P1^4;  //RES
  7. sbit DC0=P4^5;    //RS(A0)
  8. sbit WR0=P4^2;    //R/W
  9. sbit RD0=P4^4;    //E
  10. void Delay(unsigned int xms) //11.0MHz                1ms
  11. {
  12.         unsigned char i, j;
  13.         while(xms--)
  14.         {
  15.                 i = 15;
  16.                 j = 90;
  17.                 do
  18.                 {
  19.                         while (--j);
  20.                 } while (--i);
  21.         }
  22. }
  23.   
  24. void delay_us(int i)
  25. {
  26.         int j,k;
  27.         for(j=0;j<i;j++);
  28.         for(k=0;k<1;k++);
  29. }
  30. void lcmint()
  31. {
  32.         P_SW2 |= 0x80;      //扩展寄存器访问使能
  33.         LCMIFCFG=0X02;
  34.         LCMIFCFG2=0X00;
  35.         LCMIFCR=0X80;
  36.         LCMIFSTA = 0x00;
  37. }
  38. //void WriteComm(int com1)
  39. //{        
  40. //        CS0 = 0;
  41. //        DC0 = 0;
  42. //        RD0 = 1;
  43. //        P0=com1;
  44. //        WR0 = 0;
  45. //        delay_us(1);
  46. //        WR0 = 1;
  47. //        CS0 = 1;  
  48. //}
  49. //void WriteData(int data1)
  50. //{
  51. //        CS0 = 0;
  52. //        DC0 = 1;
  53. //        RD0 = 1;
  54. //        P0=data1;
  55. //        WR0 = 0;
  56. //        WR0 = 1;
  57. //        CS0 = 1;
  58. //}
  59. void WriteComm(char com1)
  60. {  
  61.         LCMIFDATL=com1;      
  62.         CS0 = 0;
  63.         LCMIFCR=0x84;
  64.         CS0 = 1;
  65. }
  66. void WriteData(char data1)
  67. {
  68.         LCMIFDATL=data1;
  69.         CS0 = 0;
  70.         LCMIFCR=0X85;
  71.         CS0 = 1;
  72. }
  73. //连写2个字节(即16位)数据到LCD模块
  74. //void transfer_data_16(int data_16bit)
  75. //{
  76. //        CS0 = 0;
  77. //        DC0 = 1;
  78. //        RD0 = 1;
  79. //        P2=data_16bit>>8;                //P2口接高位
  80. //        P0=data_16bit;                        //P0口接低位
  81. //        WR0 = 0;
  82. //        WR0 = 1;
  83. //        CS0 = 1;
  84. //}
  85. void transfer_data_16(int data_16bit)
  86. {
  87.         LCMIFDATH=data_16bit>>8;                //P2口接高位
  88.         LCMIFDATL=data_16bit;                        //P0口接低位
  89.         CS0 = 0;
  90.         LCMIFCR=0X85;
  91.         CS0 = 1;
  92. }
  93. //void LCD_reg(unsigned char command,unsigned char dat)
  94. //{
  95. //        WriteComm(command); //
  96. //        WriteData(dat);
  97. //}
  98. //************* 初始化程序HX8347I  成功**********//
  99. void lcd_initial()
  100. {
  101. //Delay(200);
  102. //reset=0;
  103. //Delay(200);
  104. //reset=1;
  105. WriteComm(0x01);         //软复位
  106. Delay(200);                         //必须有50ms以上的延时
  107. WriteComm(0xB9);
  108. WriteData(0xFF);
  109. WriteData(0x83);
  110. WriteData(0x47);
  111. Delay(50);
  112. WriteComm(0xB1); // Set BT[2:0] = 4 before sleep out
  113. WriteData(0x00);
  114. WriteData(0x04); // BT[2:0] = 4
  115. WriteComm(0x11); // Sleep Out
  116. Delay(120);
  117. WriteComm(0x3A); //SET COLOR
  118. WriteData(0x05); // 06 262k//05 65k
  119. WriteComm(0xBF); //
  120. WriteData(0x00);
  121. WriteData(0x26);
  122. WriteComm(0xCC);
  123. WriteData(0x09); // BGR
  124. WriteComm(0xB0); //
  125. WriteData(0x88); //
  126. WriteComm(0xB1); //
  127. WriteData(0x00);
  128. WriteData(0x01); //
  129. WriteData(0x1C); // VREG1OUT
  130. WriteComm(0xB4); //
  131. WriteData(0x11);
  132. WriteData(0xFF);
  133. WriteData(0x00);
  134. WriteData(0x02);
  135. WriteData(0X02);
  136. WriteData(0x04);
  137. WriteData(0x80);
  138. WriteComm(0xB5); //
  139. WriteData(0x0b); // Vref
  140. WriteComm(0xB6); //
  141. WriteData(0x23); // vcomh
  142. WriteData(0x63); // vcoml
  143. WriteComm(0xFD); //
  144. WriteData(0x6A); // VCOM_Offset
  145. WriteComm(0xE3); // EQ
  146. WriteData(0x20);
  147. WriteData(0x10);
  148. WriteData(0x10);
  149. WriteData(0x20);
  150. WriteData(0x20);
  151. WriteData(0x20);
  152. WriteComm(0xE0); // Gamma
  153. WriteData(0x00);
  154. WriteData(0x00);
  155. WriteData(0x04);
  156. WriteData(0x11);
  157. WriteData(0x0F);
  158. WriteData(0x28);
  159. WriteData(0x0E);
  160. WriteData(0x53);
  161. WriteData(0x09);
  162. WriteData(0x13);
  163. WriteData(0x17);
  164. WriteData(0x18);
  165. WriteData(0x1A);
  166. WriteData(0x17);
  167. WriteData(0x30);
  168. WriteData(0x2E);
  169. WriteData(0x3B);
  170. WriteData(0x3F);
  171. WriteData(0x3F);
  172. WriteData(0x2C);
  173. WriteData(0x71);
  174. WriteData(0x05);
  175. WriteData(0x07);
  176. WriteData(0x08);
  177. WriteData(0x0C);
  178. WriteData(0x16);
  179. WriteData(0x88);
  180. WriteComm(0x29); // Display On
  181. Delay(5);
  182. //WriteComm(0x2C); // Write Ram
  183. }
  184. //定义窗口坐标:开始坐标(XS,YS)以及窗口大小(x_total,y_total)
  185. void lcd_address(unsigned int XS,unsigned int YS,unsigned int x_total,unsigned int y_total)
  186. {                                  //                   0                            0                               240          320        
  187.         int XE,YE;  
  188.         XE=XS+x_total-1;
  189.         YE=YS+y_total-1;  
  190.         WriteComm(0x2a);  
  191.         // 设置X开始及结束的地址
  192.         transfer_data_16(XS); // X 开始地址(16 位)
  193.         transfer_data_16(XE); // X 结束地址(16 位)
  194.         WriteComm(0x2b);  
  195.         // 设置Y开始及结束的地址
  196.         transfer_data_16(YS); // Y 开始地址(16 位)
  197.         transfer_data_16(YE); // Y 结束地址(16 位)
  198.         WriteComm(0x2c);
  199. }
  200.     // 写数据开始
  201. void mono_transfer_data_16(int mono_data,int font_color,int back_color)
  202. {
  203. int i;
  204. for(i=0;i<8;i++)
  205. {
  206. if(mono_data&0x80)
  207.   {
  208. transfer_data_16(font_color);
  209. //当数据是1时,显示字体颜色
  210.   }
  211.   else
  212.   {
  213.    transfer_data_16(back_color); //当数据是0时,显示底色
  214.   }
  215.   mono_data<<=1;
  216. }
  217. }
  218. //全屏显示一种颜色
  219. void display_color(int color_data)
  220. {   
  221. int i,j;
  222. lcd_address(0,0,240,320);
  223. for(i=0;i<240;i++)
  224. {
  225.   for(j=0;j<320;j++)
  226.   {
  227.    transfer_data_16(color_data);
  228.    
  229.   }
  230. }
  231. }
  232. void main(void)
  233. {  
  234. <blockquote>    P0M0 = 0x00;    P0M1 = 0x00;
复制代码


回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:340
  • 最近打卡:2025-05-01 18:31:16

5

主题

23

回帖

1161

积分

金牌会员

积分
1161
发表于 2025-1-25 11:43:29 | 显示全部楼层
  1. void main(void)
  2. {  
  3.     P0M0 = 0x00;    P0M1 = 0x00;
  4.     P1M0 = 0x00;    P1M1 = 0x00;
  5.     P2M0 = 0x00;    P2M1 = 0x00;
  6.     P3M0 = 0x00;    P3M1 = 0x00;
  7.     P4M0 = 0x00;    P4M1 = 0x00;
  8.     P5M0 = 0x00;    P5M1 = 0x00;
  9.     P6M0 = 0x00;    P6M1 = 0x00;
  10.     P7M0 = 0x00;    P7M1 = 0x00;
  11.         UartInit();
  12.         lcmint();
  13.         lcd_initial();
  14.         while(1)
  15.         {
  16.         WriteComm(0x36); // 扫描方式命令
  17.         WriteData(0x80); // 从左到右 从下到上
  18.         display_color(0xf800);        //红
  19.         WriteComm(0x36); //
  20.         WriteData(0x00);         //默认值0x00 从左到右 从上到下
  21.         display_color(0x07ff);        //青色
  22.         }
  23. }
复制代码

点评

因为无实物实验, 仅看代码, 可能不太好说... 建议把写命令和写数据两个函数改写一下,试试看如何? void WriteComm(char com1) { CS0 = 0; LCMIFDATL=com1; LCMIFCR=0x84; while(!(LCMIFSTA & 0x01  详情 回复 发表于 2025-1-25 12:26
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:459
  • 最近打卡:2025-05-02 21:17:31
已绑定手机
已实名认证

110

主题

2223

回帖

5464

积分

版主

积分
5464
发表于 2025-1-25 11:49:29 | 显示全部楼层
可以尝试使用lcm只发送单一数据,然后和io模拟发送单一数据进行对比。
用示波器测量看看波形是否正确。
有现象才好判断问题,单纯通过查看代码并不容易看出问题来
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:340
  • 最近打卡:2025-05-01 18:31:16

5

主题

23

回帖

1161

积分

金牌会员

积分
1161
发表于 2025-1-25 12:04:51 | 显示全部楼层
王*** 发表于 2025-1-25 11:49
可以尝试使用lcm只发送单一数据,然后和io模拟发送单一数据进行对比。
用示波器测量看看波形是否正确。
有 ...

没有示波器 参考了一下官方例程,官方都是8位格式的,怀疑我写的发送16位数据有问题。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:494
  • 最近打卡:2025-05-02 09:16:59

30

主题

347

回帖

3480

积分

荣誉版主

积分
3480
发表于 2025-1-25 12:26:38 | 显示全部楼层

16位数据写入?

因为无实物实验, 仅看代码, 可能不太好说...
建议把写命令和写数据两个函数改写一下,试试看如何?
例如:
void WriteComm(char com1)
{  
  CS0 = 0;
  LCMIFDATL=com1;      
  LCMIFCR=0x84;
  while(!(LCMIFSTA & 0x01)); //等待状态标志置1
  LCMIFSTA = 0x00;              //软件清零
  CS0 = 1;
}
void WriteData(unsigned int data1)
{
  CS0 = 0;
  LCMIFDATH=data1>>8;
  LCMIFDATL=data1;
  LCMIFCR=0x85;
  while(!(LCMIFSTA & 0x01)); //等待状态标志置1
  LCMIFSTA = 0x00;             //软件清零
  CS0 = 1;
}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:340
  • 最近打卡:2025-05-01 18:31:16

5

主题

23

回帖

1161

积分

金牌会员

积分
1161
发表于 2025-1-25 14:49:12 | 显示全部楼层
浦江*** 发表于 2025-1-25 12:26
16位数据写入?

因为无实物实验, 仅看代码, 可能不太好说...

非常感谢,按照您的修改 ,可以了
回复 支持 反对

使用道具 举报 送花

1

主题

5

回帖

27

积分

新手上路

积分
27
发表于 2025-2-5 13:11:46 | 显示全部楼层
我这边也有个8347I的2.4寸屏幕,测试H8bit,spi通信都只有背光亮。屏幕毫无反应。想用你的程序测试下看看屏幕是不是坏了,请问可以提供一下这个屏幕的16bit通信的接口原理图么?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:340
  • 最近打卡:2025-05-01 18:31:16

5

主题

23

回帖

1161

积分

金牌会员

积分
1161
发表于 2025-2-5 14:18:58 | 显示全部楼层
yxyy*** 发表于 2025-2-5 13:11
我这边也有个8347I的2.4寸屏幕,测试H8bit,spi通信都只有背光亮。屏幕毫无反应。想用你的程序测试下看看屏 ...

截图202502051418373769.jpg

我的屏是这个样子的
回复 支持 反对

使用道具 举报 送花

1

主题

5

回帖

27

积分

新手上路

积分
27
发表于 2025-2-5 17:02:32 | 显示全部楼层
mtt*** 发表于 2025-2-5 14:18
我的屏是这个样子的

还想请问下 “FMARK 同步脉冲”  引脚需要接到单片机么?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:340
  • 最近打卡:2025-05-01 18:31:16

5

主题

23

回帖

1161

积分

金牌会员

积分
1161
发表于 2025-2-6 11:11:27 | 显示全部楼层
yxyy*** 发表于 2025-2-5 17:02
还想请问下 “FMARK 同步脉冲”  引脚需要接到单片机么?

不用 空着就行 下面是我自己画的,可以用。


截图202502061112316334.jpg

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 22:15 , Processed in 0.158013 second(s), 118 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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