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

📄 lcmdrive.c

📁 LCM320240点阵图形显示模块的驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:

/**************************************************************************************************
函数名称: Lcm_IntSetPanel.
功能描述: 完成整型变量设定面板的绘制.
函数说明: 面板选中与非选中有不同的显示效果.
调用函数: 写控制命令到某指令寄存器子函数Lcm_WriteCommand. 
          读取某指令寄存器状态子函数Lcm_ReadCommand, 
		  在当前坐标下将单字节数据写入显存子函数Lcm_WriteData,
		  坐标定位子函数Lcm_LocateXY,
		  显示整型变量子函数Lcm_DisplayIntVar.
全局变量: 无.
输    入: 无符号字符型:坐标起始点X0,Y0,
          无符号字符型:显示窗口的宽度Width,
          无符号字符型:选中与非选中标志Select,0为非选中状态,1为被选中状态.
          有符号长整型变量:IntVar.
返    回: 无.
设    计: 特盈自动化  电气设计部  洪天长. 
**************************************************************************************************/
void Lcm_IntSetPanel(unsigned char X0,Y0,unsigned char Width,unsigned char Select,long int IntVar)
{ unsigned char i,j;//定义辅助计数变量.
  long int IntVarTemp;//定义辅助变量。
  unsigned char XTemp,YTemp;//定义辅助坐标变量.
  unsigned char ParameterState=0;//定义参数状态标志并置初值为0;1为参数正确,0为参数有误.
  unsigned char CommandReg0;//定义0号指令寄存器的辅助存储器.
  unsigned char CommandReg10;//定义10号指令寄存器的辅助存储器.
  CommandReg0=Lcm_ReadCommand(0x00);//保存0号指令寄存器的值.
  CommandReg10=Lcm_ReadCommand(0x10);//保存10号指令寄存器的值.
  Lcm_WriteCommand(0x00,CommandReg0&0xf7);//选择绘图模式,其余参数不变.
  if(Width>=8)//如果窗口宽度大于等于8.  
    { if((IntVar>=-9999999)&&(IntVar<=9999999)) ParameterState=1;//如果整型变量范围正确则参数正确.
      else//表示整型变量范围越界.
	    { ParameterState=0;//置变量范围错误标志.
		  if(IntVar>=0) IntVarTemp=9999999;//如果是越上边界则置辅助变量为上限值.
          else IntVarTemp=-9999999;//如果是越下边界则置辅助变量为下限值. 
		}//第1个else{}.
	}//第1个if{}.
  else//窗口宽度小于8.
    { if(IntVar>=0)//如果变量为正数.
	    { if(Width<1)//如果窗口宽度错.
		    { Width=8;//强行置为8.
			  if(IntVar<9999999) ParameterState=1;//如果变量范围正确则置参数正确.
			  else { IntVarTemp=9999999;//置上限值.
		             ParameterState=0;//置参数错误标志.
				   }//第4个else{}.
            }//第5个if{}.
          else//表示窗口宽度正确.
		    { IntVarTemp=1;//置初值.
		      for(i=0;i<Width;i++) IntVarTemp=IntVarTemp*10;//计算辅助变量.
		      if(IntVar<IntVarTemp) ParameterState=1;//如果变量范围正确则置参数正确.
 		      else { IntVarTemp=IntVarTemp-1;//计算上限值.
		             ParameterState=0;//置参数错误标志.
			       }//第6个else{}.
            }//第5个else{}.
		}//第4个if{}.
      else//表示变量为负数.
	    { if(Width<2)//如果窗口宽度错(A).
		    { Width=8;//强行置为8(B).
			  if(IntVar>-9999999) ParameterState=1;//如果变量范围正确则置参数正确.
			  else { IntVarTemp=-9999999;//置下限值(C).
		             ParameterState=0;//置参数错误标志.
				   }//(C).
            }//(B).
          else//表示窗口宽度正确.
		    { IntVarTemp=-1;//置初值(D).
		      for(i=0;i<Width-1;i++) IntVarTemp=IntVarTemp*10;//计算辅助变量.
		      if(IntVar>IntVarTemp) ParameterState=1;//如果变量范围正确则置参数正确.
 		      else { IntVarTemp=IntVarTemp+1;//计算下限值(E).
		             ParameterState=0;//置参数错误标志.
			       }//(E).
            }//(D).
	    }//(A).
	}//第3个else{}.
  if(Select==0)//表示面板非选中状态.
    { Lcm_WriteCommand(0x10,CommandReg10|0x30);//设定文字加粗但不反白显示,其余参数不变.
	  Lcm_LocateXY(X0,Y0);//定位左边第1列从上往下第1个数据点.
      Lcm_WriteData(0xff);//写数据.
      Lcm_LocateXY(X0,Y0+1);//定位左边第1列从上往下第2个数据点.
      Lcm_WriteData(0x80);//写数据.
      Lcm_LocateXY(X0,Y0+2);//定位左边第1列从上往下第3个数据点.
      Lcm_WriteData(0x80);//写数据.
      for(i=Y0+3;i<=Y0+20;i++)//写左边第1列从上往下第4-21个数据.
	     { Lcm_LocateXY(X0,i);//定位.
	       Lcm_WriteData(0x90);//写数据.
	     }//for{}.
      Lcm_LocateXY(X0,Y0+21);//定位左边第1列从上往下第22个数据点.
      Lcm_WriteData(0x80);//写数据.
      Lcm_LocateXY(X0,Y0+22);//定位左边第1列从上往下第23个数据点.
      Lcm_WriteData(0x80);//写数据.
	  Lcm_LocateXY(X0,Y0+23);//定位左边第1列从上往下第24个数据点.
      Lcm_WriteData(0xff);//写数据.
	  for(j=Y0+4;j<Y0+20;j++)//填充窗口内部使之全白.
	     { Lcm_LocateXY(X0+1,j);//定位水平线的起始点.
           for(i=X0+1;i<X0+1+Width;i++)//写水平线.
	           Lcm_WriteData(0x00);//写数据.
		 }//for{}.
	  if(ParameterState==0) IntVar=IntVarTemp;//如果参数错误则写极限值.
	  Lcm_DisplayIntVar(X0-7+Width,Y0+4,IntVar);//写整型变量.
	  XTemp=Lcm_ReadCommand(0x60);//读取写文字后的X轴坐标.
	  YTemp=Lcm_ReadCommand(0x70);//读取写文字后的Y轴坐标.
      Lcm_LocateXY(XTemp,YTemp-4);//定位最右边列从上往下第1个数据点.
      Lcm_WriteData(0xff);//写数据.
	  Lcm_LocateXY(XTemp,YTemp-3);//定位最右边列从上往下第2个数据点.
      Lcm_WriteData(0x03);//写数据.
      Lcm_LocateXY(XTemp,YTemp-2);//定位最右边列从上往下第3个数据点.
      Lcm_WriteData(0x07);//写数据.
      for(i=YTemp-1;i<=YTemp+16;i++)//写最右边列从上往下第4-22个数据点.
	     { Lcm_LocateXY(XTemp,i);//定位.
	       Lcm_WriteData(0x0F);//写数据.
	     }//for{}.
      Lcm_LocateXY(X0,Y0);//定位第1根水平线的起始点.
      for(i=X0;i<XTemp+1;i++)
	      Lcm_WriteData(0xff);//写第1根水平线.
      Lcm_LocateXY(X0+1,Y0+1);//定位第2根水平线的起始点.
      for(i=X0+1;i<XTemp;i++)//写第2根水平线.
	      Lcm_WriteData(0x00);//写数据.  	 
	  Lcm_LocateXY(X0+1,Y0+2);//定位第3根水平线的起始点.
      for(i=X0+1;i<XTemp;i++)//写第3根水平线.
	       Lcm_WriteData(0x00);//写数据. 
      Lcm_LocateXY(X0,Y0+3);//定位第4根水平线的起始点.
      Lcm_WriteData(0x9f);//写第4根水平线的第1个数据.
      for(i=X0+1;i<=XTemp;i++)//写第4根水平线的其余数据.
	      Lcm_WriteData(0xff);//写数据. 
	  Lcm_LocateXY(X0,Y0+20);//定位第5根水平线的起始点.
      Lcm_WriteData(0x9f);//写第5根水平线的第1个数据.
      for(i=X0+1;i<=XTemp;i++)//写第5根水平线的其余数据.
	      Lcm_WriteData(0xff);//写数据.  	
      Lcm_LocateXY(X0,Y0+21);//定位第6根水平线的起始点.
      Lcm_WriteData(0xbf);//写第6根水平线的第1个数据.
      for(i=X0+1;i<=XTemp;i++)//写第6根水平线的其余数据.
	      Lcm_WriteData(0xff);//写数据.  	 
      Lcm_LocateXY(X0,Y0+22);//定位第7根水平线的起始点.
      for(i=X0;i<=XTemp;i++)//写第7根水平线的其余数据.
	      Lcm_WriteData(0xff);//写数据.   
	  Lcm_LocateXY(X0,Y0+23);//定位第8根水平线的起始点.
      for(i=X0;i<=XTemp;i++)//写第8根水平线.
	      Lcm_WriteData(0xff);//写数据. 	
    }//if{}.
  else//表示面板被选中的状态.
    { Lcm_WriteCommand(0x10,CommandReg10|0x30);//设定文字加粗但不反白显示,其余参数不变.
	  Lcm_LocateXY(X0,Y0);//定位.
      Lcm_WriteData(0xff);//写数据.
      Lcm_LocateXY(X0,Y0+1);//定位.
      Lcm_WriteData(0x80);//写数据.
	   Lcm_LocateXY(X0,Y0+2);//定位.
      Lcm_WriteData(0x80);//写数据.	
	  for(i=Y0+3;i<Y0+21;i++)//写左边第1列从上往下第4-21个数据.
	     { Lcm_LocateXY(X0,i);//定位.
           Lcm_WriteData(0x9f);//写数据.
		 }//for{}.   
      Lcm_LocateXY(X0,Y0+21);//定位左边第1列从上往下第22个数据点.
      Lcm_WriteData(0x80);//写数据.
      Lcm_LocateXY(X0,Y0+22);//定位左边第1列从上往下第23个数据点.
      Lcm_WriteData(0x80);//写数据.
	  Lcm_LocateXY(X0,Y0+23);//定位左边第1列从上往下第24个数据点.
      Lcm_WriteData(0xff);//写数据.
	  for(j=Y0+4;j<Y0+20;j++)//填充窗口内部使之全黑.
	     { Lcm_LocateXY(X0+1,j);//定位水平线的起始点.
           for(i=X0+1;i<X0+1+Width;i++)//写水平线.
	           Lcm_WriteData(0xff);//写数据.
		 }//for{}.
	  if(ParameterState==0) IntVar=IntVarTemp;//如果参数错误则写极限值.
	  Lcm_WriteCommand(0x10,(CommandReg10|0x10)&0xdf);//设定加粗且反白显示,其余参数不变.  
	  Lcm_DisplayIntVar(X0-7+Width,Y0+4,IntVar);//写整型变量.
	  Lcm_WriteCommand(0x10,CommandReg10|0x30);//设定加粗但不反白显示,其余参数不变.
	  XTemp=Lcm_ReadCommand(0x60);//读取写文字后的X轴坐标.
	  YTemp=Lcm_ReadCommand(0x70);//读取写文字后的Y轴坐标.
	  Lcm_LocateXY(XTemp,YTemp-4);//定位最右边列从上往下第1个数据点.
      Lcm_WriteData(0xff);//写数据.
	  Lcm_LocateXY(XTemp,YTemp-3);//定位最右边列从上往下第2个数据点.
      Lcm_WriteData(0x01);//写数据.
      Lcm_LocateXY(XTemp,YTemp-2);//定位最右边列从上往下第3个数据点.
      Lcm_WriteData(0x01);//写数据.
      Lcm_LocateXY(XTemp,YTemp-1);//定位最右边列从上往下第4个数据点.
      Lcm_WriteData(0xf9);//写数据.
      for(i=YTemp-1;i<=YTemp+16;i++)//写最右边列从上往下第5-22个数据点.
	     { Lcm_LocateXY(XTemp,i);//定位.
	       Lcm_WriteData(0xf9);//写数据.
	     }//for{}.
      Lcm_LocateXY(XTemp,YTemp+17);//定位最右边列从上往下第23个数据点.
      Lcm_WriteData(0x01);//写数据.
	  Lcm_LocateXY(XTemp,YTemp+18);//定位最右边列从上往下第24个数据点.
      Lcm_WriteData(0x01);//写数据.
	  Lcm_LocateXY(XTemp,YTemp+19);//定位最右边列从上往下第24个数据点.
      Lcm_WriteData(0xff);//写数据.
      Lcm_LocateXY(X0+1,Y0);//写框架上边第1条水平线.
           for(i=X0+1;i<XTemp;i++)//写水平线.
	           Lcm_WriteData(0xff);//写数据.
      Lcm_LocateXY(X0+1,Y0+1);//写框架上边第2条水平线.
           for(i=X0+1;i<XTemp;i++)//写水平线.
	           Lcm_WriteData(0x00);//写数据.
      Lcm_LocateXY(X0+1,Y0+2);//写框架上边第3条水平线.
           for(i=X0+1;i<XTemp;i++)//写水平线.
	           Lcm_WriteData(0x00);//写数据.
      Lcm_LocateXY(X0+1,Y0+3);//写框架上边第4条水平线.
           for(i=X0+1;i<XTemp;i++)//写水平线.
	           Lcm_WriteData(0xff);//写数据.	 
	  Lcm_LocateXY(X0+1,Y0+20);//写框架下边第1条水平线.
      for(i=X0+1;i<XTemp;i++)//写水平线.
	      Lcm_WriteData(0xff);//写数据.  
	  Lcm_WriteData(0xf9);//写框架下边第1条水平线的最后一个数据.
      Lcm_LocateXY(X0+1,Y0+21);//写框架下边第2条水平线.
      for(i=X0+1;i<XTemp;i++)//写水平线.
	      Lcm_WriteData(0x00);//写数据.  	 
	  Lcm_LocateXY(X0+1,Y0+22);//写框架下边第3条水平线.
      for(i=X0+1;i<XTemp;i++)//写水平线.
	       Lcm_WriteData(0x00);//写数据. 
      Lcm_LocateXY(X0,Y0+23);//写框架下边第4条水平线.
      for(i=X0+1;i<=XTemp+1;i++)//写水平线.
	      Lcm_WriteData(0xff);//写数据.       
   }//else{}.
  Lcm_WriteCommand(0x00,CommandReg0);//返回0号指令寄存器的原值.
  Lcm_WriteCommand(0x10,CommandReg10);//返回10号指令寄存器的原值.
}//子函数Lcm_IntSetPanel结束.              


/**************************************************************************************************
函数名称: Lcm_IntDisplayPanel.
功能描述: 完成整型变量显示面板的绘制.
函数说明: 仅显示而无更改功能.
调用函数: 写控制命令到某指令寄存器子函数Lcm_WriteCommand. 
          读取某指令寄存器状态子函数Lcm_ReadCommand, 
		  在当前坐标下将单字节数据写入显存子函数Lcm_WriteData,
		  坐标定位子函数Lcm_LocateXY,
		  显示整型变量子函数Lcm_DisplayIntVar.
全局变量: 无.
输    入: 无符号字符型:坐标起始点X0,Y0,
          无符号字符型:显示窗口的宽度Width,
		  反白显示标志:Reverse;0为反白显示,1为正常.
          有符号长整型变量:IntVar.
返    回: 无.
设    计: 特盈自动化  电气设计部  洪天长. 
**************************************************************************************************/
void Lcm_IntDisplayPanel(unsigned char X0,Y0,unsigned char Width,
                         unsigned char Reverse, long int IntVar)
{ unsigned char i,j;//定义辅助计数变量.
  long int IntVarTemp;//定义辅助变量。
  unsigned char XTe

⌨️ 快捷键说明

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