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

📄 lcmdriver.c

📁 S3C44B0X LCD(320*240)驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "includes.h"
/*全局变量定义*/
uint16 LcmOrigin_x , LcmOrigin_y;
uint16 LcmCursor_x , LcmCursor_y;  //光标位置

uint8  bLcd_data,bHeight=16,gv_f2ndScreen=0,fReverse=0,fUnderline=0,fFormat,fmodeX=0,fmodeY=0;
//bLcd_data:记录汉字的区位码缓冲  bHeight:记录字体的高度 f2ndSreen:切换显示屏标志  fReverse:字体反向显示标志 fUnderline 字体加下划线标志
uint8 gv_linemode=0;


void SetFont(uint8 font)    //设置字体高度
{
	bHeight=font;
}
/**************************************************************************
** 函数名称: ClearLcm
** 功能描述: 清屏
**
** 输 入: 无
**
** 输 出: 无
**         
** 全局变量: gv_f2ndScreen : 换屏标志
** 调用模块: 无
**
** 作 者: 欧阳鹏
** 日 期: 2007年10月09日
**-------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------
**************************************************************************/
void ClearLcm(void)
{
  uint16 loop;
  unsigned char *pChar;
  if(gv_f2ndScreen == 0)
  {                     
  		pChar = (unsigned char*)LCD_ACTIVE_BUF1;   //指向图形缓冲区1
   		for(loop=0;loop<9600;loop++) 
   		{
   			*pChar=0x00;
   			pChar++;
   		}
  }
  else
     {
        pChar = (unsigned char*)LCD_ACTIVE_BUF2;   //指向图形缓冲区2
   		for(loop=0;loop<9600;loop++)
   		{
   			*pChar=0x00;
   			pChar++;
   		} 
  }
    LcmCursor_x=0;
    LcmCursor_y=0;
 }    

/**************************************************************************
** 函数名称: LcmInit
** 功能描述: 初始化液晶控制器
**
** 输 入: 无
**
** 输 出: 无
**         
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 欧阳鹏
** 日 期: 2007年10月09日
**-------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------
**************************************************************************/
void LCD_Initialize(void)
{
	rPCOND=0xaaaa;						//端口D配置成LCD控制引脚
	//rPUPD=0x0;
	//rPDATD=0xff;
		
	rDITHMODE=0x12210;					//抖动模式设定
	rDP1_2=0xa5a5;						//以下为抖动时间设置
	rDP4_7=0xba5da65;
	rDP3_5=0xa5a5f;
	rDP2_3=0xd6b;
	rDP5_7=0xeb7b5ed;
	rDP3_4=0x7dbe;
	rDP4_5=0x7ebdf;
	rDP6_7=0x7fdfbfe;
    ClearLcm();
    SwitchLcm(1);
    ClearLcm();
    SwitchLcm(0);
    rLCDCON1=(ENVID_DIS)|(INVVD<<0)|(INVFRAME<<2)|(INVLINE<<3)|(INVCLK<<4)|(DISMODE<<5)|(MMODE<<7)|(WDLY<<8)|(WLH<<10)|(CLKVAL<<12);
    rLCDCON2=(LINEVAL)|(HOZVAL<<10)|(LINEBLANK<<21);
    rLCDSADDR1= (MODESEL<<27)|((LCD_ACTIVE_BUF1>>22)<<21)|M5D(LCD_ACTIVE_BUF1>>1);
    rLCDSADDR2= (BSWP<<29) |M5D(((LCD_ACTIVE_BUF1 + ((LCD_XSIZE*LCD_YSIZE)/8))>>1))|(MVAL<<21);
    rLCDSADDR3= (LCD_XSIZE/4) | ( 0<<9 ); 
    rLCDCON1=(ENVID_EN)|(INVVD<<0)|(INVFRAME<<2)|(INVLINE<<3)|(INVCLK<<4)|(DISMODE<<5)|(MMODE<<7)|(WDLY<<8)|(WLH<<10)|(CLKVAL<<12);
   
}

uint8 GetLcmNum(void)
{
	if(gv_f2ndScreen) return 1;
	else return 0;
}

void SelectScreen(uint8 i)
{
	if(i==0) gv_f2ndScreen=0;
	else gv_f2ndScreen=1;
}
/**********************************************************
 *
 *		函数名:	void SwitchLcd(U8 LCD_Section)
 *		功	能:	切换显示屏
 *      说  明:
 *		设计人:欧阳鹏
 *	  设计时间:2006-05-14
 *	  入口参数:显示屏区域的选择
 *	  出口参数:无
***********************************************************/
void SwitchLcm(uint8 Section)       	//切换显示屏
{
	rLCDCON1=(ENVID_DIS)|(INVVD<<0)|(INVFRAME<<2)|(INVLINE<<3)|(INVCLK<<4)|(DISMODE<<5)|(MMODE<<7)|(WDLY<<8)|(WLH<<10)|(CLKVAL<<12);	
	rLCDCON2=(LINEVAL)|(HOZVAL<<10)|(LINEBLANK<<21);	//lcd屏的尺寸为320x240 
    //CloseInterrupt();					//为防止中断对LINECNT的影响,禁止中断
    if (Section==0)
    {
    	gv_f2ndScreen=0;
        rLCDSADDR1= (MODESEL<<27)|((LCD_ACTIVE_BUF1>>22)<<21)|M5D(LCD_ACTIVE_BUF1>>1);
		rLCDSADDR2= (BSWP<<29) |M5D(((LCD_ACTIVE_BUF1+((LCD_XSIZE*LCD_YSIZE)/8))>>1))|(MVAL<<21);
    }
    else
    {      	
        gv_f2ndScreen=1;
    	rLCDSADDR1= (MODESEL<<27)|((LCD_ACTIVE_BUF2>>22)<<21)|M5D(LCD_ACTIVE_BUF2>>1);
		rLCDSADDR2= (BSWP<<29) |M5D(((LCD_ACTIVE_BUF2 + ((LCD_XSIZE*LCD_YSIZE)/8))>>1))|(MVAL<<21);
    }
     rLCDCON1=(ENVID_EN)|(INVVD<<0)|(INVFRAME<<2)|(INVLINE<<3)|(INVCLK<<4)|(DISMODE<<5)|(MMODE<<7)|(WDLY<<8)|(WLH<<10)|(CLKVAL<<12);
    //OpenInterrupt();
}  

/**************************************************************************
** 函数名称: GUI_Point
** 功能描述: 设置相对屏幕的零点
**
** 输 入: int16 x,int16 y 点位置
**
** 输 出: 无
**         
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 欧阳鹏
** 日 期: 2007年10月10日
**-------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------
**************************************************************************/
void SetLcmOrigin(uint16 x, uint16 y)
{
	LcmOrigin_x = x;
	LcmOrigin_y = y;
}

void SetCordinateMode(uint8 xmode,uint8 ymode)
{
	fmodeX=xmode;
	fmodeY=ymode;
}
/****************************************************************************
*                    与LCM相关的GUI接口函数
****************************************************************************/


/****************************************************************************
* 名称:GUI_FillSCR()
* 功能:全屏填充。直接使用数据填充显示缓冲区。
* 入口参数:dat		填充的数据(对于黑白色LCM,为0的点灭,为1的点显示)
* 出口参数:无
****************************************************************************/
void  GUI_FillSCR(uint8 dat)
{ 	
	uint32 loop;
	unsigned char *pChar;
  	if(gv_f2ndScreen == 0)
  	{                     
  		pChar = (unsigned char*)LCD_ACTIVE_BUF1;   //指向图形缓冲区1
   		for(loop=0;loop<9600;loop++) 
   		{
   			*pChar=dat;
   			pChar++;
   		}
  	}
  	else
  	{
        pChar = (unsigned char*)LCD_ACTIVE_BUF2;   //指向图形缓冲区2
   		for(loop=0;loop<9600;loop++) *pChar++=dat;
  	}
  	//LcmCursor_x=0;
   // LcmCursor_y=0;
}

/****************************************************************************
* 名称:GUI_Initialize()
* 功能:初始化GUI,包括初始化显示缓冲区,初始化LCM并清屏。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  GUI_Initialize(void)
{  
	LCD_Initialize();					// 初始化LCM模块工作模式,纯图形模式
	GUI_FillSCR(0x00);					// 初始化缓冲区为0x00,并输出屏幕(清屏)
} 

/****************************************************************************
* 名称:GUI_ClearSCR()
* 功能:清屏。
* 入口参数:无
* 出口参数:无
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
void GUI_ClearSCR(void)
{  
	GUI_FillSCR(0x00);
}

/**************************************************************************
** 函数名称: GUI_Point
** 功能描述: 描点   坐标原点为屏幕左上角
**
** 输 入: int16 x,int16 y 点位置
**
** 输 出: 无
**         
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 欧阳鹏
** 日 期: 2007年10月10日
**-------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------
**************************************************************************/
/* 定义十进制(0-7)==>十六进制位转换表,由于显示点数据是由左到右,所以十六进制位顺序是倒的 */
uint8 const  DCB2HEX_TAB[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
uint8  GUI_Point(uint32 x, uint32 y, TCOLOR color)
{
	uint32 addr;             //要送数据的地址
	uint8  point_dat,orig_point;        //显示数据
	uint8  *pDisp;
	
	if(fmodeX==1) x=-x;   //x的正方向确定 如果fmodeX=0 正方向朝右 如果fmodeX=1 正方向朝左
	if(fmodeY==1) y=-y;   //y的正方向确定 如果fmodeY=0 正方向朝下 如果fmodeY=1 正方向朝上
	x = x + LcmOrigin_x;  //由相对坐标x得到 实际的坐标x
	y = y + LcmOrigin_y;  //由相对坐标y得到 实际的坐标y
		
	if(gv_f2ndScreen == 0)
	{
	 	pDisp = (uint8 *) LCD_ACTIVE_BUF1;  
	}
    else
    {
    	pDisp = (uint8 *) LCD_ACTIVE_BUF2;
    }
    addr = (x)/8+y*SCR_LINE;
    point_dat=*(pDisp+addr);
    orig_point=point_dat;
	
	if((color&0x1)!=0) 
	{
		if(gv_linemode==0)
		{
			point_dat =(uint8)(0x80 >> ((uint16)x%8));	//显示的实际数据,将点位置转换成字节数据
			point_dat =~(point_dat ^ (~orig_point));
		}
		else
		point_dat=point_dat | DCB2HEX_TAB[x&0x7];		
	}
	else point_dat=point_dat &(~DCB2HEX_TAB[x&0x7]);	
	*(pDisp+addr)=point_dat;
	return 1;
}


/****************************************************************************
* 名称:GUI_Line()
* 功能:画水平线。
* 入口参数: x0		水平线起点所在列的位置
*           y0		水平线起点所在行的位置
*           x1      水平线终点所在列的位置
*           color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void  LCD_Line(int startx,int starty,int endx,int endy, TCOLOR color)
{
  	int dx,dy,e;

   	dx=endx-startx; 
	dy=endy-starty;
    
	if(dx>=0)
	{
		if(dy >= 0) 					// dy>=0
		{
			if(dx>=dy) 					// 1/8 octant
			{
				e=dy-dx/2;
				while(startx<=endx)
				{
					GUI_Point(startx,starty,color);
					if(e>0){starty+=1;e-=dx;}	
					startx+=1;
					e+=dy;
				}
			}
			else						// 2/8 octant
			{
				e=dx-dy/2;
				while(starty<=endy)
				{
					GUI_Point(startx,starty,color);
					if(e>0){startx+=1;e-=dy;}	
					starty+=1;
					e+=dx;
				}
			}
		}

⌨️ 快捷键说明

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