272761180 发表于 2024-11-27 21:57:20

AI8051U驱动ST7796时遇到问题

void SPI_Init(void)       
{
        /****        配置SPI的IO引脚模式        ****/
        P1M0 |= 0xe0;                //配置MOSI/MISO/SCLK引脚为推挽输出
        P1M1 &= ~0xe0;
        P1PU |= 0xe0;                //允许准双向口内部上拉电阻       
        TFT_MOSI = 1;                //引脚上拉
        TFT_MISO = 1;
        TFT_SCLK = 1;
       
        /****        配置SPI模式        ****/
       
        SPI_S1 = 0x00;        //        选择SPI1的引脚 00:P1+        01:P2+        10:P4+        11:P3+
        SPI_S0 = 0x00;

        //控制寄存器
        SSIG = 0X01;                //控制寄存器 忽略SS引脚功能
        SPEN = 0x01;                //使能SPI
        DORD = 0x00;                //先发送高位MSB,若为1则先发送低位LSB
        MSTR = 0x01;                //设置为主机模式,单主单从模式。须根据SSIG进行不同设置
        CPOL = 0x01;                //时钟极性为高,即空闲时是高电平。极性相反时传输数据
        CPHA = 0x01;                //前沿驱动,后沿采样
       
        //时钟配置
        //系统默认启动内部高速HRC,CLKSEL = 0x00:配置为内部高速HRC -00-00-> MCLK -> HSIOCK -HSCLKDIV-> HSCLK        -SPI_CLKDIV-> SPI
        //同时,HSCLK是高速外设时钟源。当使用HSPI时在3V下最高频率为20MHz(同时调整PxSR寄存器为高速输出模式)
        CLKSEL               &= ~0x40;        //选择MCLK为高速IO时钟源
        HSCLKDIV                 = 0x01;                //高速时钟1分频 -> 24M
        SPI_CLKDIV         = 0x01;                //SPI输入时钟1分频,0-255        -> 24M                                                       
        SPR1 = 0x01;                                        //SCLK频率 = 24MHz/2 = 12MHz
        SPR0 = 0x01;
       
        //中断配置
        ESPI = 0x00;                                //禁止SPI中断
        SPSTAT = 0xc0;                        //清除中断标志位SPIF和写冲突标志位WCOL

        UART1_printf("开启LCD的SPI\n");
}


u8 SPI_WriteByte(u8 Byte)
{
        SPDAT = Byte;
        while(!SPIF);        //等待接收完一个byte
        SPSTAT = 0xc0;                //清SPIF/WCOL标志
        return (SPDAT);
} SPI的配置有问题吗?


void LCD_WR_REG(u8 dat)
{
   LCD_CS=0;   
       LCD_RS=0;          
   SPI_WriteByte(dat);
   LCD_CS=1;       
}

void LCD_WR_DATA(u8 dat)
{
   LCD_CS=0;
       LCD_RS=1;
   SPI_WriteByte(dat);
   LCD_CS=1;
}

void LCD_Clear(u16 Color)
{
unsigned int i,m;
        LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);   
        LCD_CS=0;
        LCD_RS=1;
        for(i=0;i<lcddev.height;i++)
        {
    for(m=0;m<lcddev.width;m++)
    {       
                        SPI_WriteByte(Color>>8);
                        SPI_WriteByte(Color);
                }
        }
       LCD_CS=1;
}

void LCD_IO_Init(void)
{
        P1M0 |= 0x13;                //BL/RS/CS推挽输出
        P1M1 &= ~0x13;
        P4M0 |= 0x80;         //RST推挽输出
        P4M1 &= ~0x80;
       
        P1PU |= 0x13;                //启用上拉电阻
        P4PU |=        0x80;
       
        LCD_CS=1;
        LCD_BL=1;
        LCD_RS=1;
        LCD_RST=1;
}

void LCD_RESET(void)
{
        LCD_RST=0;
        delay_ms(100);       
        LCD_RST=1;
        delay_ms(50);
}

void LCD_Init(void)
{
        SPI_Init();                                //硬件SPI初始化
        LCD_IO_Init();                //LCD IO初始化
        LCD_RESET();                         //LCD 复位
       
        /****        ST7796S IPS初始化        ****/       
        LCD_WR_REG(0x11);   

        delay_ms(120);

        LCD_WR_REG(0x36);   // Memory Data Access Control MY,MX~~
        LCD_WR_DATA(0x48);   

        LCD_WR_REG(0x3A);   
        LCD_WR_DATA(0x55);   //LCD_WR_DATA(0x66);

        LCD_WR_REG(0xF0);   // Command Set Control
        LCD_WR_DATA(0xC3);   

        LCD_WR_REG(0xF0);   
        LCD_WR_DATA(0x96);   

        LCD_WR_REG(0xB4);   
        LCD_WR_DATA(0x01);   

        LCD_WR_REG(0xB7);   
        LCD_WR_DATA(0xC6);   

        //LCD_WR_REG(0xB9);   
        //LCD_WR_DATA(0x02);
        //LCD_WR_DATA(0xE0);

        LCD_WR_REG(0xC0);   
        LCD_WR_DATA(0x80);   
        LCD_WR_DATA(0x45);   

        LCD_WR_REG(0xC1);   
        LCD_WR_DATA(0x13);   //18//00

        LCD_WR_REG(0xC2);   
        LCD_WR_DATA(0xA7);   

        LCD_WR_REG(0xC5);   
        LCD_WR_DATA(0x0A);   

        LCD_WR_REG(0xE8);   
        LCD_WR_DATA(0x40);
        LCD_WR_DATA(0x8A);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x29);
        LCD_WR_DATA(0x19);
        LCD_WR_DATA(0xA5);
        LCD_WR_DATA(0x33);

        LCD_WR_REG(0xE0);
        LCD_WR_DATA(0xD0);
        LCD_WR_DATA(0x08);
        LCD_WR_DATA(0x0F);
        LCD_WR_DATA(0x06);
        LCD_WR_DATA(0x06);
        LCD_WR_DATA(0x33);
        LCD_WR_DATA(0x30);
        LCD_WR_DATA(0x33);
        LCD_WR_DATA(0x47);
        LCD_WR_DATA(0x17);
        LCD_WR_DATA(0x13);
        LCD_WR_DATA(0x13);
        LCD_WR_DATA(0x2B);
        LCD_WR_DATA(0x31);

        LCD_WR_REG(0xE1);
        LCD_WR_DATA(0xD0);
        LCD_WR_DATA(0x0A);
        LCD_WR_DATA(0x11);
        LCD_WR_DATA(0x0B);
        LCD_WR_DATA(0x09);
        LCD_WR_DATA(0x07);
        LCD_WR_DATA(0x2F);
        LCD_WR_DATA(0x33);
        LCD_WR_DATA(0x47);
        LCD_WR_DATA(0x38);
        LCD_WR_DATA(0x15);
        LCD_WR_DATA(0x16);
        LCD_WR_DATA(0x2C);
        LCD_WR_DATA(0x32);
       

        LCD_WR_REG(0xF0);   
        LCD_WR_DATA(0x3C);   

        LCD_WR_REG(0xF0);   
        LCD_WR_DATA(0x69);   

        delay_ms(120);               

        LCD_WR_REG(0x20);   

        LCD_WR_REG(0x29);

LCD_direction(0);//设置LCD显示方向
        LCD_Clear(RED);//清全屏白色
       
        LCD_BL=1;
       
        UART1_printf("开启LCD\n");
}
这是LCD的驱动配置


源代码

神农鼎 发表于 2024-11-27 22:24:15

谁有这个屏,寄2块给我们,我们来帮忙测试下
或者告诉我们在哪买,我们买了来测试下

zhang32568 发表于 2024-11-27 22:32:29

看了半天也没有看见你遇到什么问题?

272761180 发表于 2024-11-27 22:40:20

zhang32568 发表于 2024-11-27 22:32
看了半天也没有看见你遇到什么问题?

屏幕只能够被BL点亮,代码里 LCD_Clear(RED);正常应该全名红色,实际上就是白色,仅仅BL点亮。

272761180 发表于 2024-11-27 22:41:05

神农鼎 发表于 2024-11-27 22:24
谁有这个屏,寄2块给我们,我们来帮忙测试下
或者告诉我们在哪买,我们买了来测试下
...

【淘宝】7天无理由退货 http://e.tb.cn/h.T2R5afDtLEPwTUA?tk=lvYx3G80RAy HU9196 「3.5寸4寸TFT液晶显示屏GT911电阻电容触摸SPI串口8位16位ST7796」
点击链接直接打开 或者 淘宝搜索直接打开

(或者可以买去测试完了再无理由退货?{:5_298:})

272761180 发表于 2024-11-27 23:26:44

页: [1]
查看完整版本: AI8051U驱动ST7796时遇到问题