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

📄 lcd.c

📁 这个是MTK手机平台上面的LCD
💻 C
📖 第 1 页 / 共 5 页
字号:
	LCD_CtrlWrite_WSX6396A(0x0034);
	LCD_DataWrite_WSX6396A(0x0203);
	LCD_CtrlWrite_WSX6396A(0x0035);
	LCD_DataWrite_WSX6396A(0x0303);
	LCD_CtrlWrite_WSX6396A(0x0036);
	LCD_DataWrite_WSX6396A(0x0707);
	LCD_CtrlWrite_WSX6396A(0x0037);
	LCD_DataWrite_WSX6396A(0x0300);
	LCD_CtrlWrite_WSX6396A(0x003f);
	LCD_DataWrite_WSX6396A(0x0000);
	LCD_CtrlWrite_WSX6396A(0x0041);
	LCD_DataWrite_WSX6396A(0x0000);
	LCD_CtrlWrite_WSX6396A(0x0042);
	LCD_DataWrite_WSX6396A(0xdb00);
	LCD_CtrlWrite_WSX6396A(0x0043);
	LCD_DataWrite_WSX6396A(0xefed);
	LCD_CtrlWrite_WSX6396A(0x0044);
	LCD_DataWrite_WSX6396A(0xaf00);
	LCD_CtrlWrite_WSX6396A(0x0045);
	LCD_DataWrite_WSX6396A(0xdb00);
	/************ Display On Function ***************************/
	LCD_CtrlWrite_WSX6396A(LCD_Dis_Con_WSX6396A);
	LCD_DataWrite_WSX6396A(0x0005);
	LCD_Delay(10);
	LCD_CtrlWrite_WSX6396A(LCD_Dis_Con_WSX6396A);
	LCD_DataWrite_WSX6396A(0x0025);
	LCD_CtrlWrite_WSX6396A(LCD_Serial_Transfer_WSX6396A);
	LCD_DataWrite_WSX6396A(0x0100);
	LCD_Delay(1);
	LCD_CtrlWrite_WSX6396A(LCD_Dis_Con_WSX6396A);
	LCD_DataWrite_WSX6396A(0x0027);
	LCD_Delay(10);
	LCD_CtrlWrite_WSX6396A(LCD_Dis_Con_WSX6396A);
	LCD_DataWrite_WSX6396A(0x0037);
	LCD_Delay(10);

	LCD_ClearAll_WSX6396A(0x0000);

	LCD_CtrlWrite_WSX6396A(0x0003);
//	LCD_DataWrite_WSX6396A(0x1030);
	LCD_DataWrite_WSX6396A(0x1230);	/* enable high speed write mode */
}

void LCD_PWRON_WSX6396A(kal_bool on)
{
   if(on)
   {
      LCD_ExitSleep_WSX6396A();
   }
   else
   {
      LCD_EnterSleep_WSX6396A();
   }
}

void LCD_SetContrast_WSX6396A(kal_uint8 level)
{
}

void LCD_ON_WSX6396A(kal_bool on)
{
  	if (on)
  	{
    	/************ Display On Function ***************************/
			LCD_CtrlWrite_WSX6396A(LCD_Dis_Con_WSX6396A);
			LCD_DataWrite_WSX6396A(0x0005);
			LCD_Delay(1);
			LCD_CtrlWrite_WSX6396A(LCD_Dis_Con_WSX6396A);
			LCD_DataWrite_WSX6396A(0x0025);
			LCD_CtrlWrite_WSX6396A(LCD_Serial_Transfer_WSX6396A);
			LCD_DataWrite_WSX6396A(0x0100);
			LCD_Delay(1);
			LCD_CtrlWrite_WSX6396A(LCD_Dis_Con_WSX6396A);
			LCD_DataWrite_WSX6396A(0x0027);
			LCD_Delay(1);
			LCD_CtrlWrite_WSX6396A(LCD_Dis_Con_WSX6396A);
			LCD_DataWrite_WSX6396A(0x0037);
   }
  	else
  	{
		/************ Display Off Function ***************************/
			LCD_CtrlWrite_WSX6396A(LCD_Dis_Con_WSX6396A);
			LCD_DataWrite_WSX6396A(0x0036);
			LCD_Delay(1);
			LCD_CtrlWrite_WSX6396A(LCD_Dis_Con_WSX6396A);
			LCD_DataWrite_WSX6396A(0x0026);
			LCD_Delay(1);
			LCD_CtrlWrite_WSX6396A(LCD_Dis_Con_WSX6396A);
			LCD_DataWrite_WSX6396A(0x0004);
			LCD_CtrlWrite_WSX6396A(LCD_Serial_Transfer_WSX6396A);
			LCD_DataWrite_WSX6396A(0x0100);
			LCD_Delay(1);
	}
}

void LCD_BlockWrite_WSX6396A(kal_uint16 startx,kal_uint16 starty,kal_uint16 endx,kal_uint16 endy)
{
	kal_uint16 roi_offset_x,roi_offset_y;
	kal_uint16 roi_width,roi_height;

	ASSERT(lcd_assert_fail==KAL_FALSE);
	lcd_assert_fail = KAL_TRUE;

	roi_offset_x=GET_LCD_ROI_WINDOW_OFFSET_X;
	roi_offset_y=GET_LCD_ROI_WINDOW_OFFSET_Y;
	roi_width=GET_LCD_ROI_WINDOW_SIZE_X;
	roi_height=GET_LCD_ROI_WINDOW_SIZE_Y;

	roi_offset_x -= (startx&0x03);
	roi_width+= (startx&0x03);
	roi_width+= (3-(endx&0x03));
	SET_LCD_ROI_WINDOW_SIZE(roi_width,roi_height);
	SET_LCD_ROI_WINDOW_OFFSET(roi_offset_x,roi_offset_y);
	#if (defined(MT6218B) || defined(MT6219) || defined(MT6217))
		SET_LCD_CMD_PARAMETER(0,LCD_CMD,0x00);
		SET_LCD_CMD_PARAMETER(1,LCD_CMD,0x44);

		SET_LCD_CMD_PARAMETER(2,LCD_DATA,endx);
		SET_LCD_CMD_PARAMETER(3,LCD_DATA,startx);

		SET_LCD_CMD_PARAMETER(4,LCD_CMD,0x00);
		SET_LCD_CMD_PARAMETER(5,LCD_CMD,0x45);

		SET_LCD_CMD_PARAMETER(6,LCD_DATA,endy);
		SET_LCD_CMD_PARAMETER(7,LCD_DATA,starty);

		SET_LCD_CMD_PARAMETER(8,LCD_CMD,0x00);
		SET_LCD_CMD_PARAMETER(9,LCD_CMD,0x21);

		SET_LCD_CMD_PARAMETER(10,LCD_DATA,starty);
//		SET_LCD_CMD_PARAMETER(11,LCD_DATA,startx);
		SET_LCD_CMD_PARAMETER(11,LCD_DATA,(startx&0xFFFC));

		SET_LCD_CMD_PARAMETER(12,LCD_CMD,0x00);
		SET_LCD_CMD_PARAMETER(13,LCD_CMD,0x22);

		ENABLE_LCD_TRANSFER_COMPLETE_INT;
		SET_LCD_ROI_CTRL_NUMBER_OF_CMD(14);
		ENABLE_LCD_ROI_CTRL_CMD_FIRST;
		while (LCD_IS_RUNNING) {};
		START_LCD_TRANSFER;
	#endif /* MT6218B, MT6219 */

	lcd_assert_fail = KAL_FALSE;
}

void LCD_Size_WSX6396A(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_WSX6396A(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_WSX6396A(kal_uint8 *bias)
{
}

void LCD_Contrast_WSX6396A(kal_uint8 *contrast)
{
}

void LCD_LineRate_WSX6396A(kal_uint8 *linerate)
{
}

void LCD_Temp_Compensate_WSX6396A(kal_uint8 *compensate)
{
}

/***********************SSD1773********************************/
#if (defined(DUAL_LCD))
void LCD_EnterSleep_SSD1773(void)
{
	LCD_CtrlWrite_SSD1773(LCD_SLEEP_MODE_SSD1773|0x01);
	LCD_Delay(100);
}

void LCD_ExitSleep_SSD1773(void)
{
	LCD_CtrlWrite_SSD1773(LCD_SLEEP_MODE_SSD1773);
	LCD_CtrlWrite_SSD1773(LCD_DISPLAY_ON_SSD1773|0x01);
	LCD_Delay(100);
}

void LCD_Partial_On_SSD1773(kal_uint16 start_page,kal_uint16 end_page)
{
	LCD_CtrlWrite_SSD1773(LCD_ENTER_PARTIAL_SSD1773);
	LCD_DataWrite_SSD1773(start_page);
	LCD_DataWrite_SSD1773(end_page);
}

void LCD_Partial_Off_SSD1773(void)
{
	LCD_CtrlWrite_SSD1773(LCD_EXIT_PARTIAL_SSD1773);
}

kal_uint8 LCD_Partial_line_SSD1773(void)
{
	return 1;		/* partial display in 1 line alignment */
}

void LCD_Set_Y_Addr_SSD1773(kal_uint16 start_row, kal_uint16 end_row)
{
	//Set Page Address
	LCD_CtrlWrite_SSD1773(LCD_SET_PAGE_ADDR_SSD1773);
	LCD_DataWrite_SSD1773(start_row); /* KC *///Start Pos
	LCD_DataWrite_SSD1773(end_row); /* KC *///End Pos
}

void LCD_Set_X_Addr_SSD1773(kal_uint16 start_column, kal_uint16 end_column)
{
 	//Set Column Address
	LCD_CtrlWrite_SSD1773(LCD_SET_COLUMN_ADDR_SSD1773);
	LCD_DataWrite_SSD1773(start_column+8); /* KC */ //Start Pos
 	LCD_DataWrite_SSD1773(end_column+8); /* KC *///End Pos
}

void LCD_blockClear_SSD1773(kal_uint16 x1,kal_uint16 y1,kal_uint16 x2,kal_uint16 y2,kal_uint16 data)
{
	kal_uint16 LCD_x, LCD_y;
	volatile kal_uint16 delay;

	LCD_Set_Y_Addr_SSD1773(y1, y2);
	LCD_Set_X_Addr_SSD1773(x1, x2);

	LCD_CtrlWrite_SSD1773(LCD_WRITE_DATA_SSD1773);

	for(LCD_y=y1;LCD_y<=y2;LCD_y++)
	{
		for(LCD_x=x1;LCD_x<=x2;LCD_x++)
		{
			LCD_RAMWrite_SSD1773(data);
		}
	}
}

/* KC */
#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#if (defined(MT6218B)||defined(MT6219)||defined(MT6217))
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#else
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif
/* under construction !*/
#endif

void LCD_ClearAll_SSD1773(kal_uint16 data)
{
   LCD_blockClear_SSD1773(0,0,SUBLCD_WIDTH-1,SUBLCD_HEIGHT-1,data);
}

void LCD_Init_SSD1773(kal_uint32 bkground, void **buf_addr)
{
  	volatile kal_uint32 i;
	kal_uint16 background = (kal_uint16)bkground;

	//start oscillation
	LCD_CtrlWrite_SSD1773(0xD1);
	//Exit Sleep Mode
	LCD_CtrlWrite_SSD1773(0x94);
	//Set Power Control Register
	LCD_CtrlWrite_SSD1773(0x20);
	LCD_DataWrite_SSD1773(0x07); //Boost Level 4X
	//Display Control , duty selection
	LCD_CtrlWrite_SSD1773(0xCA);
	LCD_DataWrite_SSD1773(0x00);
	LCD_DataWrite_SSD1773(0x0f); //68Mux , 1/64 Duty
	LCD_DataWrite_SSD1773(0x00);
	//Set bias ratio
	LCD_CtrlWrite_SSD1773(LCD_SET_BIAS_SSD1773);
	LCD_DataWrite_SSD1773(0x05);    // 1/7
	//Set target gain and contrast
	LCD_CtrlWrite_SSD1773(LCD_SET_CON_IRRR_SSD1773);
	LCD_DataWrite_SSD1773(0x16); /* KC */
	LCD_DataWrite_SSD1773(0x04);
	//Display Inverse for Panel is negative type
	LCD_CtrlWrite_SSD1773(0xA7); /* KC */ //A7
	//Data Output Scan Direction , RGB arrangement , Gray Scale selection
	//page address to normal display, column address to normal rotation , scan direction to column scan
	LCD_CtrlWrite_SSD1773(0xBC);
	LCD_DataWrite_SSD1773(0x00); /* KC */ //00
	LCD_DataWrite_SSD1773(0x00);
	LCD_DataWrite_SSD1773(0x00); //64 Levels gray
	//Com Output Scan Direction
	LCD_CtrlWrite_SSD1773(0xBB);
	LCD_DataWrite_SSD1773(0x01); /* KC */ //01
	/* KC 
	(0 to 79) Specify one of ROW0-ROW79 to which the first display line (COM0) is mapped to. */
	LCD_CtrlWrite_SSD1773(0x44);
	LCD_DataWrite_SSD1773(0x27); /* KC */
	
	//Clear Window
	LCD_CtrlWrite_SSD1773(0x8E);
	LCD_DataWrite_SSD1773(0x00); //( Xstart , Ystart)
	LCD_DataWrite_SSD1773(0x00);
	LCD_DataWrite_SSD1773(0x67); //( Xend , Yend)
	LCD_DataWrite_SSD1773(0x4F);
	//Display On
	LCD_CtrlWrite_SSD1773(0xaf);

	LCD_ClearAll_SSD1773(0x0000);
}

void LCD_PWRON_SSD1773(kal_bool on)
{
   if(on)
   {
      LCD_ExitSleep_SSD1773();
   }
   else
   {
      LCD_EnterSleep_SSD1773();
   }
}

void LCD_SetContrast_SSD1773(kal_uint8 level)
{
	LCD_CtrlWrite_SSD1773(LCD_SET_CON_IRRR_SSD1773);
	LCD_DataWrite_SSD1773(level);
	LCD_DataWrite_SSD1773(0x04);
}

void LCD_SetNBlockInv_SSD1773(kal_uint8 level)
{
	LCD_CtrlWrite_SSD1773(LCD_SET_FRAME_NLINE_SSD1773);
	LCD_DataWrite_SSD1773(8); //F3~F0 Frame rate
	LCD_DataWrite_SSD1773(level); //N6|N4~N0 N Line
}

void LCD_ON_SSD1773(kal_bool on)
{
   if (on)
   {
      LCD_CtrlWrite_SSD1773(LCD_DISPLAY_ON_SSD1773|0x01);
   }
   else
   {
      LCD_CtrlWrite_SSD1773(LCD_DISPLAY_ON_SSD1773);
   }
}

void LCD_BlockWrite_SSD1773(kal_uint16 startx,kal_uint16 starty,kal_uint16 endx,kal_uint16 endy)
{
	ASSERT(lcd_assert_fail==KAL_FALSE);
	lcd_assert_fail = KAL_TRUE;

	#if (defined(MT6218B) || defined(MT6219)|| defined(MT6217))
		LCD_Set_X_Addr_SSD1773(startx,endx);
		LCD_Set_Y_Addr_SSD1773(starty, endy);
		LCD_CtrlWrite_SSD1773(LCD_WRITE_DATA_SSD1773);

		ENABLE_LCD_TRANSFER_COMPLETE_INT;
		DISABLE_LCD_ROI_CTRL_CMD_FIRST;
		while (LCD_IS_RUNNING) {};
		START_LCD_TRANSFER;
	#endif /* MT6218B, MT6219 */

	lcd_assert_fail = KAL_FALSE;
}

void LCD_Size_SSD1773(kal_uint16 *out_LCD_width,kal_uint16 *out_LCD_height)
{
	*out_LCD_width = SUBLCD_WIDTH;
	*out_LCD_height = SUBLCD_HEIGHT;
}

/*Engineering mode*/
kal_uint8 LCD_GetParm_SSD1773(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;
   }
}

void LCD_SetBias_SSD1773(kal_uint8 *bias)
{
	//Set bias ratio
	LCD_CtrlWrite_SSD1773(LCD_SET_BIAS_SSD1773);
	LCD_DataWrite_SSD1773(*bias);
}

void LCD_Contrast_SSD1773(kal_uint8 *contrast)
{
	LCD_CtrlWrite_SSD1773(LCD_SET_CON_IRRR_SSD1773);
	LCD_DataWrite_SSD1773(*contrast);
	LCD_DataWrite_SSD1773(0x04);
}

void LCD_LineRate_SSD1773(kal_uint8 *linerate)
{
	LCD_CtrlWrite_SSD1773(LCD_SET_FRAME_NLINE_SSD1773);
	LCD_DataWrite_SSD1773(*linerate); //F3~F0 Frame rate
	LCD_DataWrite_SSD1773(16); //N6|N4~N0 N Line
}

void LCD_Temp_Compensate_SSD1773(kal_uint8 *compensate)
{
	LCD_CtrlWrite_SSD1773(LCD_TC_SSD1773);
	LCD_DataWrite_SSD1773(*compensate);
}
#endif	/*DUAL_LCD*/
#endif/*WSX6396A*/
//========================================================
//
//   HITACH  64k Color LCD,  Chip: RENRSAS R61500 , 176x220 Parallel Interface                     
//                          
//========================================================

void   Delay_us(kal_uint32 times)
{
	kal_uint32 delay1;
	kal_uint8   delay2;
       for(delay1=0;delay1<times;delay1++)
	   	 for(delay2=0;delay2<4;delay2++){ }  // about 1us
}

//==============================================================
//
//   Delay_ms:   delay at microsecond level
//
//==============================================================
void   Delay_ms(kal_uint32 times)    
{
	kal_uint32 delay;
	
	for(delay=0; delay<times*4700; delay++){};   // about 1ms
}


#ifdef __SM02_MIKI_DRV_LCD_HITACHI_R61500__

//==============================================================
//
//   Delay_us:   delay at microsecond level
//
//==============================================================

#if (defined(MT6218B)||defined(MT6219)||defined(MT6217)||defined(MT6226)|| defined(MT6226M))
void init_lcd_interface(void)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -