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

📄 olcd.h

📁 mzl05液晶模块的ARM驱动程序
💻 H
字号:

/***************************************************************************
* 文件名: OLCD.h
* 作  者: 彭章君
* 日  期: 2008/08/09
* 描  述: OLCD驱动程序头文件
* 版  本:V1.0 
***************************************************************************/
#include "LCD_Config.h"
#include "Font.h"

#define LCD_CS     (0x01<<20)
#define LCD_RES    (0x01<<19)
#define LCD_A0     (0x01<<18)
#define LCD_CLK    (0x01<<17)
#define LCD_SDI    (0x01<<16)

#define LCD_CS_SET    (IO0SET|=LCD_CS)
#define LCD_CS_CLR    (IO0CLR|=LCD_CS)

#define LCD_RES_SET    (IO0SET|=LCD_RES)
#define LCD_RES_CLR    (IO0CLR|=LCD_RES)

#define LCD_A0_SET    (IO0SET|=LCD_A0)
#define LCD_A0_CLR    (IO0CLR|=LCD_A0)

#define LCD_CLK_SET    (IO0SET|=LCD_CLK)
#define LCD_CLK_CLR    (IO0CLR|=LCD_CLK)

#define LCD_SDI_SET    (IO0SET|=LCD_SDI)
#define LCD_SDI_CLR    (IO0CLR|=LCD_SDI)

void LCD_DataWrite(uint8 Data);
void LCD_RegWrite(uint8 Command);
void LCD_Fill(uint8 a);
void Port_Int(void);
void SetRamAddr (uint8 Page, uint8 Col);
void LoadICO(void);
void ClearScreen(void);
void LCD_Init(void);
void Printn(uint8 xx ,uint8 yy , uint32 no,uint8 yn,uint8 le);
void Printn8(uint8 xx ,uint8 yy , uint32 no,uint8 yn,uint8 le);
void Print6(uint8 xx, uint8 yy, uint8 ch1[], uint8 yn);	
void Print8(uint16 y,uint16 x, uint8 ch[],uint8 yn);
void Print16(uint8 y,uint8 x,uint8 ch[],uint8 yn);
void Print(uint8 y, uint8 x, uint8 ch[], uint8 yn);
void Rectangle(uint8 x1,uint8 y1,uint8 x2,uint8 y2);
void TimeDelay(uint8 Time);

/***************************************************************************
* 函数: void LCD_Init(void)
* 描述:延时程序 
* 参数: 无 
* 返回: 无
***************************************************************************/


void TimeDelay(uint8 Time)
{
	uint32 i;
	while(Time > 0)
	{
		for(i = 0;i < 800;i++);
		Time --;
	}
}

/***************************************************************************
* 函数: void LCD_DataWrite(uint8 Data)
* 描述: 写一个字节的显示数据至LCD中的显示缓冲RAM当中
* 参数: Data 写入的数据 
* 返回: 无
* 备注: 无
***************************************************************************/
void LCD_DataWrite(uint8 Dat)
{
	unsigned char Num;
	LCD_CS_CLR;
	LCD_A0_SET;
	for(Num=0;Num<8;Num++)
	{
		if((Dat&0x80) == 0)	LCD_SDI_CLR;
		else LCD_SDI_SET ;
		Dat = Dat << 1;
		LCD_CLK_CLR;
		LCD_CLK_SET;
	}
	LCD_CS_SET;
}

void Port_Int(void)
{
	PINSEL1 = 0x00000000;
	IO0DIR = 0xFFFFFFFF;
}



/***************************************************************************
* 函数: void LCD_RegWrite(uint8 Command)
* 描述: 写一个字节的数据至LCD中的控制寄存器当中
* 参数: Command		写入的数据,低八位有效(byte) 
* 返回: 无
***************************************************************************/
void LCD_RegWrite(uint8 Command)
{
	unsigned char Num;
	LCD_CS_CLR;
	LCD_A0_CLR;
	for(Num=0;Num<8;Num++)
	{
		if((Command&0x80) == 0)	LCD_SDI_CLR;
		else LCD_SDI_SET ;
		Command = Command << 1;
		LCD_CLK_CLR;
		LCD_CLK_SET;
	}
	LCD_CS_SET;
}

/*******************************************************************************
*函数名:void SetRamAddr (uint8 Page, uint8 Col)
*功能:lcd位置选择
*输入:Page-页,Col-列
*输出:无
********************************************************************************/
void SetRamAddr (uint8 Page, uint8 Col)
{
	LCD_RegWrite(0xB0 + Page);
	LCD_RegWrite(Col & 0x0f); //Set lower column address
	LCD_RegWrite(0x10 | ((Col & 0xf0) >> 4)); //Set higher column address
}

/*******************************************************************************
*函数名:void LoadICO(uint8 y , uint8 x , uint8 Ico[])
*功能:打开一个指定指针的图标
*输入:x,y坐标      Ico[]图片
*输出:无
********************************************************************************/
void LoadICO(void)
{

	uint8 i,j;
        for(i=0; i<8; i++)
        {
                SetRamAddr(i , 0);
	        for(j = 0;j < 112;j++)
	        {
		        LCD_DataWrite(WXL112X64[j+i*112]);
	        }
        }
}

/*******************************************************************************
*函数名:void ClearScreen(void)
*功能:清屏
*输入:无
*输出:无
********************************************************************************/
void ClearScreen(void)
{
	uint8 i , j;
	
	for (i = 0 ; i < 8 ; i++)
	{
		SetRamAddr(i,0);
		for (j=0;j<132; j++) LCD_DataWrite(0x00);
	}
}

/*******************************************************************************
* 函数: void LCD_Fill(uint8 Data)
* 描述: 会屏填充以Data的数据至各点中
* 参数: Data   要填充的颜色数据
* 返回: 无 
*******************************************************************************/
void LCD_Fill(uint8 Data)
{
	uint8 i,j;
	uint8 uiTemp;
	uiTemp = Dis_Y_MAX;
	uiTemp = uiTemp>>3;
	for(i=0;i<=uiTemp;i++)								//往LCD中填充初始化的显示数据
	{
		LCD_RegWrite(0xb0+i);
		LCD_RegWrite(0x01);
		LCD_RegWrite(0x10);
		for(j=0;j<=Dis_X_MAX;j++)
		{
			LCD_DataWrite(Data);
		}
	}
}


void LCD_Init(void)
{
	
	Port_Int();
	TimeDelay(200);
	LCD_RES_CLR;
	TimeDelay(200);
	LCD_RES_SET;
	TimeDelay(20);
		
	LCD_RegWrite(M_LCD_ON);							//LCD On
	LCD_RegWrite(M_LCD_POWER_ALL);					//设置上电控制模式
	
	LCD_RegWrite(M_LCD_ELE_VOL);					//电量设置模式(显示亮度)
	LCD_RegWrite(0x1f);								//指令数据0x0000~0x003f
	
	LCD_RegWrite(M_LCD_VDD_SET);					//V5内部电压调节电阻设置
	LCD_RegWrite(M_LCD_VDD);						//LCD偏压设置,V3时选
	
	LCD_RegWrite(M_LCD_COM_REV);					//Com 扫描方式设置
	LCD_RegWrite(M_LCD_SEG_NOR);					//Segment方向选择
	LCD_RegWrite(M_LCD_ALL_LOW);					//全屏点亮/变暗指令
	LCD_RegWrite(M_LCD_ALL_NOR);					//正向反向显示控制指令
	
	LCD_RegWrite(M_LCD_STATIC_OFF);					//关闭静态指示器
	LCD_RegWrite(0x00);								//指令数据
	
	LCD_RegWrite(M_LCD_BEGIN_LINE);				//设置显示起始行对应RAM
	LCD_Fill(LCD_INITIAL_COLOR);
}

/*******************************************************************************
*函数名:void Printn(uint8 xx ,uint8 yy , uint8 no,uint8 yn,uint8 le)
*功能:显示一个6*8无符号数据
*输入:xx , yy屏幕当中位置,no待显示数据 yn=0正常显示 yn=1反黑显示  le有效位
*输出:无
********************************************************************************/
void Printn(uint8 xx ,uint8 yy , uint32 no,uint8 yn,uint8 le)
{
	uint8 ch2[6];
	uint8 ii;

	for(ii = 1 ; ii <= le ;)
	{
		ch2[le - ii] = no % 10 + 0x30;
		no /= 10;
		ii += 1;
	}
	ch2[le] = '\0';
	Print6(xx ,yy ,ch2 ,yn);
}




/*******************************************************************************
*函数名:void Printn8(uint8 xx ,uint8 yy , uint8 no,uint8 yn,uint8 le)
*功能:显示8*8一个无符号数据
*输入:xx , yy屏幕当中位置,no待显示数据 yn=0正常显示 yn=1反黑显示  le有效位
*输出:无
********************************************************************************/
void Printn8(uint8 xx ,uint8 yy , uint32 no,uint8 yn,uint8 le)
{
	uint8 ch2[6];
	uint8 ii;

	for(ii = 1 ; ii <= le ;){
		ch2[le - ii] = no % 10 + 0x30;
		no /= 10;
		ii += 1;
	}
	ch2[le] = '\0';
	Print(xx ,yy ,ch2 ,yn);
}



/*******************************************************************************
*函数名:void Print6(uint8 xx, uint8 yy, uint8 ch1[], uint8 yn)
*功能:显示6*8字符串
*输入:xx ,yy 坐标,ch1待显示的字符串,yn是否反黑
*输出:无
********************************************************************************/
void Print6(uint8 xx, uint8 yy, uint8 ch[], uint8 yn)		
{
	uint8 ii = 0;
	uint8 bb = 0;
	uint32 index = 0 ;	

	SetRamAddr(xx , yy);		
	while(ch[bb] != '\0')
	{
                index = (uint32)(ch[bb] - 0x20);
		index = (uint32)index*6;		
		for(ii=0;ii<6;ii++)
		{
			if(yn)
			{
				LCD_DataWrite(FontSystem6x8[index]);
			}
			else
			{
				LCD_DataWrite(~FontSystem6x8[index]);
			}		
			index += 1;
		}		
		bb += 1;
	}
}


/*******************************************************************************
*函数名:void Print8(uint8 y,uint8 x, uint8 ch[],uint8 yn)
*功能:显示8*8字符串
*输入:xx ,yy 坐标,ch1待显示的字符串,yn是否反黑
*输出:无
********************************************************************************/
void Print8(uint16 y,uint16 x, uint8 ch[],uint8 yn)
{
	uint8 wm ,ii = 0;
	uint32 adder;

	while(ch[ii] != '\0')
	{
		adder = (ch[ii] - 0x20) * 16;

		SetRamAddr(y , x);
		for(wm = 0;wm < 8;wm++)
		{
			if(yn == 0)
			{
				LCD_DataWrite(~Font8X8[adder]);
			}
			else
			{
				LCD_DataWrite(Font8X8[adder]);
			}
			adder += 1;
		}
		SetRamAddr(y + 1 , x);
		for(wm = 0;wm < 8;wm++)
		{
			if(yn == 0)
			{
				LCD_DataWrite(~Font8X8[adder]);	
			}
			else
			{
				LCD_DataWrite(Font8X8[adder]);	
			}
			adder += 1;
		}
		ii += 1;
		x += 8;
	}

}


/*******************************************************************************
*函数名:void Print16(uint8 y,uint8 x,uint8 ch[],uint8 yn)
*功能:在屏幕上显示汉字
*输入:x ,y 坐标,ch[]待显示的汉字,yn是否反黑
*输出:无
********************************************************************************/
void Print16(uint8 y,uint8 x,uint8 ch[],uint8 yn)
{
	uint8 wm ,ii = 0;
	uint32 adder;

	wm = 0;
	adder = 1;
	while(FontNew8X16_Index[wm] > 100)
	{
		if(FontNew8X16_Index[wm] == ch[ii])
		{
			if(FontNew8X16_Index[wm + 1] == ch[ii + 1])
			{
				adder = wm * 14;
				break;
			}
		}
		wm += 2;				//找到汉字在索引中的位置
	}
	SetRamAddr(y , x);

	if(adder != 1)					//找到汉字,显示出来	
	{
		SetRamAddr(y , x);
		for(wm = 0;wm < 14;wm++)
		{
			if(yn == 0)
			{
				LCD_DataWrite(~FontNew16X16[adder]);
			}
			else
			{
				LCD_DataWrite(FontNew16X16[adder]);
			}
			adder += 1;
		}
                for(wm = 0;wm < 2;wm++)
		{
			if(yn == 0)
			{
				LCD_DataWrite(0xff);
			}
			else
			{
				LCD_DataWrite(0x00);
			}
		}
		SetRamAddr(y + 1 , x);

		for(wm = 0;wm < 14;wm++)
		{
			if(yn == 0)
			{
				LCD_DataWrite(~FontNew16X16[adder]);
			}
			else
			{
				LCD_DataWrite(FontNew16X16[adder]);
			}
			adder += 1;
		}
                for(wm = 0;wm < 2;wm++)
		{
			if(yn == 0)
			{
				LCD_DataWrite(0xff);
			}
			else
			{
				LCD_DataWrite(0x00);
			}
		}


	}
	else						//找不到字显示空格			
	{
		ii += 1;SetRamAddr(y , x);
		for(wm = 0;wm < 16;wm++)
		{
			if(yn == 0)
			{
				LCD_DataWrite(0xff);
			}
			else
			{
				LCD_DataWrite(0x00);
			}
		}
		SetRamAddr(y + 1 , x);
		for(wm = 0;wm < 16;wm++)
		{
			if(yn == 0)
			{
				LCD_DataWrite(0xff);
			}
			else
			{
				LCD_DataWrite(0x00);
			}
		}
	}
}
/*******************************************************************************
*函数名:void Print(uint8 y, uint8 x, uint8 ch[], uint8 yn)
*功能:实现汉字及字母混合显示
*输入:x ,y 坐标,ch[]待显示的汉字或字母,yn是否反黑
*输出:无
********************************************************************************/
void Print(uint8 y, uint8 x, uint8 ch[], uint8 yn)
{
	uint8 ch2[3];
	uint8 ii;
        ii = 0;
	while(ch[ii] != '\0')
	{
		if(ch[ii] > 120)
		{
			ch2[0] = ch[ii];
	 		ch2[1] = ch[ii + 1];
			ch2[2] = '\0';			//汉字为两个字节
			Print16(y , x , ch2 , yn);	//显示汉字
			x += 16;
			ii += 2;
		}
		else
		{
			ch2[0] = ch[ii];	
			ch2[1] = '\0';			//字母占一个字节
			Print8(y , x , ch2 , yn);	//显示字母
			x += 8;
			ii += 1;
		}
	}
}

/*******************************************************************************
*函数名:void ClearCol(uint8 Begin , uint8 End)
*功能:清除列
*输入:Begin开始处   End结束处
*输出:无
********************************************************************************
void ClearCol(INT8U Begin , INT8U End)
{
	INT8U i;
	for(i=Begin;i <= End ; i++)
	{
		Print6(Begin , 0 ,"                   ", 1);
	}
}*/

/*******************************************************************************
*函数名:void Rectangle(uint8 x1,uint8 y1,uint8 x2,uint8 y2)
*功能:画直线函数,本函数目前只能画水平和垂直线
*输入:x1,y1(第一个点)   x2,y2第二个点
*输出:无
********************************************************************************/
void Rectangle(uint8 x1,uint8 y1,uint8 x2,uint8 y2)
{

	uint8 ii;

	for(ii=x1; ii<x2; ii++)
	{		
		SetRamAddr(y1,ii);
		LCD_DataWrite(0x08);
		SetRamAddr(y2,ii);
		LCD_DataWrite(0x08);		//画横线
	}
	SetRamAddr(y1,x1);
	LCD_DataWrite(0xF0);
	SetRamAddr(y1,x2);
	LCD_DataWrite(0xF0);

	for(ii = y1+1;ii<y2;ii++)
	{		
	 	SetRamAddr(ii,x1);
		LCD_DataWrite(0xff);
	 	SetRamAddr(ii,x2);
		LCD_DataWrite(0xff);		//画竖线
	}

	SetRamAddr(y2,x1);
	LCD_DataWrite(0x0F);
	SetRamAddr(y2,x2);
	LCD_DataWrite(0x0F);
}


⌨️ 快捷键说明

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