- 打卡等级:初来乍到
 
				- 打卡总天数:3
 
				
				
				- 最近打卡:2025-06-12 22:59:24
 
				  
  已绑定手机 
新手上路 
 
 
	- 积分
 - 47
 
 
 
 
 | 
 
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[5:0]  
        LCD_WR_REG(0xC1);    //Power control  
        LCD_WR_DATA(0x12);   //SAP[2:0];BT[3:0] 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[4] = {0}; 
        LCD_ReadReg(0xD3,val,4); 
        return (val[2]<<8)|val[3]; 
} 
 
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; 
} 
 
 
 |   
- 
 
 
 
 
 
 
 
 |