📄 memu.c
字号:
#include "Includes.h"
/*Print:把需要显示的字符串传送给显示缓冲区---------------------------------*
*功能:把需要显示的字符串传送给显示缓冲区从(行号LineNo,列号RowNO)开始的区域 *
*参数:全局变量LcdShowBuff:64字节显示缓冲区(4行*16列) *
* LineNo:在Lcd上显示的起始行号(1--4) *
* RowNO:在Lcd上显示的起始列号(1--16) *
* SringP:指向需在Lcd上显示的字符串的指针 *
* Num:字符串长度 *
*调用实例:Print(2,3,"苏州大学",8) *
* 在第2行第3列开始显示"苏州大学"4个汉字(共8个字符) *
*返回:无 *
*-------------------------------------------------------------------------*/
void Print(INT8U LineNo,INT8U RowNO,INT8U * SringP,INT8U Num)
{
INT8U i; //循环控制变量
INT8U StartPos; //在显示缓冲区(0--63)中的起始位置
StartPos = (LineNo-1)*16+(RowNO-1);
for(i=0;i<Num;i++)
{
//已超出Lcd显示缓冲区的边界,退出
if((StartPos+i)>63) break;
LcdShowBuff[StartPos+i]=SringP[i];
}
}
/*Clear:清空显示缓冲区-----------------------------------------------------*
*功能:清空显示缓冲区,把显示缓冲区的内容全部赋为空格 *
*参数:全局变量LcdShowBuff:64字节显示缓冲区(4行*16列) *
*返回:无 *
*-------------------------------------------------------------------------*/
void Clear(void)
{
INT8U i; //循环控制变量
for(i=0;i<64;i++)
LcdShowBuff[i]=' ';
}
/*NumFormatChange:数据格式转换子程序---------------------------------------*
*功能:将3个字节的压缩BCD码数据转换为5个字节可显示的ASCII码数据 *
*参数:Data[0--2]三个字节的数据:前两个字节压缩BCD码(00 00 - 99 99) *
* 第三字节为符号位(-、+) *
* ReP[0--4]存放5个字节的转换结果(注意:实际是ASCII码) *
* flag:0-设定值调整,无小数位;1-显示值调整,有一位小数位 *
*举例:Data[0--2]:12 35 + ->ReP[0--5]:+ 1 2 3 . 5 *
* Data[0--2]:01 92 - ->ReP[0--5]:- 1 9 . 2 *
*返回:无 *
*-------------------------------------------------------------------------*/
void NumFormatChange(INT8U * ReP,INT8U * Data,INT8U flag)
{
INT8U i,j,k; //循环控制变量
INT16U * IntDataP; //数据
INT8U sign; //符号
//1:得到可以显示的数据
IntDataP=(INT16U *)Data;
sign=Data[2];
ReP[4]=(*IntDataP)%10+'0';
ReP[3]=((*IntDataP)/10)%10+'0';
ReP[2]=((*IntDataP)/100)%10+'0';
ReP[1]=(*IntDataP)/1000+'0';
//2:显示数据调整,有一位小数
ReP[5]=ReP[4];ReP[4]='.';
//3:调整前导的0为空格
if(ReP[1]=='0')
ReP[1]=0x20;
for(i=2;i<5;i++)
{if((ReP[i-1]==0x20)&&(ReP[i]=='0')&&(ReP[i+1]!='.'))
ReP[i]=0x20;}
//4: 若为负数,添加负号
if(sign=='-')
{for(i=1;i<3;i++)
if(ReP[i+1]!=0x20) break;
ReP[i]=sign;}
//SCISend1('A');
//for(i=1;i<=5;i++) SCISend1(ReP[i]);
//SCISend1('B');
NumFormatChange_End:;
}
/*PackShowBuf:封装LCD的显示缓冲区------------------------------------------*
*功能:将在LCD上显示的当前温度CurrentT、设定温度BasicT *
当前湿度CurrentH、设定湿度BasicH风机情况和时间进行封包*
*参数:当前温度CurrentT、设定温度BasicT、当前温度符号SignCT *
设定温度符号SignBT、当前湿度CurrentH、设定湿度BasicH *
*返回:LCD的显示缓冲区LcdShowBuff *
*-------------------------------------------------------------------------*/
void PackShowBuf(INT8U * LcdShowBuff)
{
INT8U i;
INT8U data[3],buf[6];
//1:当前温度
data[0]=CurrentT>>8;data[1]=CurrentT; data[2]=SignCT;
NumFormatChange(buf,data,1);
for(i=1;i<=5;i++) LcdShowBuff[i]=buf[i];
//2:温度设定值
data[0]=BasicT>>8;data[1]=BasicT; data[2]=SignBT;
NumFormatChange(buf,data,0);
for(i=1;i<=3;i++) LcdShowBuff[i+8]=buf[i];
data[2]='+';
//3:当前湿度
data[0]=CurrentH>>8;data[1]=CurrentH;
NumFormatChange(buf,data,1);
for(i=1;i<=5;i++) LcdShowBuff[i+16]=buf[i];
//4:湿度设定值
data[0]=BasicH>>8;data[1]=BasicH;
NumFormatChange(buf,data,0);
for(i=1;i<=3;i++) LcdShowBuff[i+8+16]=buf[i];
//5:风机状态显示
for(i=0;i<=3;i++) LcdShowBuff[i+2+32]=ColdHot[i+ColdHotFlag*4];
}
/*CheckReFrame:验证接收到的帧----------------------------------------------*
*功能描述:验证接收到的帧 *
*参数:ReFrameBuP指向接收帧缓冲区的指针 *
* ReFrameLength当前接收到的帧的长度 *
*返回:0表示校验正确,1表示收到数据帧格式不正确,2表示异或校验和出错 *
*内部调用:GetCheckChar求数据流的异或校验码子程序 *
*-------------------------------------------------------------------------*/
INT8U CheckReFrame(INT8U * ReFrameBuP,INT8U ReFrameLength)
{
//定义出错标志字节,无错为0
INT8U ErrCode=0;
//收到的数据帧格式不正确,出错标志1
if((ReFrameBuP[0]!='S')||(ReFrameBuP[ReFrameLength-1]!='E'))
{ErrCode=1; goto CheckReFrame_End;}
//收到的数据帧校验和出错,出错标志2
if(GetCheckChar(ReFrameLength-1,ReFrameBuP))
{ErrCode=2; goto CheckReFrame_End;}
CheckReFrame_End: //返回
return ErrCode;
}
/*GetCheckChar:求数据流的异或校验码子程序----------------------------------*
*功能描述:得到数据流的一个字节异或校验码 *
*参数:DataP指向数据流的指针 *
* DataNum为数据流的字节长度 *
*返回:CheckChar:一个字节的异或校验码 *
*内部调用:无 *
*-------------------------------------------------------------------------*/
INT8U GetCheckChar(INT8U DataNum,INT8U * DataP)
{
INT8U i; //用于循环的计数位
INT8U CheckChar=0; //存放一个字节的异或校验码
/*循环求异或校验码*/
for(i=0;i<DataNum;i++)
CheckChar^=DataP[i];
return(CheckChar);
}
/*DePackReBuf:解包接受到的接受缓冲区的内容---------------------------------*
*功能:将接受缓冲区ReBuf的内容解包 *
*参数:接受缓冲区ReBuf *
*返回:当前温度CurrentT、设定温度BasicT、当前温度符号SignCT *
设定温度符号SignBT、当前湿度CurrentH、设定湿度BasicH,系统时间Hour *
错误编号ErrorNo
*-------------------------------------------------------------------------*/
INT8U DePackReBuf(INT8U *buf)
{
INT8U ErrorNo=0;
INT8U tmp[2],i;
//1:验证接收到的帧
ErrorNo=CheckReFrame(buf,15);
if(ErrorNo!=0) goto Exit; //接收到的帧错误,退出操作
if(buf[1]!=MACHINE_NO) return 3;
tmp[0]=buf[2];tmp[1]=buf[3];
BasicT=*(INT16U *)tmp;SignBT=buf[4];//温度设定值
tmp[0]=buf[5];tmp[1]=buf[6];
BasicH=*(INT16U *)tmp; //湿度设定值
for(i=0;i<6;i++) Hour[i]=buf[i+7]; //系统时间
Exit:
return ErrorNo;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -