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

📄 lcddrive.c

📁 这是ARM嵌入式系统的实验教程中的MINIGUI的实验源代码!
💻 C
字号:
/****************************************************************************************
* 文件名:LCDDRIVE.C
* 功能:TFT4267液晶模块驱动。驱动芯片为S6D0129 (片内172800字节GRAM,即240*320*18/8),
*                                  
*  RGB对应值(16位数据,d15--d0):
*  d15--d11		R色
*  d10--d5      G色
*  d4--d0		B色
*  写操作时地址计数器会自动增长,而读操作则不会自动增长。读操作时,读第2个数
*  据才是有效的数据
****************************************************************************************/
#include "LPC2294.h"
#include "lcddrive.h"


/*******************************************************
* 名称: TftSendCom
* 功能: 向TFT液晶模块发送命令字。
* 入口参数: com   命令字(uint16)
* 出口参数: 无
*******************************************************/
void  TftSendCom(uint16 com)
{  S6D0129_IR = com;
}


/*******************************************************
* 名称: TftSendDat
* 功能: 向TFT液晶模块发送数据。
* 入口参数: dat   待发送的数据(uint16)
* 出口参数: 无
*******************************************************/
void  TftSendDat(uint16 dat)
{  S6D0129_DR = dat;
}


/*******************************************************
* 名称: TftRcvDat
* 功能: 读取TFT液晶模块的数据。
* 入口参数: 无
* 出口参数: 返回值即是读出的数据
*******************************************************/
uint16  TftRcvDat(void)
{  uint16  ret;

   ret = S6D0129_DR;
   return(ret);
}



/*******************************************************
* 名称: TftSetAddr
* 功能: 设置数据地址指针(坐标值)。
* 入口参数: x		横坐标的值 (0-239)
*           y       纵坐标的值 (0-319)
* 出口参数: 设置正确返回TRUE,参数超出范围返回FALSE
*******************************************************/
uint8  TftSetAddr(uint16 x, uint16 y)
{  TftSendCom(SET_ADDR_X);		// 设置地址低8位
   TftSendDat(x);
   
   TftSendCom(SET_ADDR_Y);		// 设置地址高9位
   TftSendDat(y);
   
   if((x<240) && (y<320)) return(TRUE);
     else  return(FALSE);
}


/*******************************************************
* 名称: TftSetWrite
* 功能: 设置数据地址指针(坐标值),并发送写数据命令。
*       接着不断的写入数据即可,GRAM地址会自动增加。
* 入口参数: x		横坐标的值 (0-239)
*           y       纵坐标的值 (0-319)
* 出口参数: 设置正确返回TRUE,参数超出范围返回FALSE
*******************************************************/
uint8  TftSetWrite(uint16 x, uint16 y)
{  uint8  ret;

   ret = TftSetAddr(x, y);
   TftSendCom(WR_RD_DATA);		// 写数据
   return(ret);
}


/*******************************************************
* 名称: TftSetWindow
* 功能: 设置数据填充窗口大小。
* 入口参数: x0,y0		窗口左上角从标
*           x1,y1	    窗口右上角从标
* 出口参数: 设置正确返回TRUE,参数错误返回FALSE
*******************************************************/
uint8  TftSetWindow(uint16 x0, uint16 y0, uint16 x1, uint16 y1)  
{  uint16  hea_hsa;

   // 参数过滤
   if(x1>239) x1 = 239;
   if(y1>319) y1 = 319;
   if((x1<=x0) || (y1<=y0)) return(FALSE);         
   
   // 设置数据填充窗口大小
   hea_hsa = (x1<<8) | x0;
   TftSendCom(SET_WINDOW_SX_EX);		
   TftSendDat(hea_hsa);   
   TftSendCom(SET_WINDOW_SY);		
   TftSendDat(y0);
     
   TftSendCom(SET_WINDOW_EY);		
   TftSendDat(y1);
   
   return(TRUE);
}


/*******************************************************
* 名称: DelaymS
* 功能: 软件延时(1mS,与系统时钟有关)。
* 入口参数: no   延时控制(uint32),值越大延时越长
* 出口参数: 无
*******************************************************/
void  DelaymS(uint32 no)
{  uint32 i;

   for(; no>0; no--)
   {  for(i=0; i<900; i++);
   }
}


/****************************************************************************
* 名称:TFT_FillSCR()
* 功能:全屏填充。直接使用数据填充显示缓冲区。
* 入口参数:dat		填充的数据
* 出口参数:无
****************************************************************************/
void  TFT_FillSCR(uint16 dat)
{  uint16  i, j;

   TftSetWindow(0,0, 239, 319); 
   TftSetWrite(0, 0);
   for(i=0; i<GUI_LCM_YMAX; i++)		// 历遍所有行
   {  for(j=0; j<GUI_LCM_XMAX; j++)		// 历遍所有行
      {  TftSendDat(dat); 				// 填充数据
	  }
   }
}


/*******************************************************
* 名称: TftReset
* 功能: 控制TFT液晶模块复位。
* 入口参数: 无
* 出口参数: 无
*******************************************************/
void  TftReset(void)
{   PINSEL1 = PINSEL1 & (~(0x03<<12));
    IO0DIR = IO0DIR | S6D0129_RST;    

    IO0CLR = S6D0129_RST;
    DelaymS(10);
    IO0SET = S6D0129_RST;
    DelaymS(10);   
}


// 定义TFT4267初始化数据信息
STCOM_INI  TFT4267_INI[] = 
{   // 电源设置
    {0x0000, 0x0001, 10},	// Start Oscillation
    {0x000B, 0x0000,  0},	// Frame cycle setting
    {0x000C, 0x0000, 15},	// External display interface setting
    {0x0011, 0x2E00,  0},	// Power control2 setting
    {0x0014, 0x1119,  0},	// Power control5 setting
    {0x0010, 0x1040, 15},	// Power control1 setting
    {0x0013, 0x0040, 15},	// Power control4 setting
    {0x0013, 0x0060, 15},	// Power control4
    {0x0013, 0x0070, 60},	// Power control4
    {0x0011, 0x3100,  0},   // Power control2
    {0x0010, 0x1600, 20},   // Power control1 
    
    // 显示设置
    {0x0001, 0x0927,   0},  // Driver output setting (240x320 mode, GS=0, SS=1)
    {0x0002, 0x0700,   0},  // LCD driving waveform setting
    {0x0003, 0x1030,   0},  // Entry mode setting (TRI=0, DFM=0, BGR=1, ID1:ID0 =11)
    {0x0007, 0x0004,   0},  // Display control1 (VLE2:VLE1=00, REV=1)
    {0x0008, 0x0505,   0},  // Display control2
    {0x0009, 0x0000,   0},  // ***
    
    {0x0040, 0x0000,   0},  // Gate scan position (start G1 scan)
    {0x0041, 0x0000,   0},  // Vertical scroll setting
    {0x0042,    319,   0},  // Screen end position (320-1)
    {0x0043,      0,   0},  // Screen start position (0)
    {0x0044,      0,   0},  // 2th Screen end position
    {0x0045,      0,   0},  // 2th Screen start position
    {0x0046, 0xEF00,   0},  // window addr set for x0,x1 (0, 239)
    {0x0047, 0x013F,   0},  // window addr set for y0    (319)
    {0x0048, 0x0000,   20}, // window addr set for y1    (0)
    
    {0x0030, 0x0404,   0},  // Gamma control1
    {0x0031, 0x0006,   0},  // Gamma control2
    {0x0032, 0x0000,   0},  // Gamma control3
    {0x0033, 0x0202,   0},  // Gamma control4
    {0x0034, 0x0707,   0},  // Gamma control5
    {0x0035, 0x0107,   0},  // Gamma control6
    {0x0036, 0x0303,   0},  // Gamma control7
    {0x0037, 0x0202,   0},  // Gamma control8
    {0x0038, 0x1100,   0},  // Gamma control9
    {0x0039, 0x1100,   0},  // Gamma control10
    
    // 打开显示
    {0x0007, 0x0015,  40},  // Display control (GON=1, open disp)
    {0x0007, 0x0017,  40},
    {0x0020, 0x0000,   0},  // set GRAM addr(AD7--0)
    {0x0021, 0x0000,  20},  // set GRAM addr(AD16--8)
    
    {DATA_END,    0,  0}
};



/*******************************************************
* 名称: TftInit
* 功能: 初始化TFT液晶模块。
* 入口参数: 无
* 出口参数: 无
*******************************************************/
void  TftInit(void)  
{   STCOM_INI  init_dat;
    int  i;
   
    TftReset();
    for(i=0; i<100; i++)		// 设定最多100条初始化命令
    {   init_dat = TFT4267_INI[i];
        if(init_dat.com==DATA_END) break;
      
        TftSendCom(init_dat.com);
        TftSendDat(init_dat.dat);            
        DelaymS(init_dat.dly);      
    }
}


/*******************************************************
* 名称: TFT_UpdateRects
* 功能: 更新LCM显示区域。更新数据在Framebuffer中。
* 入口参数: x,y  		更新区域的起始点
*			w,y			区域宽度和高度
*           buffer      Framebuffer起始地址
* 出口参数: 无
*******************************************************/
void  TFT_UpdateRects( int x,  int y, 		    // 起始点坐标
    	               int w,  int h, 		    // 区域宽度、高度
    	               uint16  *buffer)	  		// Framebuffer起始地址 
{	int  i, j;
    uint16  *addr;

#if SWAP_XY_EN==1    
    int Xok, Yok;    
#endif    
    
    // 需填充区域参数过滤
    if(x<0)
    {   w = w + x;
        x = 0;
    }
    if(y<0)
    {   h = h + y;
        y = 0;
    }
    
#if SWAP_XY_EN==1  
    if( x > (GUI_LCM_YMAX-1) ||
        y > (GUI_LCM_XMAX-1)
       ) 
    {   return;
    }
  
    if((x+w) > (GUI_LCM_YMAX-1))
    {   w = GUI_LCM_YMAX - x;
    }
    if((y+h) > (GUI_LCM_XMAX-1))
    {   h = GUI_LCM_XMAX - y;
    }    
#else  
    if( x > (GUI_LCM_XMAX-1) ||
        y > (GUI_LCM_YMAX-1)
       ) 
    {   return;
    }
      
    if((x+w) > (GUI_LCM_XMAX-1))
    {   w = GUI_LCM_XMAX - x;
    }
    if((y+h) > (GUI_LCM_YMAX-1))
    {   h = GUI_LCM_YMAX - y;
    }        
#endif 

    if((w<=0) || (h<=0)) return;         
    
/* 
若需要交换x、y轴,则Yok = x, Xok = GUI_LCM_XMAX - y-1。
则填充矩形算法为:
    起点为(GUI_LCM_XMAX - y - h, x);
    每一行数据个数为h个字节,共w行数据;                     
    行数据起始点地址:addr = buffer + ((y + h - 1)*GUI_LCM_YMAX + x) + i (第i行,n为0--w)。
    同一行中,下一点数据地址变化:addr = addr - GUI_LCM_YMAX;
    以上所说的"行"、Xok和Yok,是针对液晶屏的。
*/
#if SWAP_XY_EN==1

    Xok = (int)GUI_LCM_XMAX - (y + h);    
    Yok = x;
    for(i=0; i<w; i++)	    // 输出w行数据
    {   // 计算出更新区域的buffer地址
        addr = buffer + ((y + h - 1)*GUI_LCM_YMAX + x) + i;
        
        // 输出一行(w个)数据    
        TftSetWrite(Xok, Yok);
        for(j=0; j<h; j++)
        {   TftSendDat(*addr);
            addr = addr - GUI_LCM_YMAX;
        }
        
        // 指向下一行
        Yok++;
    }    

#else

    for(i=0; i<h; i++)			// 输出h行数据
    {  // 计算出更新区域的buffer地址
       addr = buffer + (y*GUI_LCM_XMAX + x);
       
       // 输出一行(w)数据    
       TftSetWrite(x, y);
       for(j=0; j<w; j++)
       {  TftSendDat(*addr);
          addr++;
       }
       
       // 指向下一行
       y++;
    }
    
#endif
    
}
















⌨️ 快捷键说明

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