?? lcd_2102b.c
字號(hào):
/**
* @belief: transmit IS2102B LCD specific functions to lcd.c
* Copyright (C) 2004 Anyka (GuangZhou) Software Technology Co., Ltd.
* @author YiRuoxiang
* @date 2006-03-21
* @version 1.0
* @ref Please refer to IS2102B_v1.2.pdf.
* @NOTE
* 18 bit LCD
*/
#define OS_AKRTOS
#include "lcd_2102b.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] = {
{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)
{
delay1ms(pCmdSet[i*2+1]);
}
else
{
regValue = MAIN_LCD_MPU_CMD | convert_16_to_18bit((pCmdSet[i*2+1] << 8) | pCmdSet[i*2]);
HAL_WRITE_UINT32(LCD_MINFO_REG,regValue);
}
}
}
T_VOID set_disp_address_is2102b(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();
//AK_DEBUG_OUTPUT("refresh:x1=%d,y1=%d,x2=%d,y2=%d",x1,y1,x2,y2);
//adjust the x and y
if (current_lcd_degree == LCD_90_DEGREE ||
current_lcd_degree == LCD_270_DEGREE)
{
//x1<->y1,x2<->y2
tmp = x1;
x1 = y1;
y1 = tmp;
tmp = x2;
x2 = y2;
y2 = tmp;
}
//AK_DEBUG_OUTPUT("adjust:x1=%d,y1=%d,x2=%d,y2=%d",x1,y1,x2,y2);
//set the start address
switch(current_lcd_degree)
{
case LCD_90_DEGREE:
tmp = x1;
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0042 << 8 | tmp)));
tmp = MASTER_LCD_HEIGHT - 1 - y1;
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0043 << 8 | ((tmp & 0x00000100) >> 8))));
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0044 << 8 | (tmp & 0x000000FF))));
break;
case LCD_180_DEGREE:
tmp = MASTER_LCD_WIDTH - 1 - x1;
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0042 << 8 | tmp)));
tmp = MASTER_LCD_HEIGHT - 1 - y1;
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0043 << 8 | ((tmp & 0x00000100) >> 8))));
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0044 << 8 | (tmp & 0x000000FF))));
break;
case LCD_270_DEGREE:
tmp = MASTER_LCD_WIDTH - 1 - x1;
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0042 << 8 | tmp)));
tmp = y1;
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0043 << 8 | ((tmp & 0x00000100) >> 8))));
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0044 << 8 | (tmp & 0x000000FF))));
break;
case LCD_0_DEGREE:
default:
tmp = x1;
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0042 << 8 | tmp)));
tmp = y1;
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0043 << 8 | ((tmp & 0x00000100) >> 8))));
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0044 << 8 | (tmp & 0x000000FF))));
break;
}
//set the x1,y1,x2,y2
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0045 << 8 | x1)));
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0046 << 8 | x2)));
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0047 << 8 | ((y1 & 0x00000100) >> 8))));
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0048 << 8 | (y1 & 0x000000FF))));
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0049 << 8 | ((y2 & 0x00000100) >> 8))));
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x004A << 8 | (y2 & 0x000000FF))));
}
/**
* @brief Initialize the is2102b 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_is2102b_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_is2102b_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_is2102b_turn_off(T_eLCD lcd)
{
send_cmd((const T_U16 *)turnoff_cmdset);
}
/**
* @brief Set lcd_is2102b contrast value
* @author YiRuoxiang
* @date 2006-01-04
* @param T_U8 contrast: contrast value
* @return T_VOID
* @retval
*/
T_VOID lcd_is2102b_set_contrast(T_U8 contrast)
{
T_U16 value;
value = ((T_U32)LCD_CONTRAST_REG[contrast]) & 0x000000ff;
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x001F << 8 | value)));
}
/**
* @brief rotate the picture 90 degree
* @author lgj
* @date 2005-08-18
* @param T_VOID
* @retval T_VOID
*/
T_VOID lcd_is2102b_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_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0001 << 8 | 0x0000)));
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((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_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0001 << 8 | 0x0040)));
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((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_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0001 << 8 | 0x00C0)));
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((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_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0001 << 8 | 0x0080)));
HAL_WRITE_UINT32(LCD_MINFO_REG,MAIN_LCD_MPU_CMD | convert_16_to_18bit((0x0005 << 8 | 0x0014)));
g_Graph.LCDWIDTH[LCD_M] = MASTER_LCD_HEIGHT;
g_Graph.LCDHEIGHT[LCD_M] = MASTER_LCD_WIDTH;
break;
default:
break;
}
}
/* end of file */
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -