}
}
/* 处理液晶屏初始显示内容 */
void InitShowStr(){
unsigned char str[17];
str[16] = ‘’;//在最后添加字符串结束符,确保字符串可以结束
E2Read(str, 0x20, 16); //读取第一行字符串,其 E2 起始地址为 0x20
LcdShowStr(0, 0, str); //显示到液晶屏
E2Read(str, 0x40, 16); //读取第二行字符串,其 E2 起始地址为 0x40
LcdShowStr(0, 1, str); //显示到液晶屏
}
/* 内存比较函数,比较两个指针所指向的内存数据是否相同,
ptr1-待比较指针 1,ptr2-待比较指针 2,len-待比较长度
返回值-两段内存数据完全相同时返回 1,不同返回 0 */
bit CmpMemory(unsigned char *ptr1, unsigned char *ptr2, unsigned char len){
while (len--){
if (*ptr1++ != *ptr2++){ //遇到不相等数据时即刻返回 0
return 0;
}
}
return 1; //比较完全部长度数据都相等则返回 1
}
/* 将一字符串整理成 16 字节的固定长度字符串,不足部分补空格
out-整理后的字符串输出指针,in-待整理字符串指针 */
void TrimString16(unsigned char *out, unsigned char *in){
unsigned char i = 0;
while (*in != ‘’){ //拷贝字符串直到输入字符串结束
*out++ = *in++;
i++;
if (i 》= 16){ //当拷贝长度已达到 16 字节时,强制跳出循环
break;
}
}
for ( ; i《16; i++){ //如不足 16 个字节则用空格补齐
*out++ = ‘ ’;
}
*out = ‘’; //最后添加结束符
}
/* 串口动作函数,根据接收到的命令帧执行响应的动作
buf-接收到的命令帧指针,len-命令帧长度 */
void UartAction(unsigned char *buf, unsigned char len){
unsigned char i;
unsigned char str[17];
unsigned char code cmd0[] = “showstr1 ”; //第一行字符显示命令
unsigned char code cmd1[] = “showstr2 ”; //第二行字符显示命令
unsigned char code cmdLen[] = { //命令长度汇总表
sizeof(cmd0)-1, sizeof(cmd1)-1,
};
unsigned char code *cmdPtr[] = { //命令指针汇总表
&cmd0[0], &cmd1[0],
};
for (i=0; i
if (len 》= cmdLen[i]){ //首先接收到的数据长度要不小于命令长度
if (CmpMemory(buf, cmdPtr[i], cmdLen[i])){ //比较相同时退出循环
break;
}
}
}
switch (i){ //根据比较结果执行相应命令
case 0:
buf[len] = ‘’; //为接收到的字符串添加结束符
TrimString16(str, buf+cmdLen[0]); //整理成 16 字节固定长度字符串
LcdShowStr(0, 0, str); //显示字符串 1