找回密码
 立即注册
楼主: 电***

STC32如何驱动(ILI988驱动的)TFT屏,有STC12的驱动源码,移植不通过

[复制链接]
  • TA的每日心情

    13 小时前
  • 签到天数: 115 天

    [LV.6]常住居民II

    3

    主题

    204

    回帖

    550

    积分

    高级会员

    积分
    550
    发表于 2023-12-18 23:14:07 | 显示全部楼层
    xiaoyuxinke 发表于 2023-12-18 13:39
    这个是STC12C5A60S2的,在KEIL4下编译正常,也可以正常使用,关键是我想用STC32G12K128来搞这个,这个程 ...

    我的意思就是你把你移植的STC32的代码发上来,看看能不能帮你改掉编译错误
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 124 天

    [LV.7]常住居民III

    4

    主题

    235

    回帖

    856

    积分

    高级会员

    积分
    856
    发表于 2023-12-20 21:45:37 | 显示全部楼层
    电子芯 发表于 2023-11-27 15:25
    STC12的移植不过去,不知道是哪里的问题

    12的硬件不支持,得用IO口模拟,修改底层逻辑估计就可以了。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    回帖

    4

    积分

    新手上路

    积分
    4
    发表于 2024-1-3 09:41:09 | 显示全部楼层
    电子芯 发表于 2023-11-27 15:25
    STC12的移植不过去,不知道是哪里的问题



    //========================================================================
    // 描述: LCD写入一个字节数据.
    // 参数: HVAL:写入的字节数据.
    // 返回: none.
    //========================================================================
    void ILI9488_write(uint8 HVAL,uint8 LVAL)
    {
        ILI9488_CS = 0;
        ILI9488_WR = 0;
        ILI9488_DATAPORTH = HVAL;
        ILI9488_DATAPORTL = LVAL;
        ILI9488_WR = 1;
        ILI9488_CS = 1;
    }

    //========================================================================
    // 描述: LCD写入命令.
    // 参数: Reg:写入的命令.
    // 返回: none.
    //========================================================================
    void ILI9488_wr_reg(uint16 Reg)
    {
        #if (USR_LCM_IF == 0)
        {
            ILI9488_RS=0;
            ILI9488_write((Reg>>8)&0xFF,Reg&0xFF);
            ILI9488_RS=1;
        }
        #else
        {
            LCMIFDATH = (uint8)(Reg>>8);
            LCMIFDATL = (uint8)Reg;
            ILI9488_CS = 0;
            LCMIFCR = 0x84; //写命令
            while((LCMIFSTA&0x01)==0);
            LCMIFSTA = 0x00;
            ILI9488_CS = 1;
        }
        #endif
    }

    //========================================================================
    // 描述: LCD写入数据.
    // 参数: Data:写入的数据.
    // 返回: none.
    //========================================================================
    void ILI9488_wr_data(uint16 Data)
    {
        #if (USR_LCM_IF == 0)
        {
            ILI9488_write((Data>>8)&0xFF,Data&0xFF);
        }
        #else
        {
            LCMIFDATH = (uint8)(Data>>8);
            LCMIFDATL = (uint8)Data;
            ILI9488_CS = 0;
            LCMIFCR = 0x85; //写数据
            while((LCMIFSTA&0x01)==0);
            LCMIFSTA = 0x00;
            ILI9488_CS = 1;
        }
        #endif
    }

    //========================================================================
    // 描述: LCD写入16位数据.
    // 参数: Data:写入的数据.
    // 返回: none.
    //========================================================================
    void ILI9488_wr_data_16bit(uint16 Data)
    {
        #if (USR_LCM_IF == 0)
        {
            ILI9488_write((Data>>8)&0xFF,Data&0xFF);
        }
        #else
        {
            LCMIFDATH = (uint8)(Data>>8)&0xFF;
            LCMIFDATL = (uint8)Data&0xFF;
            ILI9488_CS = 0;
            LCMIFCR = 0x85; //写数据
            while((LCMIFSTA&0x01)==0);
            LCMIFSTA = 0x00;
        }
        #endif
    }

    //========================================================================
    // 描述: LCD写寄存器.
    // 参数: LCD_Reg:写的寄存器地址; LCD_RegValue:写入的值.
    // 返回: none.
    //========================================================================
    void ILI9488_writereg(uint16 LCD_Reg, uint16 LCD_RegValue)
    {
        ILI9488_wr_reg(LCD_Reg);
        ILI9488_wr_data(LCD_RegValue);
    }

    //========================================================================
    // 描述: LCD清屏.
    // 参数: color:清屏的颜色.
    // 返回: none.
    //========================================================================
    void ILI9488_clear(uint16 color)
    {
        uint16 i, j;
        ILI9488_set_windows(0, 0, ILI9488_lcddev.width - 1, ILI9488_lcddev.height - 1);
        for (i = 0; i < ILI9488_lcddev.width; i++)
        {
            for (j = 0; j < ILI9488_lcddev.height; j++)
            {
                ILI9488_wr_data_16bit(color);
            }
        }
    }

    //========================================================================
    // 描述: LCD画点.
    // 参数: x,y: 坐标.
    // 返回: none.
    //========================================================================
    void ILI9488_draw_point(uint16 x, uint16 y, uint16 color)
    {
        ILI9488_set_windows(x, y, x, y);//设置光标位置
        ILI9488_wr_data_16bit(color);
    }

    //========================================================================
    // 描述: LCD的GPIO配置.
    // 参数: none.
    // 返回: none.
    //========================================================================
    void ILI9488_set_gpio()
    {
        ILI9488_CS_OUT;
        ILI9488_RESET_OUT;
        ILI9488_DATAPORTH_OUT;//P6口设置成推挽输出
        ILI9488_DATAPORTL_OUT;
        #if (USR_LCM_IF == 0)
        {
            P3M1|=0x10;P3M0&=~0x10;
            P4M1|=0x34;P4M0&=~0x34;

            ILI9488_RD_OUT;   //设置为推挽输出
            ILI9488_WR_OUT;
            ILI9488_RS_OUT;
        }
        #else
        {
            P4M1&=~0x34;P4M0|=0x34; //P4.2,P4.4,P4.5口设置成推挽输出
            P_SW2 |= 0x80;
            LCMIFCFG = 0x0E;    //bit7 1:Enable Interrupt, bit1 0:8bit mode; bit0 0:8080,1:6800
            LCMIFCFG2 = 0x09;       //RS:P45,RD:P44,WR:P42; Setup Time=2,HOLD Time=1
            LCMIFSTA = 0x00;
        }
        #endif
    }

    //========================================================================
    // 描述: LCD初始化.
    // 参数: none.
    // 返回: none.
    //========================================================================
    void ILI9488_init()
    {
    //  P1M1|=0x01;P1M0&=~0x01;//P10高阻输入
        ILI9488_set_gpio();
        delay(50);
        ILI9488_RESET = 0;
        delay(50);
        ILI9488_RESET = 1;
        delay(30);              //初始化之前复位
    ///////////////////////////////////////////////////
        ILI9488_wr_reg(0xE0);
        ILI9488_wr_data(0x00);
        ILI9488_wr_data(0x07);
        ILI9488_wr_data(0x0f);
        ILI9488_wr_data(0x0D);
        ILI9488_wr_data(0x1B);
        ILI9488_wr_data(0x0A);
        ILI9488_wr_data(0x3c);
        ILI9488_wr_data(0x78);
        ILI9488_wr_data(0x4A);
        ILI9488_wr_data(0x07);
        ILI9488_wr_data(0x0E);
        ILI9488_wr_data(0x09);
        ILI9488_wr_data(0x1B);
        ILI9488_wr_data(0x1e);
        ILI9488_wr_data(0x0f);

        ILI9488_wr_reg(0xE1);
        ILI9488_wr_data(0x00);
        ILI9488_wr_data(0x22);
        ILI9488_wr_data(0x24);
        ILI9488_wr_data(0x06);
        ILI9488_wr_data(0x12);
        ILI9488_wr_data(0x07);
        ILI9488_wr_data(0x36);
        ILI9488_wr_data(0x47);
        ILI9488_wr_data(0x47);
        ILI9488_wr_data(0x06);
        ILI9488_wr_data(0x0a);
        ILI9488_wr_data(0x07);
        ILI9488_wr_data(0x30);
        ILI9488_wr_data(0x37);
        ILI9488_wr_data(0x0f);

        ILI9488_wr_reg(0xC0);
        ILI9488_wr_data(0x10);
        ILI9488_wr_data(0x10);

        ILI9488_wr_reg(0xC1);
        ILI9488_wr_data(0x41);

        ILI9488_wr_reg(0xC5);
        ILI9488_wr_data(0x00);
        ILI9488_wr_data(0x22);
        ILI9488_wr_data(0x80);

        ILI9488_wr_reg(0x36);
        ILI9488_wr_data(0x48);

        ILI9488_wr_reg(0x3A); //Interface Mode Control
        ILI9488_wr_data(0x55);

        ILI9488_wr_reg(0XB0);  //Interface Mode Control
        ILI9488_wr_data(0x00);
        ILI9488_wr_reg(0xB1);   //Frame rate 70HZ
        ILI9488_wr_data(0xB0);
        ILI9488_wr_data(0x11);
        ILI9488_wr_reg(0xB4);
        ILI9488_wr_data(0x02);
        ILI9488_wr_reg(0xB6); //RGB/MCU Interface Control
        ILI9488_wr_data(0x02);
        ILI9488_wr_data(0x02);

        ILI9488_wr_reg(0xB7);
        ILI9488_wr_data(0xC6);

        ILI9488_wr_reg(0xE9);
        ILI9488_wr_data(0x00);

        ILI9488_wr_reg(0XF7);
        ILI9488_wr_data(0xA9);
        ILI9488_wr_data(0x51);
        ILI9488_wr_data(0x2C);
        ILI9488_wr_data(0x82);

        ILI9488_wr_reg(0x11);
        ILI9488_wr_reg(0x29);
        ILI9488_direction(0);//设置LCD显示方向
        //  LCD_BL=1;//点亮背光
    }

    //========================================================================
    // 描述: LCM_DMA初始化.
    // 参数: color:写入彩屏的数据的地址; buf:从彩屏读出时存入的地址; len:长度.
    // 返回: none.
    //========================================================================
    #if (USR_LCM_IF == 1)
    void LCM_DMA_init(uint16  *color, uint16  *buf, uint16 len)
    {
        uint16 tx_addr = color;
        uint16 rx_addr = buf;

        P_SW2 |= 0x80;
        DMA_LCM_AMTH = (len&0xff00)>>8; //设置传输字节数高位
        DMA_LCM_AMT = (uint8)len; //低位

        DMA_LCM_TXAH = (tx_addr&0xff00)>>8 ;  //写入彩屏的数据的地址
        DMA_LCM_TXAL = (uint8)(tx_addr);

        DMA_LCM_RXAH = (rx_addr&0xff00)>>8; //从彩屏读出时存入的地址
        DMA_LCM_RXAL = (uint8)(rx_addr);

        DMA_LCM_STA = 0x00;
        DMA_LCM_CFG = 0x82;  //允许LCM_DMA中断
        DMA_LCM_CR = 0x00;
    }
    #endif

    //========================================================================
    // 描述: LCD设置窗口.
    // 参数: x0,y0:起始坐标; x1,y1:终点坐标.
    // 返回: none.
    //========================================================================
    void ILI9488_set_windows(uint16 x0, uint16 y0, uint16 x1, uint16 y1)
    {
        ILI9488_wr_reg(0x2A);
        ILI9488_wr_data(x0 >> 8);
        ILI9488_wr_data(0x00FF & x0);
        ILI9488_wr_data(x1 >> 8);
        ILI9488_wr_data(0x00FF & x1);

        ILI9488_wr_reg(0x2B);
        ILI9488_wr_data(y0 >> 8);
        ILI9488_wr_data(0x00FF & y0);
        ILI9488_wr_data(y1 >> 8);
        ILI9488_wr_data(0x00FF & y1);

        ILI9488_wr_reg(0x2c);   //开始写入GRAM
    }

    //========================================================================
    // 描述: LCD设置光标.
    // 参数: x:横坐标; y:纵坐标;
    // 返回: none.
    //========================================================================
    void ILI9488_set_cursor(uint16 x, uint16 y)
    {
        ILI9488_set_windows(x, y, x, y);
    }

    //========================================================================
    // 描述: 设置显示方向.
    // 参数: direction:0~3;
    // 返回: none.
    //========================================================================
    void ILI9488_direction(uint8 direction)
    {
        switch (direction) {
            case 0:
                ILI9488_lcddev.width = ILI9488_LCD_W;
                ILI9488_lcddev.height = ILI9488_LCD_H;
                /* BIT7:MY; BIT6:MX; BIT5:MV(行列交换); BIT4:ML; BIT3:0,RGB,1,BGR; BIT2:MH */
                ILI9488_writereg(0x36, (0<<7)|(1<<6)|(0<<5)|(0<<4)|(ILI9488_RGB_ORDER<<3));
                break;
            case 1:
                ILI9488_lcddev.width = ILI9488_LCD_H;
                ILI9488_lcddev.height = ILI9488_LCD_W;
                ILI9488_writereg(0x36, (1<<7)|(1<<6)|(1<<5)|(0<<4)|(ILI9488_RGB_ORDER<<3));
                break;
            case 2:
                ILI9488_lcddev.width = ILI9488_LCD_W;
                ILI9488_lcddev.height = ILI9488_LCD_H;
                ILI9488_writereg(0x36, (1<<7)|(0<<6)|(0<<5)|(0<<4)|(ILI9488_RGB_ORDER<<3));
                break;
            case 3:
                ILI9488_lcddev.width = ILI9488_LCD_H;
                ILI9488_lcddev.height = ILI9488_LCD_W;
                ILI9488_writereg(0x36, (0<<7)|(0<<6)|(1<<5)|(0<<4)|(ILI9488_RGB_ORDER<<3));
                break;
            default:
                break;
        }
    }

    //========================================================================
    // 描述: LCD填充.
    // 参数: sx,sy:起始坐标; x1,y1:终止坐标; color:颜色
    // 返回: none.
    //========================================================================
    void ILI9488_fill(uint16 x0, uint16 y0, uint16 x1, uint16 y1, uint16 color)
    {
        uint16 i, j;
        uint16 width = x1 - x0 + 1;         //得到填充的宽度
        uint16 height = y1 - y0 + 1;        //高度
        ILI9488_set_windows(x0, y0, x1, y1);//设置显示窗口
        for (i = 0; i < height; i++)
        {
            for (j = 0; j < width; j++)
                ILI9488_wr_data_16bit(color);   //写入数据
        }
        ILI9488_set_windows(0, 0, ILI9488_lcddev.width - 1, ILI9488_lcddev.height - 1);//恢复窗口设置为全屏
    }

    //========================================================================
    // 描述: LCD绘制线段.
    // 参数: x1,y1:起始坐标; x2,y2:终止坐标;color:颜色.
    // 返回: none.
    //========================================================================
    void ILI9488_draw_line(uint16 x0, uint16 y0, uint16 x1, uint16 y1, uint16 color)
    {
        int t;
        int xerr = 0, yerr = 0, delta_x, delta_y, distance;
        int incx, incy, uRow, uCol;
        delta_x = x1 - x0; //计算坐标增量
        delta_y = y1 - y0;
        uRow = x0;
        uCol = y0;
        if (delta_x > 0)incx = 1; //设置单步方向
        else if (delta_x == 0)incx = 0;//垂直线
        else { incx = -1; delta_x = -delta_x; }
        if (delta_y > 0)incy = 1;
        else if (delta_y == 0)incy = 0;//水平线
        else { incy = -1; delta_y = -delta_y; }
        if (delta_x > delta_y)distance = delta_x; //选取基本增量坐标轴
        else distance = delta_y;
        for (t = 0; t <= distance + 1; t++)//画线输出
        {
            ILI9488_draw_point(uRow, uCol, color);//画点
            xerr += delta_x;
            yerr += delta_y;
            if (xerr > distance)
            {
                xerr -= distance;
                uRow += incx;
            }
            if (yerr > distance)
            {
                yerr -= distance;
                uCol += incy;
            }
        }
    }


    ILI9488.h

    35.91 KB, 下载次数: 11

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-2-12 10:15
  • 签到天数: 37 天

    [LV.5]常住居民I

    1

    主题

    42

    回帖

    157

    积分

    注册会员

    积分
    157
    发表于 2024-1-4 14:19:37 | 显示全部楼层
    mark下 下次回来看!
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-31 00:22
  • 签到天数: 39 天

    [LV.5]常住居民I

    2

    主题

    45

    回帖

    268

    积分

    中级会员

    积分
    268
    发表于 2024-1-7 20:18:33 | 显示全部楼层
    Snapdragon 发表于 2023-12-18 23:14
    我的意思就是你把你移植的STC32的代码发上来,看看能不能帮你改掉编译错误 ...

    不能移植啊,只是把原程序改成STC32G12K128头文件,编译软件用的C251
    MAIN函数里加入了STC32G12K128的IO设置
    编译一下会出几百个错误,后面就不弄了,弄不了。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-1-16 12:51
  • 签到天数: 2 天

    [LV.1]初来乍到

    13

    主题

    31

    回帖

    151

    积分

    注册会员

    积分
    151
     楼主| 发表于 2024-1-15 13:46:24 | 显示全部楼层
    xiaoyuxinke 发表于 2024-1-7 20:18
    不能移植啊,只是把原程序改成STC32G12K128头文件,编译软件用的C251
    MAIN函数里加入了STC32G12K128的IO ...

    我编译没错,但是不行
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-1-16 12:51
  • 签到天数: 2 天

    [LV.1]初来乍到

    13

    主题

    31

    回帖

    151

    积分

    注册会员

    积分
    151
     楼主| 发表于 2024-1-15 13:47:07 | 显示全部楼层
    LINFA 发表于 2024-1-3 09:41
    //========================================================================
    // 描述: LCD写入一个 ...

    测试OK?
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-31 00:22
  • 签到天数: 39 天

    [LV.5]常住居民I

    2

    主题

    45

    回帖

    268

    积分

    中级会员

    积分
    268
    发表于 2024-1-18 16:20:18 | 显示全部楼层
    电子芯 发表于 2024-1-15 13:46
    我编译没错,但是不行

    这个没那么简单,使用硬件SPI的,两个单片机的SPI寄存器都不一样,肯定不能只是改这些
    如果要使用STC32G12K128,估计要把原来的SPI部分整个重新写。不然肯定不行。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    22 小时前
  • 签到天数: 155 天

    [LV.7]常住居民III

    9

    主题

    833

    回帖

    3235

    积分

    论坛元老

    积分
    3235
    发表于 2024-2-1 20:59:52 | 显示全部楼层
    电子芯 发表于 2024-1-15 13:46
    我编译没错,但是不行

    我移植的可以了。







    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 天前
  • 签到天数: 20 天

    [LV.4]偶尔看看III

    5

    主题

    32

    回帖

    109

    积分

    注册会员

    积分
    109
    发表于 2024-4-2 17:39:33 | 显示全部楼层
    我刚写了一个STC32G12K128芯片   适配的3.5寸 ILI9341显示屏 SPI 4线接口
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-4-27 23:04 , Processed in 0.098066 second(s), 66 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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