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

📄 hmi.c

📁 51单片机驱动128X64液晶的程序。里面包括显示16X16点阵字符、显示8X16点阵字符、显示光标、clr光标等子程序。用C51编写
💻 C
📖 第 1 页 / 共 3 页
字号:
}
/*********************************************
该函数显示16位的整数的Hex格式

in:	  x 行 
      y	列
	  z 要显示的16位整数 

out:  无
**********************************************/

void Disp1Uint16Hex(uint8 x,uint8 y ,uint16 z  ){
     
	 Disp1Char8X16(x,y,z>>12);	 
	 y++;
	 
     Disp1Char8X16(x,y,(z&0xf00)>>8);	
     y++;
	 
     Disp1Char8X16(x,y,(z&0x00f0)>>4);	 
	 y++;
	 
     Disp1Char8X16(x,y,(z&0x0f));	 
}


/*********************************************
该函数显示8位的整数

in:	  x 行 
      y	列
	  z 要显示的8位整数 

out:  无
**********************************************/

void Disp1Uint8(uint8 x,uint8 y ,uint8 z  ){
     if(z>99){
	    z=99;
	 }
     Disp1Char8X16(x,y,z/10);	 
	 y++;
     Disp1Char8X16(x,y,z%10);	 
}


void RefWinMain(void)  {
     Sem1=1;
     DispTemp5 =DayRun;
     DispTemp6=HourRun;
     DispTemp7 =MinRun; 
     DispTemp8 =SecRun; 
     DispTemp16Bit[0] =PowNow;
     DispTemp16Bit[1] =TemNow;
     DispTemp16Bit[2] =CurNow;
     Sem1=0;


	 Disp1Uint16(1,11,DispTemp16Bit[0]);
	 Disp1Uint16(2,11,DispTemp16Bit[1]);
	 Disp1Uint16(3,11,DispTemp16Bit[2]);
	 
	 Disp1Uint8(4,1,DispTemp5);
	 Disp1Uint8(4,5,DispTemp6);
	 Disp1Uint8(4,9,DispTemp7);
	 Disp1Uint8(4,13,DispTemp8);
	 	    

}
/*
该函数显示参数设定界面

*/

void DispWinParaSet(){
     
	 Sem2=1;
	 DispTemp16Bit[0] =PowSeting; //PowNow;
     DispTemp16Bit[1] =TemSeting;//TemNow;
	 Sem2=0;
     
     Disp1Char16X16(1,1,15);	 //设
 	 Disp1Char16X16(1,2,16);	 //定
	 Disp1Char16X16(1,3,4);	 //功
	 Disp1Char16X16(1,4,5);	 //率

	 Disp1Char8X16(1,9,36);	 //:

	 Disp1Char16X16(1,8,14);	 //瓦

     Disp1Char16X16(2,1,15);	 //设
	 Disp1Char16X16(2,2,16);	 //定
	 Disp1Char16X16(2,3,2);	 //温
	 Disp1Char16X16(2,4,3);	 //度

	 Disp1Char8X16(2,9,36);	 //:

	 Disp1Char16X16(2,8,3);	 //度

	 Disp1Uint16(1,11,DispTemp16Bit[0]);
	 //Disp1Uint16(1,11,9999);
	 Disp1Uint16(2,11,DispTemp16Bit[1]);
	 DispCsr(1,14);
	
}
						  
/*
该函数显示主界面

*/
void DispWinMain(){
	 //Sem1=1;
     DispTemp5 =1;//DayRun;
     DispTemp6 =23;//HourRun;
     DispTemp7 =34;//MinRun; 
     DispTemp8 =2;//SecRun; 

     DispTemp16Bit[0] =1234; //PowNow;
     DispTemp16Bit[1] =12;//TemNow;
     DispTemp16Bit[2] =134;//CurNow;
     //Sem1=0;

     Disp1Char16X16(1,1,0);	 //当
 	 Disp1Char16X16(1,2,1);	 //前
	 Disp1Char16X16(1,3,4);	 //功
	 Disp1Char16X16(1,4,5);	 //率

	 Disp1Char8X16(1,9,36);	 //:

	 Disp1Char16X16(1,8,14);	 //瓦

     Disp1Char16X16(2,1,0);	 //当
	 Disp1Char16X16(2,2,1);	 //前
	 Disp1Char16X16(2,3,2);	 //温
	 Disp1Char16X16(2,4,3);	 //度

	 Disp1Char8X16(2,9,36);	 //:

	 Disp1Char16X16(2,8,3);	 //度
	
	 Disp1Char16X16(3,1,6);	 //灯
	 Disp1Char16X16(3,2,7);	 //丝
	 Disp1Char16X16(3,3,8);	 //电
	 Disp1Char16X16(3,4,9);	 //流

	 Disp1Char8X16(3,9,36);	 //:

	 Disp1Char8X16(3,16,10);	 //A

	
	 Disp1Char16X16(4,2,10);	 //天
	 Disp1Char16X16(4,4,11);	 //时
	 Disp1Char16X16(4,6,12);	 //分
	 Disp1Char16X16(4,8,13);	 //秒
	
	 Disp1Uint16(1,11,DispTemp16Bit[0]);
	 Disp1Uint16(2,11,DispTemp16Bit[1]);
	 Disp1Uint16(3,11,DispTemp16Bit[2]);
	 
	 Disp1Uint8(4,1,DispTemp5);
	 Disp1Uint8(4,5,DispTemp6);
	 Disp1Uint8(4,9,DispTemp7);
	 Disp1Uint8(4,13,DispTemp8);
	 	    

}

void RamTest(){
     uint8 xdata *PR;
	 uint8 temp;
	 uint16  i;

	 PR=RamBase;

     for(i=0;i<0x8000;i++){
	     if((i%16)==0){
	         Disp1Uint16Hex(1,1,PR);
	     }
		 temp=*PR;
		 *PR=0xaa;
		 if(*PR!=0xaa){
		 	while(1);
		 }
		 *PR=0x55;
		 if(*PR!=0x55){
		 	while(1);
		 }
         *PR=temp;
		 PR++;
	 }

  
}

/**
 该函数为人机界面进程的执行体。实现对按键信息的接受和处理。并且
 实现相应的界面的刷新。该进程一般情况下每100ms执行一次。该进程与键
 盘扫描进程之间通过一个消息队列<href>KeyReadBuf</href>进行同步。
 当键盘扫描进程发现有按键事件的时候会向该消息对列发送键值。该进程
 挂在这个消息对列上,超时设置为100ms。超时到了以后该进程向其它模块
 询问相应信息,如果值有变化则更新界面。
*/


void HMI_run(void){
    static xdata uint8 Windows_ID;
    static  uint8 Key   ;
	static xdata uint8 x,z;//y,z ; 

	Windows_ID=WinMain;
	DispWinMain();

	while(TRUE){
		ToggleLedBit(4);
	 	//DispCsr(1,z++);
		//if(z>16) z=1;
		switch(Windows_ID){
			   case WinMain:
                 	if(OSQPend(&Key,KeyReadBuf,100)==OS_Q_TMO){
                       RefWinMain();
					}
					else{
	                   Disp1Char8X16(4,16,Key);
					   if(Key==13){
					      Windows_ID=WinParaSet;
						  LCDClear();
						  DispWinParaSet();
						  x=0;
						  z=0;
						 // DispCsr(x,y);

					   }	
					}
		     		
		            //OSQPend(&Key,KeyReadBuf,0);
	                //Disp1Char8X16(4,16,Key);	 //:
		            //

					break;

			   case WinParaSet:
                 	if(OSQPend(&Key,KeyReadBuf,100)!=OS_Q_TMO){
                       Disp1Char8X16(4,16,Key);
                       if(Key==15){
	                      Sem2=1;
	                      PowSeting=DispTemp16Bit[0] ; //PowNow;
                          TemSeting=DispTemp16Bit[1] ;//TemNow;
	                      Sem2=0;
                          Windows_ID=WinMain;
					      LCDClear();
					  	  DispWinMain();
    	               }
   					   else if(Key==14){
					      Windows_ID=WinMain;
					      LCDClear();
					  	  DispWinMain();
    	               }

					   else if(Key==13){
					      Windows_ID=WinMain;
					      LCDClear();
					  	  DispWinMain();
    	               }
					   
					   else if(Key==13){
					      Windows_ID=WinMain;
					      LCDClear();
					  	  DispWinMain();
    	               }
					   else if(Key==11){
					      if(x<1){
						     x=x+1;
							 ClrCsr (x,14) ;
	 					     DispCsr(x+1,14);
							 z=0;
						  }
					   }
					   else if(Key==10){
					      if(x>0){
						     x=x-1;
	 						 ClrCsr (x+2,14);
						     DispCsr(x+1,14);
							 z=0;
						  }
					   }
					   else if (Key<10){
					      if(z==0){
						     DispTemp16Bit[x]=0;
                          }
						  if(z<4){
						     DispTemp16Bit[x]=DispTemp16Bit[x]*10+Key;
						     Disp1Uint16(x+1,11,DispTemp16Bit[x]);
	 					     DispCsr(x+1,14);
							 z=z+1;
						  }


					   }	
					}
		            //OSQPend(&Key,KeyReadBuf,0);
	                //Disp1Char8X16(4,16,Key);	 //:
		            //
					break;

		}			
		OSWait(K_TMO,30);
	}
} /*/

/****************************************/
/*  全角字符点阵码数据输出		*/
/****************************************/
void Disp1Char16X16(uint8 PageRow , uint8 PageCol ,uint8 Order){
	static uint8  i;
	static uint16 Offset;				/*偏移量,字符量少的可以定义为UCHAR	*/
	 if(PageCol<5){
	    
		Offset=Order * 0x20;			/*每个字符32字节	*/
        SetPageLeft1((PageRow-1)*2);
        
		SetYLeft((PageCol-1)*16);	
		for(i=0;i<16;i++){           /*上半个字符输出,16列	*/
		    DataLeftOut(Hzk16X16[Offset]);				/*写输出一字节		*/
		    Offset++;
		}					/*上半个字符输出结束	*/
		
		Offset=(Order * 0x20)+16;			/*每个字符32字节	*/
        SetPageLeft1((PageRow-1)*2+1);

		SetYLeft((PageCol-1)*16);	
        for(i=0;i<16;i++){				/*下半部分*/
		    DataLeftOut(Hzk16X16[Offset]);				/*写输出一字节		*/
		    Offset++;
		}					/*下半个字符输出结束	*/
	  }						

	  else{                 /*右显示区	*/

	    Offset=Order * 0x20;			/*每个字符32字节	*/
        SetPageRight1((PageRow-1)*2);
		SetYRight((PageCol-5)*16);	
        
		for(i=0;i<16;i++){           /*上半个字符输出,16列	*/
		    DataRightOut(Hzk16X16[Offset]);				/*写输出一字节		*/
		    Offset++;
		}					/*上半个字符输出结束	*/
		
		Offset=(Order * 0x20)+16;			/*每个字符32字节	*/
        SetPageRight1((PageRow-1)*2+1);
		SetYRight((PageCol-5)*16);	
        for(i=0;i<16;i++){				/*下半部分*/
		    DataRightOut(Hzk16X16[Offset]);				/*写输出一字节		*/
		    Offset++;
		}					/*下半个字符输出结束	*/
	  }	

}

/****************************************/
/*  半角字符点阵码数据输出		*/
/****************************************/
void Disp1Char8X16(uint8 PageRow , uint8 PageCol ,uint8 Order){
	 static xdata uint8  i;
	 static xdata uint16 Offset;				/*偏移量,字符量少的可以定义为UCHAR	*/
	    if(PageCol<9){
	    

⌨️ 快捷键说明

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