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

📄 0426lcd.c

📁 TFT LCD R61503的应用程序。
💻 C
字号:
#include "drv_comm.h"
#include "reg_base.h"
#include "lcd_sw_inc.h"
#include "lcd_sw.h"
#include "lcd_hw.h"
#include "lcd_if.h"

extern void GPIO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada);

kal_bool    lcd_assert_fail=KAL_FALSE;

void Delay_ms(kal_uint32 times) 
{ 
	kal_uint32 delay1;
	kal_uint16   delay2;
       for(delay1=0;delay1<times;delay1++)
	   	 for(delay2=0;delay2<4700;delay2++){ }  // about 1ms
}

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 1ms
} 
void spi_ini(void)
{
}

#if (defined(MT6218B)||defined(MT6219)||defined(MT6217)|| defined(MT6225)||defined(MT6226)||defined(MT6227))
void init_lcd_interface(void)
{      
	
	REG_LCD_ROI_CTRL=0;
	CLEAR_LCD_CTRL_RESET_PIN;
	Delay_ms(10);
#if (defined(MT6219)|| defined(MT6225)||defined(MT6226)||defined(MT6227))
   	SET_LCD_PARALLEL_CE2WR_SETUP_TIME((kal_uint32)2);
   	SET_LCD_PARALLEL_CE2WR_HOLD_TIME(2);
   	SET_LCD_PARALLEL_CE2RD_SETUP_TIME(2);
   	SET_LCD_PARALLEL_WRITE_WAIT_STATE(10);
   	SET_LCD_PARALLEL_READ_LATENCY_TIME(10);
   	SET_LCD_ROI_CTRL_CMD_LATENCY(10);

   #if (defined(MT6226)|| defined(MT6225)||defined(MT6227))
      #ifdef LCD_18BIT_MODE
            GPIO_ModeSetup(55, 1);
	    *((volatile unsigned short *) 0x801201B0) |= 0x4000;
	    *((volatile unsigned short *) 0x801201D0) |= 0x0001;
      #endif
	SET_LCD_PARALLEL_DATA_BUS_WIDTH;
	SET_LCD_PARALLEL_GAMMA_R_TABLE(LCD_PARALLEL_GAMMA_DISABLE);
	SET_LCD_PARALLEL_GAMMA_G_TABLE(LCD_PARALLEL_GAMMA_DISABLE);
	SET_LCD_PARALLEL_GAMMA_B_TABLE(LCD_PARALLEL_GAMMA_DISABLE);
   #endif

   #if (defined(MT6219))
	DISABLE_LCD_PARALLEL_SYNC;
   #endif
#endif

	SET_LCD_CTRL_RESET_PIN;
   	Delay_ms(100);
}
#endif /* MT6217, MT6218B, MT6219 */

#define Init_data(CMD,Data) \
{ \
    LCD_CtrlWrite_R61503B(CMD); \
    LCD_DataWrite_R61503B(Data); \
}

void LCD_Partial_On_R61503B(kal_uint16 start_page,kal_uint16 end_page) {}

void LCD_Partial_Off_R61503B(void) {}

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

void LCD_blockClear_R61503B(kal_uint16 x1,kal_uint16 y1,kal_uint16 x2,kal_uint16 y2,kal_int32 data) 
{
    kal_uint16 LCD_x; 
    kal_uint16 LCD_y; 

    Init_data(0x0020, (x1&0xFF));
    Init_data(0x0021, (y1&0x1FF));
    Init_data(0x0050, (x1&0xFF));
    Init_data(0x0051, (x2&0xFF));
    Init_data(0x0052, (y1&0xFF));
    Init_data(0x0053, (y2&0xFF));
    LCD_CtrlWrite_R61503B(0x0022);
    
    for(LCD_x=x1;LCD_x<=x2;LCD_x++) 
        for(LCD_y=y1;LCD_y<=y2;LCD_y++) 
        { 
            *((volatile unsigned short*) LCD_R61503B_DATA_ADDR)=data; 
        }
}

void LCD_ClearAll_R61503B(kal_int32 data) 
{ 
    LCD_blockClear_R61503B(0,0,LCD_WIDTH-1,LCD_HEIGHT-1,data); 
} 

void LCD_Init_R61503B(kal_int32 bkground, void **buf_addr) 
{ 
    Init_data(0x0000,0x0001);
    Delay_ms(10);
    Init_data(0x00A4,0x0001);
    Delay_ms(10);
    Init_data(0x0070,0x9B00);
    Delay_ms(10);
    Init_data(0x0007,0x0031);
    Delay_ms(10);
    //power supply setting
    Init_data(0x0018,0x0001);
    Delay_ms(5);
    Init_data(0x0010,0x16B0);    
    Delay_ms(5);
    Init_data(0x0011,0x0200);
    Delay_ms(5);
    Init_data(0x0012,0x1118);
    Delay_ms(5);
    Init_data(0x0013,0x880F);
    Delay_ms(5);
    Init_data(0x0014,0x0000);
    Delay_ms(5);
    Init_data(0x0012,0x1138);
    Delay_ms(5);
    Init_data(0x0090,0x0004);
    Init_data(0x0091,0x0000);
    Init_data(0x0092,0x0007);
    Init_data(0x0098,0x0002);
    //display contral
    Init_data(0x0001,0x0100);
    Init_data(0x0002,0x0400);
    Init_data(0x0003,0x1030);
    Init_data(0x0008,0x0708);
    Init_data(0x0070,0x1B00);
    Init_data(0x0071,0x0001);
    //gamma contral
    Init_data(0x0030,0x0305);
    Init_data(0x0031,0x0005);
    Init_data(0x0032,0x0000);
    Init_data(0x0033,0x0003);
    Init_data(0x0034,0x0900);
    Init_data(0x0035,0x0607);
    Init_data(0x0036,0x0307);
    Init_data(0x0037,0x0305);
    Init_data(0x0038,0x1305);
    Init_data(0x0039,0x1C00);
    Init_data(0x003A,0x1500);
    //panel interface
    Init_data(0x0020,0x0000);
    Init_data(0x0021,0x0000);
    //address set
    Init_data(0x0050,0x0000);             
    Init_data(0x0051,0x00AF);
    Init_data(0x0052,0x0000);
    Init_data(0x0053,0x00DB);
    //display on
    Delay_ms(5);
    if(bkground>=0)
    {
       LCD_ClearAll_R61503B(bkground);
    }
    Init_data(0x0007,0x0001);
    Delay_ms(10);
    Init_data(0x0007,0x0021);
    Delay_ms(10);
    Init_data(0x0007,0x0233);
} 

void LCD_EnterSleep_R61503B(void) 
{
    Init_data(0x0007,0x0002);
    Init_data(0x0012,0x0138);
    Delay_ms(10);
    Init_data(0x0007,0x0000);
    Delay_ms(10);
    Init_data(0x0010,0x0680);
    Init_data(0x0011,0x0260);
    Init_data(0x0012,0x0128);
    Init_data(0x0013,0x080F);
    Delay_ms(10);
    Init_data(0x0010,0x0601);
} 

void LCD_ExitSleep_R61503B(void) 
{ 
    Init_data(0x0010,0x0600);
    Delay_ms(100);
    LCD_Init_R61503B(-1,0);   
} 

void LCD_PWRON_R61503B(kal_bool on) 
{ 
   if(on) 
   { 
     LCD_ExitSleep_R61503B(); 
   } 
   else 
   { 
      LCD_EnterSleep_R61503B(); 
   } 
} 

void LCD_SetContrast_R61503B(kal_uint8 level) {}
void LCD_SetNBlockInv_R61503B(kal_uint8 level) {}
void LCD_ON_R61503B(kal_bool on) {}
 
void LCD_BlockWrite_R61503B(kal_uint16 startx,kal_uint16 starty,kal_uint16 endx,kal_uint16 endy) 
{ 
    kal_uint16 l_startx = startx + LCD_HORIZONTAL_COORDINATE_0;
    kal_uint16 l_endx = endx + LCD_HORIZONTAL_COORDINATE_0;
    kal_uint16 l_starty = starty + LCD_VERTICAL_COORDINATE_0;
    kal_uint16 l_endy = endy + LCD_VERTICAL_COORDINATE_0; 
    SET_LCD_CMD_PARAMETER(0,LCD_CMD,0x20); 
    SET_LCD_CMD_PARAMETER(1,LCD_DATA,(l_startx&0xFF)); 
    SET_LCD_CMD_PARAMETER(2,LCD_CMD,0x21); 
    SET_LCD_CMD_PARAMETER(3,LCD_DATA,(l_starty&0x1ff)); 
    SET_LCD_CMD_PARAMETER(4,LCD_CMD,0x50); 
    SET_LCD_CMD_PARAMETER(5,LCD_DATA,(l_startx&0xff)); 
    SET_LCD_CMD_PARAMETER(6,LCD_CMD,0x51); 
    SET_LCD_CMD_PARAMETER(7,LCD_DATA,(l_endx&0xff)); 
    SET_LCD_CMD_PARAMETER(8,LCD_CMD,0x52); 
    SET_LCD_CMD_PARAMETER(9,LCD_DATA,(l_starty&0xff)); 
    SET_LCD_CMD_PARAMETER(10,LCD_CMD,0x53); 
    SET_LCD_CMD_PARAMETER(11,LCD_DATA,(l_endy&0xff)); 
    SET_LCD_CMD_PARAMETER(12,LCD_CMD,0x22); 
    SET_LCD_ROI_CTRL_NUMBER_OF_CMD(13);
    ENABLE_LCD_TRANSFER_COMPLETE_INT; 
    ENABLE_LCD_ROI_CTRL_CMD_FIRST; 
    while (LCD_IS_RUNNING) {}; 
    START_LCD_TRANSFER; 
}


void LCD_Size_R61503B(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_R61503B(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_R61503B(kal_uint8 *bias) {}
void LCD_Contrast_R61503B(kal_uint8 *contrast){}
void LCD_LineRate_R61503B(kal_uint8 *linerate) {}
void LCD_Temp_Compensate_R61503B(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 , const void *src , kal_uint16 size)
{
   kal_mem_cpy(dst,src,size);
}
#endif   /*(MT6205B,MT6218)*/

LCD_Funcs LCD_func_R61503B =
{
   LCD_Init_R61503B,
   LCD_PWRON_R61503B,
   LCD_SetContrast_R61503B,
   LCD_ON_R61503B,
   LCD_BlockWrite_R61503B,
   LCD_Size_R61503B,
   LCD_EnterSleep_R61503B,
   LCD_ExitSleep_R61503B,
   LCD_Partial_On_R61503B,
   LCD_Partial_Off_R61503B,
   LCD_Partial_line_R61503B,
   /*Engineering mode*/
   LCD_GetParm_R61503B,
   LCD_SetBias_R61503B,
   LCD_Contrast_R61503B,
   LCD_LineRate_R61503B,
   LCD_Temp_Compensate_R61503B
};

void LCD_FunConfig(void)
{
   MainLCD = &LCD_func_R61503B;
}

⌨️ 快捷键说明

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