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

📄 gdm12864ep.c

📁 128×64液晶接口程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//输入条件为:字符串地址pc,写入的行y、列位置x、字数n  
LCDPrintString(unsigned char code *pd,unsigned char PlaceY,unsigned char PlaceX){     
	unsigned char d;
    LCDSelectPlace(PlaceY,PlaceX);	//第y第X列开始写字符
	while(*pd)
    {				   		     //所有字符串写入LCD
        d=LCDWaitLeisure();      //等待LCD空闲 
        
        LCD_DATA_DIR=TO_LCD;     //准备向LCD写数据
        LCD_RS=1;                //选择数据寄存器    
        LCD_RW=0;                //
        LCD_E=1;                 //写
        LCD_DATA=*pd;            //等待直到LCD有空闲
        LCD_E=0;       

		pd++;                   
	}
}   
//====================显示器清屏======================================
LCDClearScreen(){    
	LCDWriteCommand(Base_Module);
	LCDWriteCommand(On_Screen);     //关闭光标及反白   
	LCDWriteCommand(Clear_Display); //清除显示器及RAM内容   
	DelayMs(2);                   //等待清除
	LCDWriteCommand(Right_ACAdd);  	//显示器地址右移	 		 			
}
//================================================ 
//液晶显示器的初始化   
void LCDInitialize(){
	LCDWriteCommand(Base_Module);   		//基本指令集动作 
	DelayUs(500);
	LCDWriteCommand(Base_Module);   		//基本指令集动作 
	DelayUs(500);
	LCDWriteCommand(On_Screen);  			//打开显示器
	DelayUs(200);
	LCDWriteCommand(Clear_Display); 		//清除显示器并DDRAM 
	DelayMs(2);
	LCDWriteCommand(Right_ACAdd); 		 	//光标方向为右增量
	LCDWriteCommand(Go_Origin);   			//返回到原点
}    
//=========向LCD自定义CGRAM中写入4个自定义字符代码,=======================   
//GDM12864E只能自定义4个中文字符(16x16格式),1个中文字符由32个字节代码组成
//ucPlace=0对应CGRAM 0x40地址,1对应0x50,2对应0x60,3对应0x70
LCDInputMyCharCode(unsigned char code *pd,unsigned char ucPlace)
{  
    unsigned char d=0x40;
    ucPlace<<=4;
	d+=ucPlace;
    LCDWriteCommand(Expand_Module);  //扩充指令集 
    LCDWriteCommand(0x02);       	 //允许设置CGRAM地址   
    LCDWriteCommand(Base_Module);    //基本指令集   
 	LCDWriteCommand(d);  		     //设置CGRAM的地址  
    LCDWriteNByte(pd,32);            //将32个代码写入CGRAM
}    
//=================LCD图形区域清屏============================================
//最小清除区域1行8点,因此PlaceY=0~63行,PlaceX=8~128列;    
LCDClearPicture(unsigned char PlaceY,unsigned char PlaceX,
				    unsigned char WidthX,unsigned char WidthY)
{
	unsigned char Ix,Iy;		
	unsigned char YChange,x,zero=0;  	
   	x=(PlaceX)/16; //X的横轴位置
	if(PlaceY>=32){x+=8;PlaceY-=32;}
	LCDWriteCommand(0x36);  		//扩充指令集  
	LCDWriteCommand(0x80+PlaceY);	//设置DGRAM的Y=00地址   
 	LCDWriteCommand(0x80+PlaceX);  	//设置DGRAM的X=00地址 	 
 	LCDWriteCommand(0x32);   		//基本指令集   
	for(Iy=WidthY+1,YChange=0;Iy!=0;Iy--,YChange++)
    {  
		for(Ix=WidthX/8;Ix!=0;Ix--)             //32个编码字节写入LCD
        {
            LCDWriteNByte(&zero,1);     
		}  
		LCDWriteCommand(0x36);     				//扩充指令集   
 	 	LCDWriteCommand(0x80+PlaceY+YChange);   //设置DGRAM的Y=YAddress地址   
  	 	LCDWriteCommand(0x80+x);    		    //设置DGRAM的X=00地址        
  	 	LCDWriteCommand(0x32);    		 		//基本指令集   
	}                       	
	LCDWriteCommand(0x36);  //扩充指令集 
}    
//=========向LCD中GDRAM写入图形代码==============================================
//n 为本图形数据总字节数,width为本图形水平宽度(一般1-4字节),PlaceX,PlaceY为x,y轴座标
//如果format=0;则图象正常显示,否则图象取反白显示
LCDPrintPicture(unsigned char code *pd,unsigned char PlaceY,unsigned char PlaceX,
					unsigned char WidthX,unsigned char WidthY,unsigned char format){  
	unsigned char Ix,Iy,d;		
	unsigned char YAddress;   
	if(PlaceY<=2){PlaceY-=1;PlaceY*=16;}
	else if(PlaceY<=4){PlaceY=0;PlaceX+=8;}
	LCDWriteCommand(0x36);  		//扩充指令集  
	LCDWriteCommand(0x80+PlaceY);	//设置CGRAM的Y=00地址   
 	LCDWriteCommand(0x80+PlaceX);  	//设置CGRAM的X=00地址 	 
 	LCDWriteCommand(0x32);   		//基本指令集   
	for(Iy=WidthY,YAddress=0;Iy!=0;Iy--,YAddress++)
    {  
		for(Ix=WidthX/8;Ix!=0;Ix--,pd++)  //32个编码字节写入LCD
        {
			if(format)                        //图象负显示
            {
                 d=LCDWaitLeisure();      //等待LCD空闲 
         
                 LCD_DATA_DIR=TO_LCD;     //准备向LCD写数据
                 LCD_RS=1;                //选择数据寄存器    
                 LCD_RW=0;                //
                 LCD_E=1;                 //写
                 LCD_DATA=~(*pd);         //等待直到LCD有空闲
                 LCD_E=0;       
			}
			else                          //图象正显示
            {
                 d=LCDWaitLeisure();      //等待LCD空闲 
         
                 LCD_DATA_DIR=TO_LCD;     //准备向LCD写数据
                 LCD_RS=1;                //选择数据寄存器    
                 LCD_RW=0;                //
                 LCD_E=1;                 //写
                 LCD_DATA=~(*pd);         //等待直到LCD有空闲
                 LCD_E=0;       
			}
		}  
		LCDWriteCommand(0x36);     				//扩充指令集   
 	 	LCDWriteCommand(0x80+PlaceY+YAddress);  //设置CGRAM的Y=YAddress地址   
  	 	LCDWriteCommand(0x80+PlaceX);    		//设置CGRAM的X=00地址        
  	 	LCDWriteCommand(0x32);    		 		//基本指令集   
	}                       	
	LCDWriteCommand(0x36);  //扩充指令集 
}   

//========在LCD屏幕的指定座标x,y上描点=================================
//PlaceX,PlaceY为x,y轴座标,DotStatus=1,打点,=0清除点
//PlaceX=0~127,PlaceY=0~63
//以左上角座标为(0,0)
LCDPrintDot(unsigned char PlaceX,unsigned char PlaceY,unsigned char DotStatus)
{  
    unsigned char code DOT_CODE[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
//
	unsigned char x,m0,m1,d0[2],d1[2];
//    		
	x=(PlaceX)/16;                  //上半屏,X的横轴位置
    m0=PlaceX/8;                     //点位置计算
	if(PlaceY>=32){x+=8;PlaceY-=32;}//下半屏,X的横轴位置

    m1=PlaceX%8;                     //n上的偏移量
                                          //打点或清除点的位置
    if(m0&0x01){d0[0]=0;d0[1]=DOT_CODE[m1];}//奇数字节
    else      {d0[0]=DOT_CODE[m1];d0[1]=0; }//偶数字节   

	//连续读出2字节数据===================================================
  	LCDWriteCommand(0x36);  		//扩充指令集  
	LCDWriteCommand(0x80+PlaceY);	//设置DGRAM的Y=00地址   
 	LCDWriteCommand(0x80+x);  		//设置DGRAM的X=00地址 	 
 	LCDWriteCommand(0x32);   		//基本指令集             
    LCDReadNByte(d1,2);             //连续读出2字节
   //================================================================
    if(DotStatus)   //描点
    {
        d0[0]|=d1[0];
        d0[1]|=d1[1];
    }
    else            //清除点
    {
        d0[0]=(~d0[0])&d1[0];
        d0[1]=(~d0[0])&d1[1];    
    }

	//连续写入2字节数据===============================================
 	LCDWriteCommand(0x36);  		//扩充指令集  
	LCDWriteCommand(0x80+PlaceY);	//设置CGRAM的Y=00地址   
 	LCDWriteCommand(0x80+x);  		//设置CGRAM的X=00地址 	 
 	LCDWriteCommand(0x32);   		//基本指令集             
    LCDWriteNByte(d0,2);            //连续向LCD写入2字节数据
	LCDWriteCommand(0x36);          //扩充指令集  
}     
  
//=================在指定区域显示16x32格式的数字=======================
//1.无效零消隐处理:0023.98处理为23.98
//2.x轴位置范围为0-7,y轴范围为1,2,一行最多显示8个数字
//3.*pd为要显示的数据,n为数据个数(包含小数点)                                           
//4.DotNumber小数点个数,如果为整数,则DotNumber=0
LCDPrintLargeNumber(unsigned char *pd,unsigned char n,unsigned char DotNumber,
				unsigned char PlaceY,unsigned char PlaceX){
	unsigned char i,j,dot;
	//-------------以下为无效零消隐处理:0023.98处理为23.98
	for(i=0;i<n-1-DotNumber;i++){//0. 即小数点前为0时,不能消隐,必须扣除
		if((*pd)==0)pd++;   
	    else break;
	} 
    //-------------将有效数据在指定位置全部显示出来  
    j=n-i; i=j; dot=i-DotNumber;//计算小数点位置;PCODE: $00000328 
	for(j=0;i!=0;i--,j++,pd++){
		if(j==dot){				//显示小数点
		  	LCDPrintPicture(PDot,PlaceY,PlaceX+j,16,32,0);   //.
		  	j++; 
		}
   		switch((*pd)){ 			//显示有效数字
   			case 0: LCDPrintPicture(PNumber0,PlaceY,PlaceX+j,16,32,0);break;  //0
   			case 1: LCDPrintPicture(PNumber1,PlaceY,PlaceX+j,16,32,0);break;  //1
   			case 2: LCDPrintPicture(PNumber2,PlaceY,PlaceX+j,16,32,0);break;  //2			
   			case 3: LCDPrintPicture(PNumber3,PlaceY,PlaceX+j,16,32,0);break;  //3
   			case 4: LCDPrintPicture(PNumber4,PlaceY,PlaceX+j,16,32,0);break;  //4
   			case 5: LCDPrintPicture(PNumber5,PlaceY,PlaceX+j,16,32,0);break;  //5
   			case 6: LCDPrintPicture(PNumber6,PlaceY,PlaceX+j,16,32,0);break;  //6
   			case 7: LCDPrintPicture(PNumber7,PlaceY,PlaceX+j,16,32,0);break;  //7
   			case 8: LCDPrintPicture(PNumber8,PlaceY,PlaceX+j,16,32,0);break;  //8
   			case 9: LCDPrintPicture(PNumber9,PlaceY,PlaceX+j,16,32,0);break;  //9
   			default: break;
   		}			
	} 
	for(;j<=n-1;j++)LCDClearPicture(PlaceY,PlaceX+j*16,16,32);     
}                     
//=================进度条的显示(在x轴方向显示)=============
//1.percent为百分比0~100整数
//2.Fill[16]:x轴方向当前填充位置(0~16),填充内容,每个填充内容为8bit,1字节
//3.y轴方向为16bit,第一与最后一个bit显示0,中间14bit 为Fill值
//4.PlaceY为在第几行显示0~63
LCDPrintProgress(unsigned char percent,unsigned char PlaceY,unsigned char ShowFlag){
	unsigned char FillNumber;//被填充为1的字节数  
	unsigned char FillBit;	 //被填充为1的总位数 
	unsigned char FillRemain;//未被填满的最后一个字内容
	unsigned char Fill[16];  //进度条总字节数   
	unsigned char Ix,Iy,i,j,PlaceX,RealPlaceY; 
    unsigned char d[2]={0xf0,0xf0};         
	unsigned int uiTemp;
   	uiTemp=(unsigned int)(percent)*127+50;
	FillBit=(unsigned char)(uiTemp/100);	//需要填满1的个数
	FillNumber=(unsigned char)(FillBit/16); //填满0xff的字节数
	FillRemain=(FillBit)%16;                //未填满0xffff  
	for(i=0;i<=15;i++){
		if((i<=FillNumber*2-1)&&(FillNumber!=0))Fill[i]=0xff; 
		else Fill[i]=0x00;
    }
	if(FillRemain){
		if(FillNumber==7)uiTemp=~(0xffff>>(FillRemain+1)); 
		else uiTemp=~(0xffff>>FillRemain); 
		Fill[FillNumber*2]=(unsigned char)(uiTemp>>8);
		Fill[FillNumber*2+1]=(unsigned char)(uiTemp&0x00ff);
	}
	//------------------------------------------------------ 
	if(PlaceY>=3) PlaceX=8; 		//确定X轴的确切位置 
	else 	PlaceX=0;                      
	//---------计算实际Y轴的位置
	if(PlaceY==1||PlaceY==3)RealPlaceY=0;//上半屏与下半屏的第一行
	else RealPlaceY=16;    				 //上半屏与下半屏的第二行  
	LCDWriteCommand(0x36);  			//扩充指令集  
	LCDWriteCommand(0x80+RealPlaceY);	//设置DGRAM的Y轴值   
 	LCDWriteCommand(0x80+PlaceX);  		//设置DGRAM的X轴值 	 
 	LCDWriteCommand(0x32);   	   		//基本指令集   
 	for(j=0,Iy=0;j<=7;j++)
    {
		for(Iy=0,Ix=0;Iy<=15;Iy++)
        { 
		  	LCDWriteCommand(0x36);     		 	//扩充指令集   
 	 		LCDWriteCommand(0x80+RealPlaceY+Iy);//设置DGRAM的Y轴位置   
	  	 	LCDWriteCommand(0x80+PlaceX+j);    	//设置DGRAM的X轴位置

⌨️ 快捷键说明

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