durongze 发表于 2025-2-5 22:32:22

AI8051U 的《38-3.5寸ILI9486驱动TFT显示屏实验程序》移到32G12K128出问题了。




大佬们,我把 AI8051U 的《38-3.5寸ILI9486驱动TFT显示屏实验程序》移到STC32G12K128上,屏幕是全白的。有大佬试过吗?




修改的地方:
0.1 AI8051U.h
0.2 STC32G.h


1.1#define   MAIN_Fosc       40000000L    //AI8051U
1.2#define   MAIN_Fosc       24000000L    //STC32G12K128


2.1

#defineLCD_DataPortH P2   //高8位数据口,8位模式下只使用高8位
#defineLCD_DataPortL P6   //低8位数据口,8位模式下低8位可以不接线
sbit LCD_RS = P4^5;         //数据/命令切换
sbit LCD_WR = P3^6;          //写控制
sbit LCD_RD = P3^7;          //读控制
sbit LCD_CS = P0^5;         //片选
sbit LCD_RESET = P4^7;      //复位

2.2

#defineLCD_DataPortH P6   //高8位数据口,8位模式下只使用高8位
#defineLCD_DataPortL P2   //低8位数据口,8位模式下低8位可以不接线
sbit LCD_RS = P4^5;            //数据/命令切换
sbit LCD_WR = P4^2;         //写控制
sbit LCD_RD = P4^4;         //读控制
sbit LCD_CS = P0^5;            //片选 P3^4
sbit LCD_RESET = P4^3;      //复位



3.1

void LCD_ReadReg(u16 LCD_Reg, u8 *Rval, int n)
{
    LCD_WR_REG(LCD_Reg);
    LCD_DataPortH = 0xFF; //拉高P6
    LCD_DataPortL = 0xFF; //拉高P2
    //P2口设置成输入口
    P2M0=0x00;
    P2M1=0xFF;

    while (n--)
    {
      *(Rval++) = LCD_RD_DATA();
    }

    //P2口设置成推挽输出
    P2M0=0xFF;
    P2M1=0x00;
    LCD_DataPortH = 0xFF; //拉高P6
    LCD_DataPortL = 0xFF; //拉高P2
}

3.2

void LCD_ReadReg(u16 LCD_Reg, u8 *Rval, int n)
{
    LCD_WR_REG(LCD_Reg);
    LCD_DataPortH = 0xFF; //拉高P6
    LCD_DataPortL = 0xFF; //拉高P2
    //P6口设置成输入口
    P6M0=0x00;
    P6M1=0xFF;


    while (n--)
    {
      *(Rval++) = LCD_RD_DATA();
    }


    //P6口设置成推挽输出
    P6M0=0xFF;
    P6M1=0x00;
    LCD_DataPortH = 0xFF; //拉高P6
    LCD_DataPortL = 0xFF; //拉高P2
}


4.1

u16 LCD_ReadPoint(u16 x, u16 y)
{
    u16 color;

    if (x>=lcddev.width||y>=lcddev.height)
    {
      return 0;   //超过了范围,直接返回
    }

    LCD_SetCursor(x, y); //设置光标位置
    LCD_ReadRAM_Prepare();
    LCD_DataPortH = 0xFF; //拉高P6
    LCD_DataPortL = 0xFF; //拉高P2

    //P2口设置成输入口
    P2M0=0x00;
    P2M1=0xFF;
    color = Lcd_RD_DATA_16Bit();
    //P2口设置成推挽输出
    P2M0=0xFF;
    P2M1=0x00;

    LCD_DataPortH = 0xFF; //拉高P6
    LCD_DataPortL = 0xFF; //拉高P2
    return color;
}

4.2

u16 LCD_ReadPoint(u16 x, u16 y)
{
    u16 color;

    if (x>=lcddev.width||y>=lcddev.height)
    {
      return 0;   //超过了范围,直接返回
    }

    LCD_SetCursor(x, y); //设置光标位置
    LCD_ReadRAM_Prepare();
    LCD_DataPortH = 0xFF; //拉高P6
    LCD_DataPortL = 0xFF; //拉高P2

    //P6口设置成输入口
    P6M0=0x00;
    P6M1=0xFF;
    color = Lcd_RD_DATA_16Bit();
    //P6口设置成推挽输出
    P6M0=0xFF;
    P6M1=0x00;

    LCD_DataPortH = 0xFF; //拉高P6
    LCD_DataPortL = 0xFF; //拉高P2
    return color;
}


5.1

void LCD_Set_GPIO(void)
{
    //P2口设置成推挽输出
    P2M0=0xff;
    P2M1=0x00;

    //P0.4口设置成高阻输入,P0.5推挽输出
    P0M0=0x20;
    P0M1=0x10;

    //P1.4,P1.5口设置成高阻输入
    P1M0=0x00;
    P1M1=0x30;

    //P6口设置成高阻输入(8bit)
    P6M0=0x00;
    P6M1=0xff;

    //P3.7,P3.6口设置成推挽输出
    P3M0=0xc0;
    P3M1=0x00;

    //P4.7,P4.5口设置成推挽输出
    P4M0=0xa0;
    P4M1=0x00;

    //P5.3口设置成推挽输出
    P5M0=0x08;
    P5M1=0x00;
}


5.2


void LCD_Set_GPIO(void)
{
    //P6口设置成推挽输出
    P6M0=0xff;
    P6M1=0x00;

    //P3^4
    P3M0=0x00;
    P3M1=0x10;

    //P0.4口设置成高阻输入,P0.5推挽输出
    P0M0=0x20;
    P0M1=0x10;

    //P1.4,P1.5口设置成高阻输入
    P1M0=0x00;
    P1M1=0x30;

    //P6口设置成高阻输入(8bit)
    P2M0=0x00;
    P2M1=0xff;

    //P4.4,P4.2口设置成推挽输出
    // P4M0=0x14;
    // P4M1=0x00;

    //P4.3,P4.5口设置成推挽输出
    // P4M0=0x28;
    // P4M1=0x00;

    P4M0=0x3C;
    P4M1=0x00;

    //P3.4口设置成推挽输出
    //P3M0=0x10;
    //P3M1=0x00;
}

durongze 发表于 2025-2-5 22:37:12

void LCD_write(u8 HVAL, u8 LVAL)
{
    LCD_CS = 0;
    LCD_WR = 0;
    LCD_DataPortH = HVAL;
    LCD_DataPortL = LVAL;
    LCD_WR = 1;
    LCD_CS = 1;
}

u16 LCD_read(void)
{
    u16 d;
    LCD_CS = 0;
    LCD_RD = 0;
    delay_us(1); //delay 1 us
    d = LCD_DataPortH;
    d = (d<<8)|LCD_DataPortL;
    LCD_RD = 1;
    LCD_CS = 1;
    return d;
}

这是读写,这一块应该不影响。



乘风飞扬 发表于 2025-2-6 09:18:10

Ai8051U实验箱TFT彩屏接口,LCD_CS脚只接其中一端:

使用32G实验箱的话同样拆掉一个电阻,或者将另一端的IO口设置高阻输入,避免相互干扰。

durongze 发表于 2025-2-7 10:45:09

乘风飞扬 发表于 2025-2-6 09:18
Ai8051U实验箱TFT彩屏接口,LCD_CS脚只接其中一端:

使用32G实验箱的话同样拆掉一个电阻,或者将另一端的I ...
感谢大佬指导。

--------------------------------------

通过大佬的指导,现在已经可以了。正确代码如下:

void LCD_Set_GPIO(void)
{
    //P6口设置成推挽输出
    P6M0=0xff;
    P6M1=0x00;

    //P3^4
    P3M0=0x00;
    P3M1=0x10;

    //P0.4口设置成高阻输入,P0.5推挽输出
    P0M0=0x20;
    P0M1=0x10;

    //P1.4,P1.5口设置成高阻输入
    P1M0=0x00;
    P1M1=0x30;

    //P6口设置成高阻输入(8bit)
    P2M0=0x00;
    P2M1=0xff;

    //P4.4,P4.2口设置成推挽输出
    // P4M0=0x14;
    // P4M1=0x00;

    //P4.3,P4.5口设置成推挽输出
    // P4M0=0x28;
    // P4M1=0x00;

    P4M0=0x3C;
    P4M1=0x00;

    //P3.4口设置成推挽输出
    //P3M0=0x10;
    //P3M1=0x00;
}
页: [1]
查看完整版本: AI8051U 的《38-3.5寸ILI9486驱动TFT显示屏实验程序》移到32G12K128出问题了。