微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第81节:液晶屏显示串口发送过来的任意汉字和字符

第81节:液晶屏显示串口发送过来的任意汉字和字符

时间:11-22 来源:互联网 点击:

请仔细看讲解。

* 凡是ASCII码都是小于0x80(128)的,根据这个特点可以把ASCII码和机内码分离出来,

* 同时,由于液晶屏的1个坐标必须显示2个编码,对于单个存在的ASCII码,我们要在

* 它的右边多插入一个空格字符0x20。至于如何插入空格0x20字符,请看以下代码。

*/

void usart_service(void) //串口服务程序,在main函数里

{

unsigned int i;

unsigned int uiCodeCnt; //统计接收的有效编码数量

unsigned int uiCodeYu; //对uiCodeCnt求2的余数,方便识别是否是1个ASCII码相邻

if(uiSendCnt>=const_receive_time&&ucSendLock==1) //说明超过了一定的时间内,再也没有新数据从串口来

{

ucSendLock=0; //处理一次就锁起来,不用每次都进来,除非有新接收的数据

uiRcMoveIndex=0; //由于是判断数据头,所以下标移动变量从数组的0开始向最尾端移动 这个变量是用来抗干扰处理的

while(uiRcregTotal>=6&&uiRcMoveIndex<=(uiRcregTotal-6)) //这里的6表示有3个字节的数据头,至少1个有效数据,2个数据结束标志0x0d 0x0a

{

if(ucRcregBuf[uiRcMoveIndex+0]==0xeb&&ucRcregBuf[uiRcMoveIndex+1]==0x00&&ucRcregBuf[uiRcMoveIndex+2]==0x55) //数据头eb 00 55的判断

{

empty_diaplay_buffer(); //把显示缓冲区全部填充空格字符0x20

uiCodeCnt=0; //统计接收的有效编码数量清零

for(i=0;i<(uiRcregTotal-uiRcMoveIndex-3)&&i<48;i++)//这里的3表示有3个字节的数据头。48表示最大只能接收24个汉字,一共48个字节的机内码.

{

if(ucRcregBuf[uiRcMoveIndex+3+i]==0x0d&&ucRcregBuf[uiRcMoveIndex+4+i]==0x0a) //结束标志0x0d 0x0a的判断

{

uiVoiceCnt=const_voice_short; //蜂鸣器发出声音,表示数据接收正确完毕

ucWd1Part1Update=1; //及时更新显示第2,3,4行内容的信息

break; //退出for循环

}

else //收集有效信息编码进入显示缓冲区

{

uiCodeYu=uiCodeCnt%2; //对2求余数,用来识别相信的2个是否是机内码,否则要进行插入填充0x20处理

if(uiCodeYu==1)

{

if(ucRcregBuf[uiRcMoveIndex+3+i]>=0x80&&ucRcregBuf[uiRcMoveIndex+3+i-1]<0x80) //如果当前的是机内码,而上一个不是机内码

{

ucDispplayBuffer[uiCodeCnt]=0x20; //当前的先填充插入空格字符0x20

uiCodeCnt++; //统计接收的有效编码数量

}

}

ucDispplayBuffer[uiCodeCnt]=ucRcregBuf[uiRcMoveIndex+3+i]; //收集有效信息编码进入显示缓冲区

uiCodeCnt++; //统计接收的有效编码数量

}

}

break; //退出while循环

}

uiRcMoveIndex++; //因为是判断数据头,游标向着数组最尾端的方向移动

}

uiRcregTotal=0; //清空缓冲的下标,方便下次重新从0下标开始接受新数据

}

}

void T0_time(void) interrupt 1 //定时中断

{

TF0=0; //清除中断标志

TR0=0; //关中断

if(uiSendCnt

{

uiSendCnt++; //表面上这个数据不断累加,但是在串口中断里,每接收一个字节它都会被清零,除非这个中间没有串口数据过来

ucSendLock=1; //开自锁标志

}

if(uiVoiceCnt!=0)

{

uiVoiceCnt--; //每次进入定时中断都自减1,直到等于零为止。才停止鸣叫

beep_dr=0; //蜂鸣器是PNP三极管控制,低电平就开始鸣叫。

}

else

{

; //此处多加一个空指令,想维持跟if括号语句的数量对称,都是两条指令。不加也可以。

beep_dr=1; //蜂鸣器是PNP三极管控制,高电平就停止鸣叫。

}

TH0=0xfe; //重装初始值(65535-500)=65035=0xfe0b

TL0=0x0b;

TR0=1; //开中断

}

void usart_receive(void) interrupt 4 //串口接收数据中断

{

if(RI==1)

{

RI = 0;

++uiRcregTotal;

if(uiRcregTotal>const_rc_size) //超过缓冲区

{

uiRcregTotal=const_rc_size;

}

ucRcregBuf[uiRcregTotal-1]=SBUF; //将串口接收到的数据缓存到接收缓冲区里

uiSendCnt=0; //及时喂狗,虽然main函数那边不断在累加,但是只要串口的数据还没发送完毕,那么它永远也长不大,因为每个中断都被清零。

}

else //我在其它单片机上都不用else这段代码的,可能在51单片机上多增加" TI = 0;"稳定性会更好吧。

{

TI = 0;

}

}

void delay_short(unsigned int uiDelayShort)

{

unsigned int i;

for(i=0;i

{

;

}

}

void delay_long(unsigned int uiDelayLong)

{

unsigned int i;

unsigned int j;

for(i=0;i

{

for(j=0;j<500;j++) //内嵌循环的空指令数量

{

; //一个分号相当于执行一条空语句

}

}

}

void initial_myself(void) //第一区 初始化单片机

{

beep_dr=1; //用PNP三极管控制蜂鸣器,输出高电平时不叫。

//配置定时器

TMOD=0x01; //设置定时器0为工作方式1

TH0=0xfe; //重装初始值(65535-500)=65035=0xfe0b

TL0=0x0b;

//配置串口

SCON=0x50;

TMOD=0X21;

IP =0x10; //把串口中断设置为最高优先级,必须的。

TH1=TL1=-(11059200L/12/32/9600); //这段配置代码具体是什么意思,我也不太清楚,反正是跟串口波特率有关。

TR1=1;

}

void initial_peripheral(void) //第二区 初始化外围

{

EA=1; //开总中断

ES=1; //允许串口中断

ET0=1; //允许定时中断

TR0=1; //启动定时中断

LCDIni

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top