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

📄 lcd_hx8312a.c

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