⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd_ili9320.c

📁 CPU接口的LCD控制代码
💻 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 + -