JackLaw666 发表于 2023-11-28 20:39:03

向高手学习{:4_196:}

Snapdragon 发表于 2023-12-3 01:21:05

xiaoyuxinke 发表于 2023-12-2 20:03
我也不知道哪里出问题了,高低编译不通过,愁死了

编译不通过好解决啊,我还以为是点不亮呢

Snapdragon 发表于 2023-12-16 23:23:00

xiaoyuxinke 发表于 2023-12-16 09:59
编译时出现好多错误

我们没有硬件可能没办法帮你调试,但是编译错误的话还是可以改的。你可以把你的工程发出来、

Snapdragon 发表于 2023-12-18 09:05:59

xiaoyuxinke 发表于 2023-12-17 11:20
我这里有原版的用于STC12C5A60S2硬件SPI驱动ILI9488的程序,我需要用于STC32G12K128,但是修改一直编译通 ...

这不是报错的工程啊,这个我编译了下正常。

Snapdragon 发表于 2023-12-18 23:14:07

xiaoyuxinke 发表于 2023-12-18 13:39
这个是STC12C5A60S2的,在KEIL4下编译正常,也可以正常使用,关键是我想用STC32G12K128来搞这个,这个程 ...

我的意思就是你把你移植的STC32的代码发上来,看看能不能帮你改掉编译错误

lzl1okOK 发表于 2023-12-20 21:45:37

电子芯 发表于 2023-11-27 15:25
STC12的移植不过去,不知道是哪里的问题

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

LINFA 发表于 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;
      }
    }
}


hualuo1987 发表于 2024-1-4 14:19:37

mark下 下次回来看!

电子芯 发表于 2024-1-15 13:46:24

xiaoyuxinke 发表于 2024-1-7 20:18
不能移植啊,只是把原程序改成STC32G12K128头文件,编译软件用的C251
MAIN函数里加入了STC32G12K128的IO ...

我编译没错,但是不行

电子芯 发表于 2024-1-15 13:47:07

LINFA 发表于 2024-1-3 09:41
//========================================================================
// 描述: LCD写入一个 ...

测试OK?
页: 1 [2] 3 4
查看完整版本: 32G12K128 如何驱动(ILI9488驱动的)TFT屏 | 已有热心网友提供程序