mtt661 发表于 2025-1-25 11:39:51

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

用STC8H8K64U驱动2.4寸tft屏,IC是HX8347I,采用16bit模式,初始化的命令和数据均低8位有效,P0接低八位,P2接高八位,不需要LCM中断,我用io模拟能驱动,说明接线,初始化都没有问题。下面是改的硬件LCM驱动屏,最后的效果就是红色和青色正反方向循环刷屏。

#include "STC8H.H"
#include "IO_int.H"
#include "uart.H"


//液晶屏IC所需要的信号线的接口定义

sbit CS0=P1^3;    //CS
sbit reset=P1^4;//RES

sbit DC0=P4^5;    //RS(A0)
sbit WR0=P4^2;    //R/W
sbit RD0=P4^4;    //E

void Delay(unsigned int xms) //11.0MHz                1ms
{
      unsigned char i, j;

      while(xms--)
      {
                i = 15;
                j = 90;
                do
                {
                        while (--j);
                } while (--i);


      }

}

void delay_us(int i)
{
      int j,k;
      for(j=0;j<i;j++);
      for(k=0;k<1;k++);
}

void lcmint()
{
      P_SW2 |= 0x80;      //扩展寄存器访问使能

      LCMIFCFG=0X02;

      LCMIFCFG2=0X00;

      LCMIFCR=0X80;

      LCMIFSTA = 0x00;
}

//void WriteComm(int com1)
//{      
//      CS0 = 0;
//      DC0 = 0;
//      RD0 = 1;
//      P0=com1;
//      WR0 = 0;
//      delay_us(1);
//      WR0 = 1;
//      CS0 = 1;
//}
//void WriteData(int data1)
//{
//      CS0 = 0;
//      DC0 = 1;
//      RD0 = 1;
//      P0=data1;
//      WR0 = 0;
//      WR0 = 1;
//      CS0 = 1;
//}

void WriteComm(char com1)
{

      LCMIFDATL=com1;      
      CS0 = 0;
      LCMIFCR=0x84;

      CS0 = 1;

}
void WriteData(char data1)
{

      LCMIFDATL=data1;
      CS0 = 0;
      LCMIFCR=0X85;
      CS0 = 1;

}

//连写2个字节(即16位)数据到LCD模块
//void transfer_data_16(int data_16bit)
//{

//      CS0 = 0;
//      DC0 = 1;
//      RD0 = 1;
//      P2=data_16bit>>8;                //P2口接高位
//      P0=data_16bit;                        //P0口接低位
//      WR0 = 0;
//      WR0 = 1;
//      CS0 = 1;
//}

void transfer_data_16(int data_16bit)
{

      LCMIFDATH=data_16bit>>8;                //P2口接高位
      LCMIFDATL=data_16bit;                        //P0口接低位
      CS0 = 0;
      LCMIFCR=0X85;


      CS0 = 1;

}




//void LCD_reg(unsigned char command,unsigned char dat)
//{
//      WriteComm(command); //
//      WriteData(dat);
//}

//************* 初始化程序HX8347I成功**********//
void lcd_initial()
{


//Delay(200);
//reset=0;
//Delay(200);
//reset=1;

WriteComm(0x01);         //软复位

Delay(200);                         //必须有50ms以上的延时

WriteComm(0xB9);
WriteData(0xFF);
WriteData(0x83);
WriteData(0x47);
Delay(50);

WriteComm(0xB1); // Set BT = 4 before sleep out
WriteData(0x00);
WriteData(0x04); // BT = 4

WriteComm(0x11); // Sleep Out
Delay(120);

WriteComm(0x3A); //SET COLOR
WriteData(0x05); // 06 262k//05 65k

WriteComm(0xBF); //
WriteData(0x00);
WriteData(0x26);

WriteComm(0xCC);
WriteData(0x09); // BGR

WriteComm(0xB0); //
WriteData(0x88); //


WriteComm(0xB1); //
WriteData(0x00);
WriteData(0x01); //
WriteData(0x1C); // VREG1OUT

WriteComm(0xB4); //
WriteData(0x11);
WriteData(0xFF);
WriteData(0x00);
WriteData(0x02);
WriteData(0X02);
WriteData(0x04);
WriteData(0x80);

WriteComm(0xB5); //
WriteData(0x0b); // Vref

WriteComm(0xB6); //
WriteData(0x23); // vcomh
WriteData(0x63); // vcoml

WriteComm(0xFD); //
WriteData(0x6A); // VCOM_Offset

WriteComm(0xE3); // EQ
WriteData(0x20);
WriteData(0x10);
WriteData(0x10);
WriteData(0x20);
WriteData(0x20);
WriteData(0x20);

WriteComm(0xE0); // Gamma
WriteData(0x00);
WriteData(0x00);
WriteData(0x04);
WriteData(0x11);
WriteData(0x0F);
WriteData(0x28);
WriteData(0x0E);
WriteData(0x53);
WriteData(0x09);
WriteData(0x13);
WriteData(0x17);
WriteData(0x18);
WriteData(0x1A);
WriteData(0x17);
WriteData(0x30);
WriteData(0x2E);
WriteData(0x3B);
WriteData(0x3F);
WriteData(0x3F);
WriteData(0x2C);
WriteData(0x71);
WriteData(0x05);
WriteData(0x07);
WriteData(0x08);
WriteData(0x0C);
WriteData(0x16);
WriteData(0x88);

WriteComm(0x29); // Display On
Delay(5);

//WriteComm(0x2C); // Write Ram


}

//定义窗口坐标:开始坐标(XS,YS)以及窗口大小(x_total,y_total)
void lcd_address(unsigned int XS,unsigned int YS,unsigned int x_total,unsigned int y_total)
{                                  //                   0                            0                               240          320      
      int XE,YE;
      XE=XS+x_total-1;
      YE=YS+y_total-1;
      WriteComm(0x2a);
      // 设置X开始及结束的地址
      transfer_data_16(XS); // X 开始地址(16 位)
      transfer_data_16(XE); // X 结束地址(16 位)
      WriteComm(0x2b);
      // 设置Y开始及结束的地址
      transfer_data_16(YS); // Y 开始地址(16 位)
      transfer_data_16(YE); // Y 结束地址(16 位)
      WriteComm(0x2c);
}
    // 写数据开始

void mono_transfer_data_16(int mono_data,int font_color,int back_color)
{
int i;
for(i=0;i<8;i++)
{
if(mono_data&0x80)
{
transfer_data_16(font_color);
//当数据是1时,显示字体颜色
}
else
{
   transfer_data_16(back_color); //当数据是0时,显示底色
}
mono_data<<=1;
}
}


//全屏显示一种颜色
void display_color(int color_data)
{   
int i,j;
lcd_address(0,0,240,320);
for(i=0;i<240;i++)
{
for(j=0;j<320;j++)
{
   transfer_data_16(color_data);
   
}
}
}








void main(void)
{

<blockquote>    P0M0 = 0x00;    P0M1 = 0x00;

mtt661 发表于 2025-1-25 11:43:29

void main(void)
{
    P0M0 = 0x00;    P0M1 = 0x00;
    P1M0 = 0x00;    P1M1 = 0x00;
    P2M0 = 0x00;    P2M1 = 0x00;
    P3M0 = 0x00;    P3M1 = 0x00;
    P4M0 = 0x00;    P4M1 = 0x00;
    P5M0 = 0x00;    P5M1 = 0x00;
    P6M0 = 0x00;    P6M1 = 0x00;
    P7M0 = 0x00;    P7M1 = 0x00;


      UartInit();

      lcmint();


      lcd_initial();



      while(1)

      {

      WriteComm(0x36); // 扫描方式命令
      WriteData(0x80); // 从左到右 从下到上

      display_color(0xf800);      //红
      WriteComm(0x36); //
      WriteData(0x00);         //默认值0x00 从左到右 从上到下

      display_color(0x07ff);      //青色



      }
}

王昱顺 发表于 2025-1-25 11:49:29

可以尝试使用lcm只发送单一数据,然后和io模拟发送单一数据进行对比。
用示波器测量看看波形是否正确。
有现象才好判断问题,单纯通过查看代码并不容易看出问题来

mtt661 发表于 2025-1-25 12:04:51

王昱顺 发表于 2025-1-25 11:49
可以尝试使用lcm只发送单一数据,然后和io模拟发送单一数据进行对比。
用示波器测量看看波形是否正确。
有 ...

没有示波器{:cahan:} 参考了一下官方例程,官方都是8位格式的,怀疑我写的发送16位数据有问题。

浦江一水 发表于 2025-1-25 12:26:38

mtt661 发表于 2025-1-25 11:43

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;
}

mtt661 发表于 2025-1-25 14:49:12

浦江一水 发表于 2025-1-25 12:26
16位数据写入?

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


非常感谢,按照您的修改 ,可以了

yxyy3604 发表于 2025-2-5 13:11:46

我这边也有个8347I的2.4寸屏幕,测试H8bit,spi通信都只有背光亮。屏幕毫无反应。想用你的程序测试下看看屏幕是不是坏了,请问可以提供一下这个屏幕的16bit通信的接口原理图么?

mtt661 发表于 2025-2-5 14:18:58

yxyy3604 发表于 2025-2-5 13:11
我这边也有个8347I的2.4寸屏幕,测试H8bit,spi通信都只有背光亮。屏幕毫无反应。想用你的程序测试下看看屏 ...



我的屏是这个样子的

yxyy3604 发表于 2025-2-5 17:02:32

mtt661 发表于 2025-2-5 14:18
我的屏是这个样子的

还想请问下 “FMARK 同步脉冲”引脚需要接到单片机么?

mtt661 发表于 2025-2-6 11:11:27

yxyy3604 发表于 2025-2-5 17:02
还想请问下 “FMARK 同步脉冲”引脚需要接到单片机么?
不用 空着就行 下面是我自己画的,可以用。




页: [1] 2
查看完整版本: 麻烦看下我这那里有问题了,软件驱动屏幕正常,硬件驱动就不行了 | 已解决