kutwucpa 发表于 2025-6-10 21:10:00

8H8K64U使用LCM驱动ILI9341异常 | 可以了,TFT模块有个电阻调整后

8H8K64U使用LCM驱动ILI9341异常

参考例程重写了一份屏幕驱动,后面调试发现读取id都回复异常,以下为抓取波形和源码:

void Delay50ms(void)      //@40.000MHz
{
      unsigned char data i, j, k;

      _nop_();
      _nop_();
      i = 11;
      j = 38;
      k = 92;
      do
      {
                do
                {
                        while (--k);
                } while (--j);
      } while (--i);
}

void LCD_GPIO_Init(void)                //LCD引脚初始化
{
P2M0 = 0xff; P2M1 = 0x00;
      P3M0 |= 0xf0; P3M1 &= 0x0f;
      P5M0 = 0x10; P5M1 = 0x00;
}

void LCD_LCM_Init(void)                //LCD外设初始化
{
      LCMIFCFG = 0x90;      //使能LCM中断,数据端口P2,8位数据宽度,8080模式
      LCMIFCFG2 = 0x3f;                //RD=P3.7,WR=P3.6
      LCMIFSTA = 0x00;                //状态寄存器清零
}

void LCD_Reset(void)                //lcd复位
{
      Delay50ms();                //等待
      LCD_RESET = 0;                //开始复位
      Delay50ms();                //等待
      LCD_RESET = 1;                //复位
      Delay50ms();                //等待复位
}

void LCD_WR_REG(u8 Reg)               //lcd写命令
{
      LCMIFDATL = Reg;                //装填待写入指令
      LCD_CS = 0;                //片选拉低
      LCD_RS = 0;                //写命令
      LCMIFCR = 0x84;                //允许lcm接口功能,写命令
      while(!LCD_CS);                //等待数据发送完毕
}

void LCD_WR_DATA(u8 Data)                //lcd写8bit数据
{
      LCMIFDATL = Data;                //装填待写入数据
      LCD_CS = 0;                //片选拉低
      LCD_RS = 1;                //写数据
      LCMIFCR = 0x85;                //允许lcm接口功能,写数据
      while(!LCD_CS);                //等待数据发送完毕
}

u8 LCD_RD_DATA(void)                //lcd读8bit数据
{
      u8 dat;
      LCD_CS = 0;
      LCD_RS = 1;                //读数据
      LCMIFCR = 0x87;                //允许lcm接口功能,读数据
      while(!LCD_CS);                //等待数据接收完毕
      dat = LCMIFDATL;
      return dat;
}

void LCD_WR_DATA16(u16 Data)                //lcd写16bit数据
{
      LCD_WR_DATA((u8)(Data >> 8));                //lcd写高8位数据
      LCD_WR_DATA((u8)Data);                //lcd写低8位数据
}

void LCD_ILI9341_Init(void)
{
      LCD_WR_REG(0xCF);
      LCD_WR_DATA(0x00);
      LCD_WR_DATA(0xD9);         //0xC1
      LCD_WR_DATA(0X30);
      LCD_WR_REG(0xED);
      LCD_WR_DATA(0x64);
      LCD_WR_DATA(0x03);
      LCD_WR_DATA(0X12);
      LCD_WR_DATA(0X81);
      LCD_WR_REG(0xE8);
      LCD_WR_DATA(0x85);
      LCD_WR_DATA(0x10);
      LCD_WR_DATA(0x7A);
      LCD_WR_REG(0xCB);
      LCD_WR_DATA(0x39);
      LCD_WR_DATA(0x2C);
      LCD_WR_DATA(0x00);
      LCD_WR_DATA(0x34);
      LCD_WR_DATA(0x02);
      LCD_WR_REG(0xF7);
      LCD_WR_DATA(0x20);
      LCD_WR_REG(0xEA);
      LCD_WR_DATA(0x00);
      LCD_WR_DATA(0x00);
      LCD_WR_REG(0xC0);    //Power control
      LCD_WR_DATA(0x1B);   //VRH
      LCD_WR_REG(0xC1);    //Power control
      LCD_WR_DATA(0x12);   //SAP;BT 0x01
      LCD_WR_REG(0xC5);    //VCM control
      LCD_WR_DATA(0x08);          //30
      LCD_WR_DATA(0x26);          //30
      LCD_WR_REG(0xC7);    //VCM control2
      LCD_WR_DATA(0XB7);
      LCD_WR_REG(0x36);    // Memory Access Control
      LCD_WR_DATA(0x08);
      LCD_WR_REG(0x3A);   
      LCD_WR_DATA(0x55);
      LCD_WR_REG(0xB1);   
      LCD_WR_DATA(0x00);   
      LCD_WR_DATA(0x1A);
      LCD_WR_REG(0xB6);    // Display Function Control
      LCD_WR_DATA(0x0A);
      LCD_WR_DATA(0xA2);
      LCD_WR_REG(0xF2);    // 3Gamma Function Disable
      LCD_WR_DATA(0x00);
      LCD_WR_REG(0x26);    //Gamma curve selected
      LCD_WR_DATA(0x01);
      LCD_WR_REG(0xE0);    //Set Gamma
      LCD_WR_DATA(0x0F);
      LCD_WR_DATA(0x1D);
      LCD_WR_DATA(0x1A);
      LCD_WR_DATA(0x0A);
      LCD_WR_DATA(0x0D);
      LCD_WR_DATA(0x07);
      LCD_WR_DATA(0x49);
      LCD_WR_DATA(0X66);
      LCD_WR_DATA(0x3B);
      LCD_WR_DATA(0x07);
      LCD_WR_DATA(0x11);
      LCD_WR_DATA(0x01);
      LCD_WR_DATA(0x09);
      LCD_WR_DATA(0x05);
      LCD_WR_DATA(0x04);                  
      LCD_WR_REG(0XE1);    //Set Gamma
      LCD_WR_DATA(0x00);
      LCD_WR_DATA(0x18);
      LCD_WR_DATA(0x1D);
      LCD_WR_DATA(0x02);
      LCD_WR_DATA(0x0F);
      LCD_WR_DATA(0x04);
      LCD_WR_DATA(0x36);
      LCD_WR_DATA(0x13);
      LCD_WR_DATA(0x4C);
      LCD_WR_DATA(0x07);
      LCD_WR_DATA(0x13);
      LCD_WR_DATA(0x0F);
      LCD_WR_DATA(0x2E);
      LCD_WR_DATA(0x2F);
      LCD_WR_DATA(0x05);
      LCD_WR_REG(0x36);   // MADCTL
      LCD_WR_DATA(0x08);   // 竖屏 + BGR}
      LCD_WR_REG(0x2A);
      LCD_WR_DATA(0x00);
      LCD_WR_DATA(0x00);
      LCD_WR_DATA(0x00);
      LCD_WR_DATA(0xef);
      LCD_WR_REG(0x2B);
      LCD_WR_DATA(0x00);
      LCD_WR_DATA(0x00);
      LCD_WR_DATA(0x01);
      LCD_WR_DATA(0x3f);         
      LCD_WR_REG(0x11);         //Exit Sleep
      Delay50ms();Delay50ms();Delay50ms();
      LCD_WR_REG(0x29);         //display on      
}

void LCD_Clear(u16 color)
{
      u16 i, j;
      LCD_WR_REG(0x2A);
      LCD_WR_DATA(0x00); LCD_WR_DATA(0x00);       // X start
      LCD_WR_DATA(0x00); LCD_WR_DATA(0xEF);       // X end (239)

      LCD_WR_REG(0x2B);
      LCD_WR_DATA(0x00); LCD_WR_DATA(0x00);       // Y start
      LCD_WR_DATA(0x01); LCD_WR_DATA(0x3F);       // Y end (319)

      LCD_WR_REG(0x2C);                            // Memory Write

      for (i = 0; i < 320; i++)
      {
                for (j = 0; j < 240; j++)
                {
                        LCD_WR_DATA16(color);
                }
      }
}

void LCD_Init()
{
      LCD_GPIO_Init();
      LCD_LCM_Init();
      LCD_Reset();
      LCD_ILI9341_Init();
}

void Uart1_Init(void)      //115200bps@40.000MHz
{
      SCON = 0x50;                //8位数据,可变波特率
      AUXR |= 0x40;                //定时器时钟1T模式
      AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
      TMOD &= 0x0F;                //设置定时器模式
      TL1 = 0xA9;                        //设置定时初始值
      TH1 = 0xFF;                        //设置定时初始值
      ET1 = 0;                        //禁止定时器中断
      TR1 = 1;                        //定时器1开始计时
}

void Init()
{
      P_SW2 = 0x80;                //使能访问控制寄存器
      EA = 1;                //开启总中断
      LCD_Init();
      Uart1_Init();
}

void LCD_ReadReg(u16 LCD_Reg,u8 *Rval,int n)
{
      LCD_WR_REG(LCD_Reg);
      while(n--)
      {               
                *(Rval++) = LCD_RD_DATA();
      }
}

u16 LCD_Read_ID(void)
{
      u8 val = {0};
      LCD_ReadReg(0xD3,val,4);
      return (val<<8)|val;
}

void Delay5ms(void)      //@40.000MHz
{
      unsigned char data i, j, k;

      _nop_();
      i = 2;
      j = 4;
      k = 185;
      do
      {
                do
                {
                        while (--k);
                } while (--j);
      } while (--i);
}

void Delay1000ms(void)      //@40.000MHz
{
      unsigned char data i, j, k;

      _nop_();
      i = 203;
      j = 236;
      k = 131;
      do
      {
                do
                {
                        while (--k);
                } while (--j);
      } while (--i);
}

void main()
{
      Init();
      LCD_Clear(0x5555);
      while(1)
      {
                u16 dat = LCD_Read_ID();
                SBUF = (u8)dat >> 8;
                Delay5ms();
                SBUF = (u8)dat;
                Delay1000ms();
      }
}

void LCM_Interrupt(void) interrupt 59
{
      LCMIFSTA = 0x00;
      LCD_CS = 1;
}


kutwucpa 发表于 2025-6-10 21:16:06

以及原理图,也并不确定硬件是否有问题

神农鼎 发表于 2025-6-10 21:35:30





深圳国芯人工智能有限公司-实验箱

ercircle 发表于 2025-6-10 21:35:45

Ai8051U实验箱ILI9341的例程(8bit),对比看看,和楼上这个电路图部分引脚不一样:


神农鼎 发表于 2025-6-10 21:38:13

本坛搜索 关键字 ILI9341

kutwucpa 发表于 2025-6-10 21:54:07

ercircle 发表于 2025-6-10 21:35
Ai8051U实验箱ILI9341的例程(8bit),对比看看,和楼上这个电路图部分引脚不一样:




我的程序本身就是对照着stc8h8k64的试验箱例程写的,ai8051的也对比过,甚至吧8h8k64的例程修改引脚定义下载测试过,逻辑分析仪都能采集到单片机发出的对应的数据,但屏就是没反应。我对比ai8051和tc8h8k64初始化有个区别是并口初始化时一个是准双向一个是推挽,我都测试了,都不行,我甚至还写了一个软件的,都不行,以及信号很怪,后面我再补一张准双向接收的时序

kutwucpa 发表于 2025-6-10 21:54:41

准双向时的接收波形

ercircle 发表于 2025-6-10 21:59:29

kutwucpa 发表于 2025-6-10 21:54
我的程序本身就是对照着stc8h8k64的试验箱例程写的,ai8051的也对比过,甚至吧8h8k64的例程修改引脚定义 ...

这个屏的出厂参数是否支持2.8V?
工程打包上传下,明天测下看看

kutwucpa 发表于 2025-6-10 22:03:39

ercircle 发表于 2025-6-10 21:59
这个屏的出厂参数是否支持2.8V?
工程打包上传下,明天测下看看

问卖家要的手册看着是支持的,我一会上传打包,感谢

ercircle 发表于 2025-6-10 22:07:43

kutwucpa 发表于 2025-6-10 22:03
问卖家要的手册看着是支持的,我一会上传打包,感谢

你这个2.8V贴着下限呀....有个压降什么的不凉了,示波器测下电源稳不稳
页: [1] 2 3
查看完整版本: 8H8K64U使用LCM驱动ILI9341异常 | 可以了,TFT模块有个电阻调整后