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

📄 mzlh12864.c

📁 本源程序是北京铭正同创公司的LCD显示器MzLH01-12864模组的驱动程序
💻 C
字号:
#include "Mzlh12864.H"
 
unsigned char X_Witch=6;
unsigned char Y_Witch=10;
unsigned char X_Witch_cn=16;
unsigned char Y_Witch_cn=16;
unsigned char Dis_Zero=0;

/**
 * Initial MzLH12864
 * @no params
 * @no returns
 
#define initLCD() {\
                    DATA |= 0B00000111;\
                    CTL  |= 0B00000100;\
                    CTL  &= 0B11111101;\
                    SS = 1;\
                    SDA = 1;\
                    SCK = 1;\
                    RST2 = 0;\
                    delay_ms(10);\
                    RST2 = 1;\
                    delay_ms(10);\
                   }  
void initLCD()
{
    DATA |= 0B00000111;
    CTL  |= 0B00000100;
    CTL  &= 0B11111101;
    SS = 1;
    SDA = 1;
    SCK = 1;
    RST2 = 0;
    delay_ms(10);
    RST2 = 1;\
    delay_ms(10);
}*/ 
  
/*========================================================================
// 函数: void setSS(unsigned char status)
// 描述: 置SS线状态
// 参数: status   =1则置高电平,=0则置低电平  
// 返回: 无
// 版本:
//      2008/06/19      First version
//		2008/06/19		V1.0 for AVR CVAVR
//========================================================================*/ 
void setSS(unsigned char status)
{
    while(BS == 1);    //如Busy为高电平,则循环等待
    delay_ms(1);
    if(status)  SS = 1;
    else SS = 0;
} 

/*========================================================================
// 函数: void sendData(unsigned char data)
// 描述: 通过串行SPI口输送一个byte的数据置模组
// 参数: data 要传送的数据 
// 返回: 无
// 版本:
//      2008/06/19      First version
//		2008/06/19		V1.0 for AVR CVAVR
//========================================================================*/ 
void sendData(unsigned char data)
{
    unsigned char i;
    
    while(BS == 1); //wait if LCD is busy
    
    for(i=0; i<8; i++)
    {
        SCK = 0;   //SCK -- low
        if(data&0x80)   SDA = 1;
        else SDA = 0;
        data <<= 1;
        delay_ms(1);
        SCK = 1;  //SCK -- High
        delay_ms(1);
     }
}               

/*========================================================================
// 函数: void fontSet(unsigned char Font_NUM,unsigned char Color)
// 描述: ASCII字符字体设置
// 参数: Font_NUM 字体选择,以驱动所带的字库为准
//		 Color  文本颜色,仅作用于ASCII字库  
// 返回: 无
// 备注: 
// 版本:
//      2008/06/19      First version
//========================================================================*/
void fontSet(unsigned char Font_NUM,unsigned char Color)
{
	unsigned char ucTemp=0;
	if(Font_NUM)
	{
		X_Witch = 6;
		Y_Witch = 10;
	}
	else
	{
		X_Witch = 8;
		Y_Witch = 16;
	}
	ucTemp = (Font_NUM<<4)|Color;
	//设置ASCII字符的字型
	setSS(0);					//SS置低电平			
	sendData(0x81);					//传送指令0x81
	sendData(ucTemp);				//选择8X16的ASCII字体,字符色为黑色
	setSS(1);					//完成操作置SS高电平	
}  

//========================================================================
// 函数: void fontSet_cn(unsigned char Font_NUM,unsigned char Color)
// 描述: 汉字库字符字体设置
// 参数: Font_NUM 字体选择,以驱动所带的字库为准
//		 Color  文本颜色,仅作用于汉字库  
// 返回: 无
// 备注: 
// 版本:
//      2008/06/19      First version
//========================================================================
void fontSet_cn(unsigned char Font_NUM,unsigned char Color)
{
	unsigned char ucTemp=0;
	if(Font_NUM)
	{
		X_Witch_cn = 12;
		Y_Witch_cn = 12;
	}
	else
	{
		X_Witch_cn = 16;
		Y_Witch_cn = 16;
	}
	ucTemp = (Font_NUM<<4)|Color;
	//设置ASCII字符的字型
	setSS(0);					//SS置低电平			
	sendData(0x82);					//传送指令0x81
	sendData(ucTemp);				//选择8X16的ASCII字体,字符色为黑色
	setSS(1);					//完成操作置SS高电平	
}    

//========================================================================
// 函数: void showChar(unsigned char x,unsigned char y,unsigned char a) 
// 描述: 写入一个标准ASCII字符
// 参数: x  X轴坐标     y  Y轴坐标
//		 a  要显示的字符在字库中的偏移量  
// 返回: 无
// 备注: ASCII字符可直接输入ASCII码即可
// 版本:
//      2008/06/19      First version
//========================================================================
void showChar(unsigned char x, unsigned char y, char a) 
{
	//显示ASCII字符
	setSS(0);					//SS置低电平	
	sendData(7);					//传送指令0x07
	sendData(x);					//要显示字符的左上角的X轴位置
	sendData(y);					//要显示字符的左上角的Y轴位置
	sendData(a);					//要显示字符ASCII字符的ASCII码值
	setSS(1);					//完成操作置SS高电平
}  

//========================================================================
// 函数: void showString(int x,int y,char *p)
// 描述: 在x、y为起始坐标处写入一串标准ASCII字符
// 参数: x  X轴坐标     y  Y轴坐标
//		 p  要显示的字符串  
// 返回: 无
// 备注: 仅能用于自带的ASCII字符串显示
// 版本:
//      2008/06/19      First version
//========================================================================
void showString(unsigned char x, unsigned char y, char *p)
{
	while(*p!=0)
	{
		showChar(x,y,*p);
		x += X_Witch;
		if((x + X_Witch) > Dis_X_MAX)
		{
			x = Dis_Zero;
			if((Dis_Y_MAX - y) < Y_Witch)   y = 0;  //display from start
			else y += Y_Witch;
		}
		p++;
	}
} 

//========================================================================
// 函数: void showChar_cn(unsigned char x,unsigned char y,unsigned short * GB) 
// 描述: 写入一个二级汉字库汉字
// 参数: x  X轴坐标     y  Y轴坐标
//		 a  GB码  
// 返回: 无
// 备注: 
// 版本:
//      2008/06/19      First version
//		2008/06/19		V1.0 for AVR CVAVR
//========================================================================
void showChar_cn(unsigned char x, unsigned char y, flash char * GB) 
{
	//显示ASCII字符
	setSS(0);					//SS置低电平	
	sendData(8);					//传送指令0x08
	sendData(x);					//要显示字符的左上角的X轴位置
	sendData(y);					//要显示字符的左上角的Y轴位置
	
	//sendData((*GB>>8)&0x00ff);	//传送二级字库中汉字GB码的高八位值
	//sendData(*GB&0x00ff);		//传送二级字库中汉字GB码的低八位值 
	sendData(*GB);	//传送二级字库中汉字GB码的高八位值 
	GB++;
	sendData(*GB);		//传送二级字库中汉字GB码的低八位值
	setSS(1);					//完成操作置SS高电平
}

//========================================================================
// 函数: void showString_cn(unsigned char x,unsigned char y,unsigned short *p)
// 描述: 在x、y为起始坐标处写入一串汉字字符
// 参数: x  X轴坐标     y  Y轴坐标
//		 p  要显示的字符串  
// 返回: 无
// 备注: 同PutChar_cn中的解释
// 版本:
//      2008/06/19      First version
//		2008/06/19		V1.0 for AVR CVAVR
//========================================================================
void showString_cn(unsigned char x, unsigned char y, flash char *p)
{
	//while((*p>>8)!=0)
	while(*p != 0)
	{
		showChar_cn(x,y,p);
		x += X_Witch_cn;
		if((x + X_Witch_cn) > Dis_X_MAX)
		{
			x = Dis_Zero;
			if((Dis_Y_MAX - y) < Y_Witch_cn)   y = 0;  //display from start
			else y += Y_Witch_cn;
		}
		p++;
		p++;
	}
} 

//========================================================================
// 函数: void setPaintMode(unsigned char Mode,unsigned char Color)
// 描述: 绘图模式设置
// 参数: Mode 绘图模式    Color  像素点的颜色,相当于前景色  
// 返回: 无
// 备注: Mode无效
// 版本:
//      2008/06/19      First version
//		2008/06/19		V1.0 for AVR CVAVR
//========================================================================
void setPaintMode(unsigned char Mode, unsigned char Color)
{
	unsigned char ucTemp=0;
	ucTemp = (Mode<<4)|Color;
	//设置绘图模式
	setSS(0);					//SS置低电平			
	sendData(0x83);					//传送指令0x83
	sendData(ucTemp);				//选择8X16的ASCII字体,字符色为黑色
	setSS(1);					//完成操作置SS高电平
} 

//========================================================================
// 函数: void showPixel(unsigned char x,unsigned char y)
// 描述: 在x、y点上绘制一个前景色的点
// 参数: x  X轴坐标     y  Y轴坐标
// 返回: 无
// 备注: 使用前景色
// 版本:
//      2008/06/19      First version
//		2008/06/19		V1.0 for AVR CVAVR
//========================================================================
void showPixel(unsigned char x, unsigned char y)
{
	//绘点操作	
	setSS(0);					//SS置低电平
	sendData(1);					//送指令0x01
	sendData(x);					//送第一个数据,即设置点的X轴位置
	sendData(y);					//点的Y轴位置
	setSS(1);					//完成操作置SS高电平
}
//========================================================================
// 函数: void showLine(unsigned char s_x,unsigned char  s_y,
//					unsigned char  e_x,unsigned char  e_y)
// 描述: 在s_x、s_y为起始坐标,e_x、e_y为结束坐标绘制一条直线
// 参数: x  X轴坐标     y  Y轴坐标
// 返回: 无
// 备注: 使用前景色
// 版本:
//      2008/06/19      First version
//		2008/06/19		V1.0 for AVR CVAVR
//========================================================================
void showLine(unsigned char s_x,unsigned char  s_y, unsigned char  e_x, unsigned char  e_y)
{  
	//绘制直线
	setSS(0);					//SS置低电平
	sendData(2);					//送指令0x02
	sendData(s_x);					//起点X轴坐标
	sendData(s_y);					//起点Y轴坐标
	sendData(e_x);					//终点X轴坐标
	sendData(e_y);					//终点Y轴坐标
	setSS(1);					//完成操作置SS高电平
}
//========================================================================
// 函数: void showCircle(unsigned char x,unsigned char y,
//					unsigned char r,unsigned char mode)
// 描述: 以x,y为圆心R为半径画一个圆(mode = 0) or 圆面(mode = 1)
// 参数: 
// 返回: 无
// 备注: 画圆函数执行较慢,如果MCU有看门狗,请作好清狗的操作
// 版本:
//      2008/06/19      First version
//========================================================================
void showCircle(unsigned char x, unsigned char y, unsigned char r, unsigned char mode)
{
	setSS(0);
	if(mode)
		sendData(6);
	else
		sendData(5);
	sendData(x);
	sendData(y);
	sendData(r);
	setSS(1);
}

//========================================================================
// 函数: void showRectangle(unsigned char left, unsigned char top, unsigned char right,
//				 unsigned char bottom, unsigned char mode)
// 描述: 以x,y为圆心R为半径画一个圆(mode = 0) or 圆面(mode = 1)
// 参数: left - 矩形的左上角横坐标,范围0到126
//		 top - 矩形的左上角纵坐标,范围0到62
//		 right - 矩形的右下角横坐标,范围1到127
//		 bottom - 矩形的右下角纵坐标,范围1到63
//		 Mode - 绘制模式,可以是下列数值之一:
//				0:	矩形框(空心矩形)
//				1:	矩形面(实心矩形)
// 返回: 无
// 备注: 画圆函数执行较慢,如果MCU有看门狗,请作好清狗的操作
// 版本:
//      2008/06/19      First version
//========================================================================
void showRectangle(unsigned char left, unsigned char top, unsigned char right,
				 unsigned char bottom, unsigned char mode)
{
	setSS(0);
	if(mode)
		sendData(4);
	else
		sendData(3);
	sendData(left);
	sendData(top);
	sendData(right);
	sendData(bottom);
	setSS(1);
}  

//========================================================================
// 函数: void clrScreen(void)
// 描述: 清屏函数,执行全屏幕清除或填充前景色
// 参数: 
// 返回: 无
// 备注: 
// 版本:
//      2007/07/19      First version
//========================================================================
void clrScreen(void)
{
	//清屏操作
	setSS(0);					//SS置低电平
	sendData(0x80);					//送指令0x80
	sendData(0);					//指令数据
	setSS(1);					//完成操作置SS高电平
} 

//========================================================================
// 函数: void fill_s(unsigned char x,unsigned char y,
//					unsigned char * String,unsigned char Number)
// 描述: 在Y轴y位置上对应的page页的x位置开始填充Number个byte的数据,用于用户
//			自取的图像/文字字模在LCD当中显示
// 参数: 	x  填充起点的X轴位置
//		 	y  填充起点于哪一页, 该数据低三位无效,如y=10时,表示要填充的是page1,
//						y=6时表示page0,注意,这里是指页而不是指哪一行~
//						page = y>>3
//			*String 要填充的数据序列
//			Number 要填充的数据个数
// 返回: 无
// 备注: 
// 版本:
//      2007/07/23      First version
//========================================================================
void fill_s(unsigned char x, unsigned char y, char * String, unsigned char Number)
{
	//清屏操作
	setSS(0);					//SS置低电平
	sendData(0x09);					//送指令0x09
	sendData(x);					//指令数据
	sendData(y);					//指令数据
	delay_ms(1);					//稍稍延一点时间
	while(Number!=0)
	{
		sendData(*(String++));		//指令数据
		Number--;
	}
	setSS(1);					//完成操作置SS高电平
}                        
  

⌨️ 快捷键说明

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