📄 lcmdrive.c
字号:
/**************************************************************************************************
函数名称: 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 + -