📄 lcd_ili9320.c
字号:
/**
* @belief: transmit KGM281E0 LCD specific functions to lcd.c
* @author Guanghua Zhang
* @date 2007-01-03
* @version 1.0
* @ref Please refer to ILI9320DS_V01.41.pdf.
* @NOTE
* 18 bit LCD
*/
#ifdef OS_ANYKA
#include "lcd_ili9320.h"
#include "akdefine.h"
#include "Eng_Graph.h"
#define MODE_65K_16BIT 0x08840000
#define MODE_65K_8BIT 0x0dDA0000
#define MODE_4K_8BIT 0x05DA0000
//experienced data for adjusting contrast
static const T_U8 LCD_CONTRAST_REG[11] = {
0x05, 0x06, 0x07, 0x08, 0x09,
0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
0x0F
};
static const T_U16 init_cmdset[][2] = {
{0x0000, 0x0001},
{DELAY_FLAG, 50},
{0x0001, 0x0100}, {0x0002, 0x0400}, {0x0003, 0x1038}, {0x0004, 0x0000},
{0x0008, 0x0202}, {0x0009, 0x0000}, {0x000A, 0x0000}, {0x000C, 0x0000}, {0x000D, 0x0000},
{0x000F, 0x0000}, {0x0010, 0x0000}, {0x0011, 0x0007}, {0x0012, 0x0000}, {0x0013, 0x0000},
{DELAY_FLAG, 50},
{0x0010, 0x17B0}, {0x0011, 0x0001},
{DELAY_FLAG, 50},
{0x0012, 0x013C},
{DELAY_FLAG, 50},
{0x0013, 0x1800}, {0x0029, 0x00C},
{DELAY_FLAG, 50},
{0x0020, 0x0000}, {0x0021, 0x0000}, {0x002B, 0x0020}, {0x0030, 0x0000}, {0x0031, 0x0306},
{0x0032, 0x0200}, {0x0035, 0x0007}, {0x0036, 0x0404}, {0x0037, 0x0606}, {0x0038, 0x0105},
{0x0039, 0x0707}, {0x003C, 0x0600}, {0x003D, 0x0807}, {0x0050, 0x0000}, {0x0051, 0x00EF},
{0x0052, 0x0000}, {0x0053, 0x013F}, {0x0060, 0x2700}, {0x0061, 0x0001}, {0x006A, 0x0000},
{0x0080, 0x0000}, {0x0081, 0x0000}, {0x0082, 0x0000}, {0x0083, 0x0000}, {0x0084, 0x0000},
{0x0085, 0x0000}, {0x0090, 0x0013}, {0x0092, 0x0000}, {0x0093, 0x0003}, {0x0095, 0x0110},
{0x0097, 0x0000}, {0x0098, 0x0000}, {0x0007, 0x0001},
{DELAY_FLAG, 50},
{0x0007, 0x0021}, {0x0007, 0x0023},
{DELAY_FLAG, 50},
{0x0007, 0x0173},
{END_FLAG, END_FLAG}
};
static const T_U16 turnoff_cmdset[][2] = {
{0x0010, 0x0012},
{END_FLAG, END_FLAG}
};
static const T_U16 turnon_cmdset[][2] = {
{0x0010, 0x17b0},
{END_FLAG, END_FLAG}
};
T_U32 convert_to_ili9320(T_U32 u18)
{
T_U32 ret;
ret = u18;
ret <<= 2;
ret &= 0x3FC00;
u18 <<= 1;
u18 &= 0x1FE;
ret |= u18;
return ret;
}
static T_VOID send_cmd(const T_U16 *pCmdSet)
{
int i = 0;
T_U32 regValue;
for(i=0; AK_TRUE; i++)
{
if ((pCmdSet[i*2] == END_FLAG) && (pCmdSet[i*2+1] == END_FLAG))
{
break;
}
else if (pCmdSet[i*2] == DELAY_FLAG)
{
lcd_delay1ms(pCmdSet[i*2+1]);
}
else
{
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_CMD | convert_16_to_18bit(convert_to_ili9320(pCmdSet[i*2])));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_DATA | convert_16_to_18bit(convert_to_ili9320(pCmdSet[i*2+1])));
}
}
}
T_VOID set_disp_address_ili9320(T_U32 x1, T_U32 y1, T_U32 x2, T_U32 y2)
{
T_U32 tmp,tmp1;
T_eLCD_DEGREE current_lcd_degree;
current_lcd_degree = mlcd_degree();
if (current_lcd_degree == LCD_90_DEGREE)
{
//x1<->y1,x2<->y2
tmp = x1;
x1 = y1;
y1 = tmp;
tmp = x2;
x2 = y2;
y2 = tmp;
}
else if (current_lcd_degree == LCD_180_DEGREE)
{
//x1<->y2
tmp = y1;
y1 = MASTER_LCD_HEIGHT - 1 - y2;
y2 = MASTER_LCD_HEIGHT - 1 - tmp;
}
else if (current_lcd_degree == LCD_270_DEGREE)
{
//x1<->y2,x2<->y1
tmp = x1;
x1 = MASTER_LCD_WIDTH - 1 - y2;
tmp1 = y1;
y1 = tmp;
tmp = x2;
x2 = MASTER_LCD_WIDTH - 1 - tmp1;
y2 = tmp;
}
//set the start address
switch(current_lcd_degree)
{
case LCD_90_DEGREE:
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_CMD | convert_16_to_18bit(convert_to_ili9320(0x20)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_DATA | convert_16_to_18bit(convert_to_ili9320(x1)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_CMD | convert_16_to_18bit(convert_to_ili9320(0x21)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_DATA | convert_16_to_18bit(convert_to_ili9320(y2)));
break;
case LCD_180_DEGREE:
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_CMD | convert_16_to_18bit(convert_to_ili9320(0x20)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_DATA | convert_16_to_18bit(convert_to_ili9320(x2)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_CMD | convert_16_to_18bit(convert_to_ili9320(0x21)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_DATA | convert_16_to_18bit(convert_to_ili9320(y2)));
break;
case LCD_270_DEGREE:
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_CMD | convert_16_to_18bit(convert_to_ili9320(0x20)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_DATA | convert_16_to_18bit(convert_to_ili9320(x2)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_CMD | convert_16_to_18bit(convert_to_ili9320(0x21)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_DATA | convert_16_to_18bit(convert_to_ili9320(y1)));
break;
case LCD_0_DEGREE:
default:
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_CMD | convert_16_to_18bit(convert_to_ili9320(0x20)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_DATA | convert_16_to_18bit(convert_to_ili9320(x1)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_CMD | convert_16_to_18bit(convert_to_ili9320(0x21)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_DATA | convert_16_to_18bit(convert_to_ili9320(y1)));
break;
}
//set the x1,y1,x2,y2
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_CMD | convert_16_to_18bit(convert_to_ili9320(0x50)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_DATA | convert_16_to_18bit(convert_to_ili9320(x1)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_CMD | convert_16_to_18bit(convert_to_ili9320(0x51)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_DATA | convert_16_to_18bit(convert_to_ili9320(x2)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_CMD | convert_16_to_18bit(convert_to_ili9320(0x52)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_DATA | convert_16_to_18bit(convert_to_ili9320(y1)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_CMD | convert_16_to_18bit(convert_to_ili9320(0x53)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_DATA | convert_16_to_18bit(convert_to_ili9320(y2)));
}
/**
* @brief Initialize the ili9320 LCD
* Initialize master LCD and slave LCD and then turn on them
* @author YiRuoxiang
* @date 2005-12-30
* @param T_VOID
* @return T_VOID
*/
T_VOID lcd_ili9320_initial(T_VOID)
{
/*--select MPU interface--*/
HAL_WRITE_UINT32(LCD_CMD1_REG,LCD_MPU_INTERFACE | MODE_65K_16BIT);
// send_cmd((const T_U16 *)turnon_cmdset);
send_cmd((const T_U16 *)init_cmdset);
}
/**
* @brief Turn on the LCD
* @author qxj
* @date 2005-07-18
* @param T_eLCD lcd: selected LCD, must be LCD_M or LCD_S
* @return T_VOID
*/
T_VOID lcd_ili9320_turn_on(T_eLCD lcd)
{
send_cmd((const T_U16 *)turnon_cmdset);
}
/**
* @brief Turn off the LCD
* @author qxj
* @date 2004-09-14
* @param T_eLCD lcd: selected LCD, must be LCD_M or LCD_S
* @return T_VOID
*/
T_VOID lcd_ili9320_turn_off(T_eLCD lcd)
{
send_cmd((const T_U16 *)turnoff_cmdset);
}
/**
* @brief Set lcd_ili9320 contrast value
* @author YiRuoxiang
* @date 2006-01-04
* @param T_U8 contrast: contrast value
* @return T_VOID
* @retval
*/
T_VOID lcd_ili9320_set_contrast(T_U8 contrast)
{
/* T_U16 value;
if (contrast > 10)
contrast = 10;
value = ((T_U32)LCD_CONTRAST_REG[contrast]) << 8;
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_CMD | convert_16_to_18bit(convert_to_ili9320(0x0013)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_DATA | convert_16_to_18bit(convert_to_ili9320(value)));
*/}
/**
* @brief rotate the picture 90 degree
* @author lgj
* @date 2005-08-18
* @param T_VOID
* @retval T_VOID
*/
T_VOID lcd_ili9320_rotate(T_VOID)
{
T_eLCD_DEGREE current_lcd_degree;
current_lcd_degree = mlcd_degree();
switch (current_lcd_degree)
{
case LCD_0_DEGREE:
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_CMD | convert_16_to_18bit(convert_to_ili9320(0x0003)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_DATA | convert_16_to_18bit(convert_to_ili9320(0x1030)));
g_Graph.LCDWIDTH[LCD_M] = MASTER_LCD_WIDTH;
g_Graph.LCDHEIGHT[LCD_M] = MASTER_LCD_HEIGHT;
break;
case LCD_90_DEGREE:
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_CMD | convert_16_to_18bit(convert_to_ili9320(0x0003)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_DATA | convert_16_to_18bit(convert_to_ili9320(0x1018)));
g_Graph.LCDWIDTH[LCD_M] = MASTER_LCD_HEIGHT;
g_Graph.LCDHEIGHT[LCD_M] = MASTER_LCD_WIDTH;
break;
case LCD_180_DEGREE:
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_CMD | convert_16_to_18bit(convert_to_ili9320(0x0003)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_DATA | convert_16_to_18bit(convert_to_ili9320(0x1000)));
g_Graph.LCDWIDTH[LCD_M] = MASTER_LCD_WIDTH;
g_Graph.LCDHEIGHT[LCD_M] = MASTER_LCD_HEIGHT;
break;
case LCD_270_DEGREE:
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_CMD | convert_16_to_18bit(convert_to_ili9320(0x0003)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG, MPU_RS_SIG_DATA | convert_16_to_18bit(convert_to_ili9320(0x1028)));
g_Graph.LCDWIDTH[LCD_M] = MASTER_LCD_HEIGHT;
g_Graph.LCDHEIGHT[LCD_M] = MASTER_LCD_WIDTH;
break;
default:
break;
}
}
#endif
/* end of file */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -