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

📄 lcmdriver.c

📁 S3C44B0X LCD(320*240)驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		else		   					// dy<0
		{
			dy=-dy;   					// dy=abs(dy)

			if(dx>=dy) 					// 8/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						// 7/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;
				}
			}
		}	
	}
	else 								//dx<0
	{
		dx=-dx;							//dx=abs(dx)
		if(dy >= 0) 					// dy>=0
		{
			if(dx>=dy) 					// 4/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						// 3/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;
				}
			}
		}
		else		   					// dy<0
		{
			dy=-dy;   					// dy=abs(dy)

			if(dx>=dy) 					// 5/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						// 6/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;
				}
			}
		}	
	}
}

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

/****************************************************************************
* 名称:GUI_RLine()
* 功能:画垂直线。
* 入口参数: x0		垂直线起点所在列的位置
*           y0		垂直线起点所在行的位置
*           y1      垂直线终点所在行的位置
*           color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void  GUI_RLine(uint32 x0, uint32 y0, uint32 y1, uint8 color)
{
	LCD_Line(x0,y0,x0,y1,color);
}

void GUI_CopyColor(TCOLOR *color1,TCOLOR color2)
{
	*color1=color2;
	return;
}

int GUI_CmpColor(TCOLOR color1, TCOLOR color2)
{
	if(color1==color2) return 1;
	else return 0;
}

/**************************************************************************
** 函数名称: SetCursor
** 功能描述: 指定光标位置
**
** 输 入: x , y 光标位置 (x范围40 y的范围240)
**
** 输 出: 无
**         
** 全局变量: LcmCursor_x , LcmCursor_y 光标位置
** 调用模块: 无
**
** 作 者: 欧阳鹏
** 日 期: 2007年10月10日
**-------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------
**************************************************************************/
void SetCursor(uint16 x, uint16 y)
{
   LcmCursor_x = x;
   LcmCursor_y = y;
}


/**********************************************************
 *
 *		函数名:	void PutChar(char *pchar)
 *		功	能:	输出单个字符
 *      说  明:
 *		设计人:欧阳鹏
 *	  设计时间:2007-5-9
 *	  入口参数:无
 *	  出口参数:无
***********************************************************/

void PutChar(char *pchar)
{			
    uint16 addr;
    uint16 temp;
    uint32 Word_qm;
    uint8 	*pDisp;
	uint8   *p;	
    uint8  chardata;
    uint8  i,k=0;
    uint8  Out_cnt=0;						//按选择的字库不同进行输出标志,区分汉字库和字符库
    char   c;
    temp=*pchar;
	c=*pchar;
    
    if(bLcd_data == 0)    				//汉字判断
    {
        if(temp >= 0xa1)   				//是汉字
        {
            bLcd_data=temp;
            Out_cnt=0;
        }
        else           					//不是汉字
        {
            if(temp == 0x0a)     		//是否换行符
            {
                LcmCursor_x=0;
                LcmCursor_y++;				//光标切换到下一行
                Out_cnt=0;        		//不输出标志
            }
            else                        //不是换行符
            {
            	
				if (LcmCursor_x>39)       	//如果到了行尾,换行
        		{
            		LcmCursor_x=0;
            		LcmCursor_y++;
        		}
 
                Out_cnt=1;              /*输出一次标志*/
                if(bHeight==16) 		//字母或数字所在位置,处于0x8000~0xBFFF    
                	p = (ZKaddr + 0x8000 +(temp << 4));     /*8*16字库指针*/
                else               
                	p = (ZKaddr + 0x9000 +(temp << 3));     /*8*8字库指针*/
            }
        }
    }

    else        						//显示汉字
    {
		/*计算汉字所在位置*/		
        Word_qm = bLcd_data-0xa1;       //取得区码
        chardata = temp-0xa1;       	//取得位码
        Word_qm = (Word_qm*94+chardata);//得到汉字在汉字库的序列
        p=(Word_qm<<5) + ZKaddr; 		//得到指针
        Out_cnt=2;                      //输出两次标志
    }


    for(k=0;k<Out_cnt;k++)				//汉字库分左右两半进行输出
    {
        addr=(uint16)LcmCursor_y*SCR_LINE*bHeight+LcmCursor_x;
        if(gv_f2ndScreen==0)
		{
			pDisp=(uint8 *)LCD_ACTIVE_BUF1+addr;
		}
		else 
		{
			pDisp=(uint8 *)LCD_ACTIVE_BUF2+addr;
		}
        for(i=0;i<bHeight;i++)
        {
            chardata=*p;
            if (fReverse) chardata=~chardata;
             p+=Out_cnt;				//显示方式为从左到右
            if((i>13) && fUnderline)
            {
            	chardata=0xff;
            }
            *pDisp=chardata;
            pDisp+=SCR_LINE;			//指向下一行
        }

        LcmCursor_x++;
        p-=31;							//用于16x16汉字库中选中奇数倍的字节,即显示字符的右半面
     }

    if (Out_cnt==2)  bLcd_data=0;		//清零,显示下一个字符
    if(LcmCursor_x>=40)
    {
        LcmCursor_x=0;
        LcmCursor_y++;
    }
}

/**********************************************************
 *
 *		函数名:	void Putstr(char *pstr)
 *		功	能:	
 *      说  明:
 *		设计人:欧阳鹏
 *	  设计时间:2007-5-8
 *	  入口参数:无
 *	  出口参数:无
***********************************************************/
void Puts(char *pstr)
{
  	while(*pstr)
  	{
  		//if((fFormat==1) && ((*pstr<0x20)||(*pstr>0xfe))) 
  			//*pstr=0x2e;					//解决浮点数不能格式化输出的问题
        PutChar(pstr);
        pstr++;     	
  	}
  	//fFormat=0;
}

/**********************************************************
 *
 *		函数名:	void Printf(char *fmt,...) 
 *		功	能:	格式化输出字符串
 *      说  明:
 *		设计人:欧阳鹏
 *	  设计时间:2007-5-9
 *	  入口参数:无
 *	  出口参数:无
***********************************************************/
void Printf(char *fmt,...) 
{
	
  	va_list ap;
	char string[256];		// 輸出字串的緩衝區,小心不要超過
	
	va_start(ap,fmt);
	vsprintf(string,fmt,ap);
	Puts(string);
	va_end(ap);
}

/**************************************************************************
** 函数名称: GUI_Point
** 功能描述: 描点   坐标原点为屏幕左上角
**
** 输 入: i    i=0;字体正向显示    =1 字体反向显示 
**
** 输 出: 无
**         
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 欧阳鹏
** 日 期: 2007年10月10日
**-------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------
**************************************************************************/
void CharReverse (uint8 i)
{  
   fReverse = i;
   if(i>1) fReverse = 1;           
}

void CharUnderline(uint8 i)
{
   fUnderline = i;
   if(i>1) fUnderline = 1;
}



⌨️ 快捷键说明

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