📄 lcd.c
字号:
/****************************************************************************
FUNCTION NAME : LCD_EntireDis
PURPOSE : This function is to set normal display or entire display
INPUT PARAMETERS : kal_bool. KAL_TRUE, entire display
KAL_FALSE, normal display
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_EntireDis_UC1602(kal_bool ON) //Validate
{
if (ON == KAL_TRUE)
{
LCD_CtrlWrite_UC1602(LCD_ENTIREDIS_ON_UC1602);
}
else
{
LCD_CtrlWrite_UC1602(LCD_ENTIREDIS_OFF_UC1602);
}
}
/****************************************************************************
FUNCTION NAME : LCD_blockClear
PURPOSE : This function is to
INPUT PARAMETERS : kal_uint8(x, y, width, height, data)
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_blockClear_UC1602(kal_uint8 x, kal_uint8 y, kal_uint8 width, kal_uint8 height,kal_uint8 data)
{
kal_uint8 page; /* store total pages */
kal_uint8 i, j; /* temp for loop counter flags */
page = height/8; /* which page */
LCD_iniDisplayLine_UC1602(0x00);
for(i=0;i<page;i++)
{
LCD_GotoXY_UC1602(x, i);
for(j = 0; j< width; j++)
{
LCD_DataWrite_UC1602(data);
}
}
}
/****************************************************************************
FUNCTION NAME : LCD_IndicatorON
PURPOSE : This function is to set Static Indicator ON.
INPUT PARAMETERS : void
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_IndicatorON_UC1602(void) //Fail
{
LCD_CtrlWrite_UC1602(LCD_CURSOR_SETON_UC1602);
LCD_CtrlWrite_UC1602(LCD_CURSOR_ALLON_UC1602);
}
/****************************************************************************
FUNCTION NAME : LCD_IndicatorOFF
PURPOSE : This function is to set Static Indicator OFF.
INPUT PARAMETERS : void
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_IndicatorOFF_UC1602(void) //Fail
{
LCD_CtrlWrite_UC1602(LCD_CURSOR_SETOFF_UC1602);
}
/****************************************************************************
FUNCTION NAME : LCD_Suspend
PURPOSE : This function is to Suspend LCD or Stop suspending LCD.
INPUT PARAMETERS : kal_uint8. KAL_TRUE, enter suspend mode
KAL_FALSE, leave suspend mode
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_Suspend_UC1602(kal_uint8 ON) //Validate
{
if (ON == KAL_TRUE)
{
LCD_IndicatorOFF_UC1602();
LCD_CtrlWrite_UC1602(LCD_DISPLAY_OFF_UC1602);
LCD_EntireDis_UC1602(KAL_TRUE);
}
else
{
LCD_IndicatorON_UC1602();
LCD_CtrlWrite_UC1602(LCD_DISPLAY_ON_UC1602);
LCD_EntireDis_UC1602(KAL_FALSE);
LCD_IndicatorOFF_UC1602();
}
}
/******************************/
/* Sub_LCD Interface */
/******************************/
/****************************************************************************
FUNCTION NAME : LCD_Init
PURPOSE : This function is to initialize Sub_LCD.
INPUT PARAMETERS : (kal_uint32, void)
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_Init_UC1602(kal_uint32 bkground, void **buf_addr) //Validate
{
kal_uint8 i;
kal_uint8 background = (kal_uint8)bkground;
if( buf_addr )
LCD_CtrlWrite_UC1602(LCD_RESET_UC1602); // 0xE2
for(i=0;i<100;i++);
LCD_CtrlWrite_UC1602(LCD_BIAS_SELECT_UC1602|0x02); // 0xA2 | 0x00 bias=0, 0x01 bias=1
LCD_CtrlWrite_UC1602(LCD_COM_REVERSE_UC1602); // 0xC8 COM63 △ COM0
LCD_CtrlWrite_UC1602(LCD_ADC_NORMAL_UC1602); // 0xA0 SEG0 △ SEG131
LCD_iniDisplayLine_UC1602(0x00);
//LCD_CtrlWrite_UC1602(LCD_SLineData_UC1602); // 0x40
LCD_CtrlWrite_UC1602(0x2F); // (Vc, Vr, Vf)=(1,1,1)
for(i=0;i<100;i++);
LCD_CtrlWrite_UC1602(0x24); // regulator resistor = 100
LCD_CtrlWrite_UC1602(LCD_BRIGHT_SET_UC1602); // 0x81
LCD_CtrlWrite_UC1602(0x2F);
LCD_CtrlWrite_UC1602(LCD_ENTIREDIS_OFF_UC1602); // 0xA4
LCD_CtrlWrite_UC1602(LCD_NORMDIS_UC1602); // 0xA6
LCD_CtrlWrite_UC1602(LCD_DISPLAY_ON_UC1602); // 0xAF
//LCD_CtrlWrite_UC1602(LCD_ENTIREDIS_ON_UC1602);
#ifndef DUAL_LCD
/* under construction !*/
#else /*DUAL_LCD*/
LCD_blockClear_UC1602(0+3, 0, (SUBLCD_WIDTH)+3, (SUBLCD_HEIGHT),background);
#endif /*DUAL_LCD*/
}
/****************************************************************************
FUNCTION NAME : LCD_PWRON
PURPOSE : This function is to turn on/off Sub_LCD power.
INPUT PARAMETERS : kal_bool
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_PWRON_UC1602(kal_bool on)
{
if (on == KAL_TRUE)
{
LCD_DRV_PWRON_UC1602();
}
else
{
LCD_DRV_PWROFF_UC1602();
}
}
/****************************************************************************
FUNCTION NAME : LCD_SetVoltLevel (LCD_SetContrast)
PURPOSE : This function is to set LCD brightness(contrast).
INPUT PARAMETERS : kal_uint8
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_SetVoltLevel_UC1602(kal_uint8 voltage)
{
if (voltage > 63)
voltage = 63;
LCD_CtrlWrite_UC1602(LCD_BRIGHT_SET_UC1602);
LCD_CtrlWrite_UC1602((voltage&0x3F) | 0x40);
}
/****************************************************************************
FUNCTION NAME : LCD_ON
PURPOSE : This function is to turn on/off Sub_LCD panel.
INPUT PARAMETERS : void
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_ON_UC1602(kal_bool on)
{
if(on == KAL_TRUE)
{
LCD_CtrlWrite_UC1602(LCD_DISPLAY_ON_UC1602);
}
else
{
LCD_CtrlWrite_UC1602(LCD_DISPLAY_OFF_UC1602);;
}
}
/****************************************************************************
FUNCTION NAME : LCD_BlockWrite
PURPOSE : This function is to write block on Sub_LCD.
INPUT PARAMETERS : kal_uint16(startx, starty, endx, endy)
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_BlockWrite_UC1602(kal_uint16 startx,kal_uint16 starty,kal_uint16 endx,kal_uint16 endy)
{
kal_uint16 x, line_pos;
kal_uint16 l_startx=startx, l_startline=(starty), l_endx=endx, l_endline=(endy);
kal_uint8 temp,bitmask;
kal_uint32 addr, frame_buff_ptr;
LCD_iniDisplayLine_UC1602(0x00);
addr=get_lcd_frame_buffer_address();
ASSERT((endy>=starty)&&(endx>=startx));
for(x=l_startx ;x<=l_endx; x++)
{
for(line_pos = (starty/8)*8; line_pos<=endy ; line_pos+=8)
{
frame_buff_ptr = addr+(line_pos/8)*SUBLCD_WIDTH+x;
temp = (*((kal_uint8 *)frame_buff_ptr));
LCD_GotoXY_UC1602(x+3, line_pos/8);
LCD_DataWrite_UC1602(temp);
}
}
}
/****************************************************************************
FUNCTION NAME : LCD_Size
PURPOSE : This function is used to retrieve the size of LCD
INPUT PARAMETERS : (kal_uint16, kal_uint16) out_LCD_width : Pointer to LCD width
out_LCD_height: Pointer to LCD height
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_Size_UC1602(kal_uint16 *out_LCD_width,kal_uint16 *out_LCD_height)
{
*out_LCD_width = SUBLCD_WIDTH;
*out_LCD_height = SUBLCD_HEIGHT;
}
/****************************************************************************
FUNCTION NAME : LCD_EnterSleep_UC1602
PURPOSE : This function is to let Sub_LCD enter sleep-mode.
INPUT PARAMETERS : void
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_EnterSleep_UC1602(void)
{
}
/****************************************************************************
FUNCTION NAME : LCD_ExitSleep_UC1602
PURPOSE : This function is to let Sub_LCD exit sleep-mode.
INPUT PARAMETERS : void
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_ExitSleep_UC1602(void)
{
}
/* Engineering mode */
/****************************************************************************
FUNCTION NAME : LCD_GetParm
PURPOSE : This function is to obtain the parameter numbers
for engineering mode APIs.
INPUT PARAMETERS : lcd_func_type
OUTPUT PARAMETERS : kal_uint8
*****************************************************************************/
kal_uint8 LCD_GetParm_UC1602(lcd_func_type type)
{
switch(type)
{
case lcd_Bais_func:
return 1;
case lcd_Contrast_func:
return 1;
case lcd_LineRate_func:
return 1;
case lcd_Temperature_Compensation_func:
return 1;
default:
ASSERT(0);
return 100;
}
}
/****************************************************************************
FUNCTION NAME : LCD_SetBias
PURPOSE : This function is to setup LCD bias.
INPUT PARAMETERS : kal_uint8
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_SetBias_UC1602(kal_uint8 *bias)
{
LCD_CtrlWrite_UC1602(LCD_BIAS_SELECT_UC1602| (*bias&0x03));
}
/****************************************************************************
FUNCTION NAME : LCD_Contrast
PURPOSE : This function is setup LCD contrast. Basically,
it is the same as BrightLevel function.
INPUT PARAMETERS : kal_uint8
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_Contrast_UC1602(kal_uint8 *contrast)
{
if (*contrast>63)
*contrast=63;
LCD_CtrlWrite_UC1602(LCD_BRIGHT_SET_UC1602);
LCD_CtrlWrite_UC1602(*contrast | 0x40);
}
/****************************************************************************
FUNCTION NAME : LCD_LineRate
PURPOSE : This function is to setup LCD frame refresh
rate.
INPUT PARAMETERS : kal_uint8
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_LineRate_UC1602(kal_uint8 *linerate)
{
}
/****************************************************************************
FUNCTION NAME : LCD_Temp_Compensate
PURPOSE : This function is to setup LCD temperature.
INPUT PARAMETERS : kal_uint8
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_Temp_Compensate_UC1602(kal_uint8 *compensate)
{
}
#endif
/*===================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_SSD1779 = {
LCD_Init_SSD1779,
LCD_PWRON_SSD1779,
LCD_SetContrast_SSD1779,
LCD_ON_SSD1779,
LCD_BlockWrite_SSD1779,
LCD_Size_SSD1779,
LCD_EnterSleep_SSD1779,
LCD_ExitSleep_SSD1779,
0,
0,
0,
/*Engineering mode*/
LCD_GetParm_SSD1779,
LCD_SetBias_SSD1779,
LCD_Contrast_SSD1779,
LCD_LineRate_SSD1779,
LCD_Temp_Compensate_SSD1779
};
#ifdef DUAL_LCD
LCD_Funcs LCD_func_UC1602 = {
LCD_Init_UC1602,
LCD_PWRON_UC1602,
LCD_SetVoltLevel_UC1602,
LCD_ON_UC1602,
LCD_BlockWrite_UC1602,
LCD_Size_UC1602,
LCD_EnterSleep_UC1602,
LCD_ExitSleep_UC1602,
0,
0,
0,
/*Engineering mode*/
LCD_GetParm_UC1602,
LCD_SetBias_UC1602,
LCD_Contrast_UC1602,
LCD_LineRate_UC1602,
LCD_Temp_Compensate_UC1602
};
#endif
void LCD_FunConfig(void)
{
MainLCD = &LCD_func_SSD1779;
#ifdef DUAL_LCD
SubLCD = &LCD_func_UC1602;
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -