- 打卡等级:初来乍到
- 打卡总天数:3
- 最近打卡:2025-06-12 22:59:24
已绑定手机
新手上路
- 积分
- 37
|
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;
}
|
-
|