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