| 
 | 
 
 
发表于 2024-1-3 09:41:09
|
显示全部楼层
 
 
 
 
 
 
//======================================================================== 
// 描述: 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; 
        } 
    } 
} 
 
 
 |   
 
 
 
 |