找回密码
 立即注册
查看: 204|回复: 3

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-01 18:20:12

79

主题

631

回帖

1132

积分

金牌会员

积分
1132
发表于 2025-2-5 22:32:22 | 显示全部楼层 |阅读模式
38-3.5寸ILI9486驱动TFT显示屏实验程序.zip (36.5 KB, 下载次数: 16)


大佬们,我把 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

#define  LCD_DataPortH P2   //高8位数据口,8位模式下只使用高8位
#define  LCD_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

#define  LCD_DataPortH P6   //高8位数据口,8位模式下只使用高8位
#define  LCD_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;
}

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-01 18:20:12

79

主题

631

回帖

1132

积分

金牌会员

积分
1132
发表于 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;
}

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


截图202502071036241843.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2025-2-6 09:18:10 | 显示全部楼层
Ai8051U实验箱TFT彩屏接口,LCD_CS脚只接其中一端:
截图202502060915209083.jpg
使用32G实验箱的话同样拆掉一个电阻,或者将另一端的IO口设置高阻输入,避免相互干扰。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-01 18:20:12

79

主题

631

回帖

1132

积分

金牌会员

积分
1132
发表于 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;
}
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 20:57 , Processed in 0.134752 second(s), 67 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表