📄 lcd.c
字号:
SET_LCD_CMD_PARAMETER(0,LCD_CMD,((0x0044&0xFF00)<<2)|((0x0044&0xFF)<<1));
SET_LCD_CMD_PARAMETER(1,LCD_DATA,((x2&0xFF)<<10)|((x1&0xFF)<<1));
SET_LCD_CMD_PARAMETER(2,LCD_CMD,((0x0045&0xFF00)<<2)|((0x0045&0xFF)<<1));
SET_LCD_CMD_PARAMETER(3,LCD_DATA,((y2&0xFF)<<10)|((y1&0xFF)<<1));
SET_LCD_CMD_PARAMETER(4,LCD_CMD,((0x0021&0xFF00)<<2)|((0x0021&0xFF)<<1));
SET_LCD_CMD_PARAMETER(5,LCD_DATA,((y1&0xFF)<<10)|((x1&0xFF)<<1));
SET_LCD_CMD_PARAMETER(6,LCD_CMD,((0x0022&0xFF00)<<2)|((0x0022&0xFF)<<1));
LCD_SEND_DMA_CMD(7);
#endif
#else
LCD_CtrlWrite_HX8306A(0x0044);
LCD_DataWrite_HX8306A((((x2&0xFF)<<8)|(x1&0xFF)));
LCD_CtrlWrite_HX8306A(0x0045);
LCD_DataWrite_HX8306A((((y2&0xFF)<<8)|(y1&0xFF)));
LCD_CtrlWrite_HX8306A(0x0021);
LCD_DataWrite_HX8306A((((y1&0xFF)<<8)|(x1&0xFF)));
LCD_CtrlWrite_HX8306A(0x0022);
#endif
for(LCD_y=y1;LCD_y<=y2;LCD_y++)
{
for(LCD_x=x1;LCD_x<=x2;LCD_x++)
{
#if (defined(LCD_8BIT_MODE))
*((volatile unsigned char *) LCD_HX8306A_DATA_ADDR)=(kal_uint8)((data&0xFF00)>>8);
*((volatile unsigned char *) LCD_HX8306A_DATA_ADDR)=(kal_uint8)(data&0xFF);
#elif (defined(LCD_16BIT_MODE))
*((volatile unsigned short *) LCD_HX8306A_DATA_ADDR)=data;
#elif (defined(LCD_18BIT_MODE))
*((volatile unsigned int *) LCD_HX8306A_DATA_ADDR)=(r_color<<12)|(g_color<<6)|b_color;
// *((volatile unsigned int *) LCD_HX8306A_DATA_ADDR)=(kal_uint16) data;
#elif (defined(LCD_9BIT_MODE))
*((volatile unsigned short *) LCD_HX8306A_DATA_ADDR)=(r_color<<6)|(g_color>>3);
*((volatile unsigned short *) LCD_HX8306A_DATA_ADDR)=((g_color&0x07)<<6)|b_color;
#endif
}
}
}
void LCD_ClearAll_HX8306A(kal_uint16 data)
{
LCD_blockClear_HX8306A(0,0,LCD_WIDTH-1,LCD_HEIGHT-1,data);
}
void LCD_set_reg(kal_uint16 reg_index, kal_uint16 reg_data)
{
LCD_CtrlWrite_HX8306A(reg_index);
LCD_DataWrite_HX8306A(reg_data);
}
void LCD_Init_HX8306A(kal_uint32 bkground, void **buf_addr)
{
volatile kal_uint32 i;
kal_uint16 background = (kal_uint16)bkground;
kal_uint16 read_data;
CLEAR_LCD_CTRL_RESET_PIN;
LCD_Delay(0x1000);
SET_LCD_CTRL_RESET_PIN;
LCD_Delay(0x1000);
LCD_set_reg(0x0000,0x0001);
LCD_Delay(0x200); /* delay 10ms */
LCD_set_reg(0x0001,0x011B);
LCD_set_reg(0x0002,0x0700);
LCD_set_reg(0x0003,0x1030);
// LCD_set_reg(0x0003,0x1210);
LCD_set_reg(0x0004,0x0000);
LCD_set_reg(0x0005,0x0000);
// LCD_set_reg(0x0007,0x0003);
LCD_set_reg(0x0007,0x0007);
LCD_set_reg(0x0008,0x0202);
LCD_set_reg(0x0009,0x0000);
LCD_set_reg(0x000B,0x0008);
LCD_set_reg(0x000C,0x0003);
LCD_set_reg(0x0040,0x0000);
LCD_set_reg(0x0041,0x00EF);
LCD_set_reg(0x0042,0xDB00);
LCD_set_reg(0x0043,0xDB00);
LCD_set_reg(0x0044,0xAF00);
LCD_set_reg(0x0045,0xDB00);
LCD_set_reg(0x0010,0x0000);
LCD_set_reg(0x0011,0x0000);
LCD_set_reg(0x0012,0x0000);
LCD_set_reg(0x0013,0x0000);
LCD_set_reg(0x0011,0x0000);
LCD_set_reg(0x0013,0x1517);
LCD_set_reg(0x0012,0x0008);
LCD_set_reg(0x0010,0x0040);
LCD_set_reg(0x0011,0x0000);
LCD_set_reg(0x0010,0x0054);
LCD_set_reg(0x0012,0x0012);
LCD_Delay(0x800);
LCD_set_reg(0x0010,0x4040);
LCD_Delay(0x800);
LCD_set_reg(0x0013,0x300E);
LCD_Delay(0x800);
LCD_set_reg(0x0010,0x2140);
LCD_Delay(0x800);
LCD_set_reg(0x0030,0x0000);
LCD_set_reg(0x0031,0x0207);
LCD_set_reg(0x0032,0x0000);
LCD_set_reg(0x0033,0x0401);
LCD_set_reg(0x0034,0x0707);
LCD_set_reg(0x0035,0x0005);
LCD_set_reg(0x0036,0x0707);
LCD_set_reg(0x0037,0x0000);
LCD_set_reg(0x0038,0x0000);
LCD_set_reg(0x0039,0x0000);
LCD_set_reg(0x0007,0x0005);
LCD_Delay(0x800);
LCD_set_reg(0x0007,0x0025);
LCD_set_reg(0x0007,0x0027);
LCD_Delay(0x800);
LCD_set_reg(0x0007,0x0037);
LCD_Delay(0x800);
LCD_ClearAll_HX8306A(0xFFFF);
lcd_power_ctrl_shadow1=0x2140;
lcd_power_ctrl_shadow3=0x0012;
lcd_power_ctrl_shadow4=0x300E;
LCD_Delay(0x80000);
/* turn on backlight */
// *((volatile unsigned short *) 0x80120150) &= 0xF3FF;
// *((volatile unsigned short *) 0x80120000) |= 0x20;
// *((volatile unsigned short *) 0x801200C0) |= 0x20;
}
void LCD_PWRON_HX8306A(kal_bool on)
{
}
void LCD_SetContrast_HX8306A(kal_uint8 level)
{
}
void LCD_ON_HX8306A(kal_bool on)
{
}
void LCD_BlockWrite_HX8306A(kal_uint16 startx,kal_uint16 starty,kal_uint16 endx,kal_uint16 endy)
{
kal_uint16 roi_width;
kal_uint16 x,y;
while (LCD_IS_RUNNING){};
// ASSERT(lcd_assert_fail==KAL_FALSE);
lcd_assert_fail = KAL_TRUE;
#ifdef LCD_CMD_DMA_MODE
#if (defined(LCD_8BIT_MODE))
#elif (defined(LCD_9BIT_MODE))
#elif (defined(LCD_16BIT_MODE))
#elif (defined(LCD_18BIT_MODE))
SET_LCD_CMD_PARAMETER(0,LCD_CMD,((0x0044&0xFF00)<<2)|((0x0044&0xFF)<<1));
SET_LCD_CMD_PARAMETER(1,LCD_DATA,((endx&0xFF)<<10)|((startx&0xFF)<<1));
SET_LCD_CMD_PARAMETER(2,LCD_CMD,((0x0045&0xFF00)<<2)|((0x0045&0xFF)<<1));
SET_LCD_CMD_PARAMETER(3,LCD_DATA,((endy&0xFF)<<10)|((starty&0xFF)<<1));
SET_LCD_CMD_PARAMETER(4,LCD_CMD,((0x0021&0xFF00)<<2)|((0x0021&0xFF)<<1));
SET_LCD_CMD_PARAMETER(5,LCD_DATA,((starty&0xFF)<<10)|((startx&0xFF)<<1));
SET_LCD_CMD_PARAMETER(6,LCD_CMD,((0x0022&0xFF00)<<2)|((0x0022&0xFF)<<1));
#endif
ENABLE_LCD_TRANSFER_COMPLETE_INT;
ENABLE_LCD_ROI_CTRL_CMD_FIRST;
SET_LCD_ROI_CTRL_NUMBER_OF_CMD(7);
START_LCD_TRANSFER;
#else
LCD_CtrlWrite_HX8306A(0x0044);
LCD_DataWrite_HX8306A((((endx&0xFF)<<8)|(startx&0xFF)));
LCD_CtrlWrite_HX8306A(0x0045);
LCD_DataWrite_HX8306A((((endy&0xFF)<<8)|(starty&0xFF)));
LCD_CtrlWrite_HX8306A(0x0021);
LCD_DataWrite_HX8306A((((starty&0xFF)<<8)|(startx&0xFF)));
LCD_CtrlWrite_HX8306A(0x0022);
DISABLE_LCD_TRANSFER_COMPLETE_INT;
DISABLE_LCD_ROI_CTRL_CMD_FIRST;
START_LCD_TRANSFER;
#endif /* MT6218B, MT6219 */
lcd_assert_fail = KAL_FALSE;
}
void LCD_Size_HX8306A(kal_uint16 *out_LCD_width,kal_uint16 *out_LCD_height)
{
*out_LCD_width = LCD_WIDTH;
*out_LCD_height = LCD_HEIGHT;
}
/*Engineering mode*/
kal_uint8 LCD_GetParm_HX8306A(lcd_func_type type)
{
switch(type)
{
case lcd_Bais_func:
return 1;
case lcd_Contrast_func:
return 1;
case lcd_LineRate_func:
return 4;
case lcd_Temperature_Compensation_func:
return 4;
default:
ASSERT(0);
return 100;
}
}
void LCD_SetBias_HX8306A(kal_uint8 *bias)
{
}
void LCD_Contrast_HX8306A(kal_uint8 *contrast)
{
}
void LCD_LineRate_HX8306A(kal_uint8 *linerate)
{
}
void LCD_Temp_Compensate_HX8306A(kal_uint8 *compensate)
{
}
/*===================The above is LCD dependent==========*/
#if ( (defined(MT6205B)) || (defined(MT6218)) )
void LCD_memcpy(void *dst /*s1*/, const void *src /*s2*/, kal_uint16 size)
{
#ifdef LCD_DMAENABLE
kal_uint32 srcaddr=(kal_uint32)src;
kal_uint32 dstaddr=(kal_uint32)dst;
kal_uint16 size_MSB = (kal_uint16)(size >> 9);
kal_uint16 size_LSB = (kal_uint16)(size & 0x01ff);
ASSERT(lcd_assert_fail==KAL_FALSE);
lcd_assert_fail = KAL_TRUE;
ASSERT(DRV_Reg(LCD_REFR)==0x00);
if(size_MSB)
{
DRV_WriteReg(LCD_MSBSRC,(kal_uint16)(srcaddr >> 16));
DRV_WriteReg(LCD_LSBSRC,(kal_uint16)srcaddr);
DRV_WriteReg(LCD_REFR,0x0000);
DRV_WriteReg(LCD_MSBDST,(kal_uint16)(dstaddr >> 16));
DRV_WriteReg(LCD_LSBDST,(kal_uint16)(dstaddr));
DRV_WriteReg(LCD_CADDRSET,512);
DRV_WriteReg(LCD_PADDRSET,size_MSB);
DRV_WriteReg(LCD_CHOP,0);
DRV_WriteReg(LCD_PCON,LCD_PCON_DINC);
DRV_WriteReg(LCD_START,LCD_START_BIT);
while(DRV_Reg(LCD_GSTA)&LCD_GSTA_PRUN);
DRV_WriteReg(LCD_START,LCD_STOP_BIT);
}
if (size_LSB)
{
srcaddr = (srcaddr + size - size_LSB);
dstaddr = (dstaddr + size - size_LSB);
DRV_WriteReg(LCD_MSBSRC,(kal_uint16)(srcaddr >> 16));
DRV_WriteReg(LCD_LSBSRC,(kal_uint16)srcaddr);
DRV_WriteReg(LCD_REFR,0x0000);
DRV_WriteReg(LCD_MSBDST,(kal_uint16)(dstaddr >> 16));
DRV_WriteReg(LCD_LSBDST,(kal_uint16)(dstaddr));
DRV_WriteReg(LCD_CADDRSET,size_LSB);
DRV_WriteReg(LCD_PADDRSET,1);
DRV_WriteReg(LCD_CHOP,0);
DRV_WriteReg(LCD_PCON,LCD_PCON_DINC);
DRV_WriteReg(LCD_START,LCD_START_BIT);
while(DRV_Reg(LCD_GSTA)&LCD_GSTA_PRUN);
DRV_WriteReg(LCD_START,LCD_STOP_BIT);
}
lcd_assert_fail = KAL_FALSE;
#else /*!LCD_DMAENABLE*/
kal_mem_cpy(dst,src,size);
#endif /*LCD_DMAENABLE*/
}
#else /*!(MT6205B,MT6218)*/
void LCD_memcpy(void *dst /*s1*/, const void *src /*s2*/, kal_uint16 size)
{
kal_mem_cpy(dst,src,size);
}
#endif /*(MT6205B,MT6218)*/
LCD_Funcs LCD_func_HX8306A = {
LCD_Init_HX8306A,
LCD_PWRON_HX8306A,
LCD_SetContrast_HX8306A,
LCD_ON_HX8306A,
LCD_BlockWrite_HX8306A,
LCD_Size_HX8306A,
LCD_EnterSleep_HX8306A,
LCD_ExitSleep_HX8306A,
LCD_Partial_On_HX8306A,
LCD_Partial_Off_HX8306A,
LCD_Partial_line_HX8306A,
/*Engineering mode*/
LCD_GetParm_HX8306A,
LCD_SetBias_HX8306A,
LCD_Contrast_HX8306A,
LCD_LineRate_HX8306A,
LCD_Temp_Compensate_HX8306A
};
void LCD_FunConfig(void)
{
MainLCD = &LCD_func_HX8306A;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -