📄 lcd_hx8312a.c
字号:
/**
* @belief: transmit HX8312A LCD specific functions to lcd.c
* @date 2006-07-05
* @version 1.0
* @ref Please refer to HX8312-A.pdf.
* @NOTE
* 18 bit LCD
*/
#ifdef OS_ANYKA
#include "lcd_hx8312a.h"
#include "akdefine.h"
#include "Eng_Graph.h"
#define MODE_65K_16BIT 0x08F80000
#define MODE_65K_8BIT 0x0dDA0000
#define MODE_4K_8BIT 0x05DA0000
//experienced data for adjusting contrast
static const T_U8 LCD_CONTRAST_REG[21] = {
0x33, 0x37, 0x3B, 0x3F, 0x43,
0x47, 0x4B, 0x4F, 0x53, 0x57,
0x5C, 0x65, 0x6E, 0x77, 0x80,
0x89, 0x92, 0x9B, 0xA4, 0xAD,
0xB4
};
static const T_U16 init_cmdset[][2] = {
{0x0010, 0x0001}, {0x00A0, 0x0000}, {0x0001, 0x0003}, {DELAY_FLAG, 10},
{0x0000, 0x0003}, {0x0005, 0x002B}, {0x0018, 0x0028}, {0x0005, 0x001A}, //2b00
{0x0008, 0x0025}, {0x0054, 0x0019}, {0x0073, 0x001C}, {0x0074, 0x0024}, //1900
{0x0001, 0x001e}, {0x00C0, 0x0018}, {0x00C1, 0x0018}, {DELAY_FLAG, 10},
{0x00E1, 0x0018}, {0x00F1, 0x0018}, {DELAY_FLAG, 60}, {0x00F5, 0x0018},
{DELAY_FLAG, 60}, {0x0009, 0x001b}, {DELAY_FLAG, 10}, {0x0019, 0x001f}, //1f11
{0x000e, 0x0020}, {0x0081, 0x001e}, {DELAY_FLAG, 10}, {0x0000, 0x009D}, //2010
{0x0000, 0x00C0}, {0x0001, 0x00C1}, {0x0000, 0x000E}, {0x0000, 0x000F},
{0x0000, 0x0010}, {0x0000, 0x0011}, {0x0000, 0x0012}, {0x0000, 0x0013},
{0x0000, 0x0014}, {0x0000, 0x0015}, {0x0000, 0x0016}, {0x0000, 0x0017},
{0x0001, 0x0034}, {0x0000, 0x0035}, {0x0000, 0x004B}, {0x0000, 0x004C},
{0x0000, 0x004E}, {0x0000, 0x004F}, {0x0000, 0x0050}, {0x0000, 0x003C},
{0x0000, 0x003D}, {0x0001, 0x003E}, {0x003F, 0x003F}, {0x0002, 0x0040},
{0x0002, 0x0041}, {0x0000, 0x0042}, {0x0000, 0x0043}, {0x0000, 0x0044},
{0x0000, 0x0045}, {0x00EF, 0x0046}, {0x0000, 0x0047}, {0x0000, 0x0048},
{0x0001, 0x0049}, {0x003F, 0x004A}, {0x0008, 0x001d}, {0x0000, 0x0086},
{0x0030, 0x0087}, {0x0002, 0x0088}, {0x0005, 0x0089}, {0x0001, 0x008D},
{0x0025, 0x008B}, {0x0001, 0x0033}, {0x0001, 0x0037}, {0x0000, 0x0076},
{0x0000, 0x008F}, {0x0044, 0x0090}, {0x0034, 0x0091}, {0x0002, 0x0092},
{0x0034, 0x0093}, {0x0033, 0x0094}, {0x0077, 0x0095}, {0x0020, 0x0096},
{0x0000, 0x0097}, {0x0005, 0x0098}, {0x0005, 0x0099}, {0x0000, 0x009A},
{0x0001, 0x003B}, {DELAY_FLAG, 40}, {0x0020, 0x0000},
/* {DELAY_FLAG, 50}, {0x0001, 0x0003}, {DELAY_FLAG, 1}, {0x0011, 0x0001}, {0x0001, 0x0003},
{0x0028, 0x0000}, {0x0001, 0x0022}, {0x0020, 0x0000}, {DELAY_FLAG, 10}, {0x0012, 0x0028},
{0x0000, 0x001A}, {0x0000, 0x0019}, {0x0010, 0x0021}, {0x0005, 0x0018}, {0x0001, 0x001E},
{0x0047, 0x0018}, {0x0067, 0x0018}, {0x00F7, 0x0018}, {0x0000, 0x0021}, {0x0004, 0x0019},
{0x0065, 0x001F}, {0x0063, 0x0020}, {0x0083, 0x001E}, {0x0010, 0x0001}, {0x0000, 0x0002},
{0x0000, 0x0005}, {0x0000, 0x000D}, {0x0000, 0x000E}, {0x0000, 0x000F}, {0x0000, 0x0010},
{0x0000, 0x0011}, {0x0000, 0x0012}, {0x0000, 0x0013}, {0x0000, 0x0014}, {0x0000, 0x0015},
{0x0000, 0x0016}, {0x0000, 0x0017}, {0x000B, 0x001B}, {0x000E, 0x001D}, {0x0001, 0x0033},
{0x0001, 0x0037}, {0x0000, 0x003C}, {0x0000, 0x003D}, {0x0001, 0x003E}, {0x003F, 0x003F},
{0x0008, 0x0040}, {0x0008, 0x0041}, {0x0000, 0x0045}, {0x00EF, 0x0046}, {0x0000, 0x0047},
{0x0000, 0x0048}, {0x0001, 0x0049}, {0x003F, 0x004A}, {0x0000, 0x0076}, {0x0000, 0x0086},
{0x0038, 0x0087}, {0x0002, 0x0088}, {0x0004, 0x0089}, {0x003C, 0x008B}, {0x0001, 0x008D},
{0x0024, 0x008F}, {0x0000, 0x0090}, {0x0077, 0x0091}, {0x0076, 0x0092}, {0x0075, 0x0093},
{0x0077, 0x0094}, {0x0029, 0x0095}, {0x000A, 0x0096}, {0x0004, 0x0097}, {0x0064, 0x0098},
{0x0077, 0x0099}, {0x0000, 0x009A}, {0x0002, 0x009B}, {0x0010, 0x009C}, {0x0000, 0x009D},
{0x0001, 0x003B},*/ {END_FLAG, END_FLAG}
};
static const T_U16 turnoff_cmdset[][2] = {
// {0x0080, 0x0000}, {DELAY_FLAG, 20}, {0x0088, 0x0000}, {DELAY_FLAG, 30}, {0x0000, 0x001B},
// {DELAY_FLAG, 1}, {0x0000, 0x001E}, {DELAY_FLAG, 1}, {0x0000, 0x0028}, {DELAY_FLAG, 1},
// {0x0000, 0x0018}, {DELAY_FLAG, 1}, {0x0011, 0x0001},
// {END_FLAG, END_FLAG}
{0x0088, 0x0000}, {DELAY_FLAG, 20},
// {0x0088, 0x0000}, {0x0011, 0x0001}, {0x0000, 0x001B}, {0x0000, 0x0018}, {0x0000, 0x003B},
{END_FLAG, END_FLAG}
};
static const T_U16 turnon_cmdset[][2] = {
// {DELAY_FLAG, 50}, {0x0010, 0x0001}, {0x0028, 0x0000},
// {0x0001, 0x0022}, {0x0020, 0x0000}, {DELAY_FLAG, 10}, {0x0012, 0x0028}, {0x000B, 0x001B},
// {0x0005, 0x0018}, {0x0001, 0x001E},
// {0x0047, 0x0018}, {0x0067, 0x0018}, {0x00F7, 0x0018},
// {0x0083, 0x001E}, {END_FLAG, END_FLAG}
// {DELAY_FLAG, 50}, {0x0001, 0x0003}, {DELAY_FLAG, 1}, {0x0011, 0x0001}, {0x0001, 0x0003},
// {0x0028, 0x0000}, {0x0001, 0x0022}, {0x0020, 0x0000}, {DELAY_FLAG, 10}, {0x0012, 0x0028},
// {0x0000, 0x001A}, {0x0000, 0x0019}, {0x0010, 0x0021}, {0x0005, 0x0018}, {0x0001, 0x001E},
// {0x0047, 0x0018}, {0x0067, 0x0018}, {0x00F7, 0x0018}, {0x0000, 0x0021}, {0x0004, 0x0019},
// {0x0065, 0x001F}, {0x0063, 0x0020}, {0x0083, 0x001E}, {0x0010, 0x0001}, {0x000B, 0x001B},
{0x0020, 0x0000}, //{0x0010, 0x0001}, {0x000B, 0x001B}, {0x00F7, 0x0018}, {0x0001, 0x003B},
{END_FLAG, END_FLAG}
};
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
{
regValue = MPU_RS_SIG_CMD | (T_U32)((pCmdSet[i*2+1] << 8) | pCmdSet[i*2]);
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,regValue);
}
}
}
T_VOID set_disp_address_hx8312a(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_270_DEGREE)
{
//x1<->y1,x2<->y2
tmp = x1;
x1 = y1;
y1 = tmp;
tmp = x2;
x2 = y2;
y2 = tmp;
}
else if (current_lcd_degree == LCD_0_DEGREE)
{
//x1<->y2
tmp = y1;
y1 = MASTER_LCD_HEIGHT - 1 - y2;
y2 = MASTER_LCD_HEIGHT - 1 - tmp;
}
else if (current_lcd_degree == LCD_90_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 | (T_U32)((0x0042 << 8 | x2)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x0043 << 8 | ((y1 & 0x00000100) >> 8))));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x0044 << 8 | (y1 & 0x000000FF))));
break;
case LCD_180_DEGREE:
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x0042 << 8 | x2)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x0043 << 8 | ((y2 & 0x00000100) >> 8))));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x0044 << 8 | (y2 & 0x000000FF))));
break;
case LCD_270_DEGREE:
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x0042 << 8 | x2)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x0043 << 8 | ((y1 & 0x00000100) >> 8))));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x0044 << 8 | (y1 & 0x000000FF))));
break;
case LCD_0_DEGREE:
default:
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x0042 << 8 | x1)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x0043 << 8 | ((y1 & 0x00000100) >> 8))));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x0044 << 8 | (y1 & 0x000000FF))));
break;
}
//set the x1,y1,x2,y2
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x0045 << 8 | x1)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x0046 << 8 | x2)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x0047 << 8 | ((y1 & 0x00000100) >> 8))));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x0048 << 8 | (y1 & 0x000000FF))));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x0049 << 8 | ((y2 & 0x00000100) >> 8))));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x004A << 8 | (y2 & 0x000000FF))));
}
/**
* @brief Initialize the hx8312a 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_hx8312a_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_hx8312a_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_hx8312a_turn_off(T_eLCD lcd)
{
send_cmd((const T_U16 *)turnoff_cmdset);
}
/**
* @brief Set lcd_hx8312a contrast value
* @author YiRuoxiang
* @date 2006-01-04
* @param T_U8 contrast: contrast value
* @return T_VOID
* @retval
*/
T_VOID lcd_hx8312a_set_contrast(T_U8 contrast)
{
T_U16 value;
value = ((T_U32)LCD_CONTRAST_REG[contrast]) & 0x000000ff;
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x001F << 8 | value)));
}
/**
* @brief rotate the picture 90 degree
* @author lgj
* @date 2005-08-18
* @param T_VOID
* @retval T_VOID
*/
T_VOID lcd_hx8312a_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 | (T_U32)((0x0001 << 8 | 0x00C0)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x0005 << 8 | 0x0010)));
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 | (T_U32)((0x0001 << 8 | 0x0080)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x0005 << 8 | 0x0014)));
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 | (T_U32)((0x0001 << 8 | 0x0000)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x0005 << 8 | 0x0010)));
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 | (T_U32)((0x0001 << 8 | 0x0040)));
HAL_WRITE_UINT32(LCD_REG_CONFIG_REG,MPU_RS_SIG_CMD | (T_U32)((0x0005 << 8 | 0x0014)));
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 + -