📄 anayserial.c
字号:
/**************************************************************/
/**文件名:anayserial.c **/
/** **/
/**文件描述: 通过RS232接收上位机的数据,对该数据进行分析; **/
/** 显示相应的内容,发出相应的语音. **/
/** 数据类型分为:机器内码形式,点阵形式,固定语句形式 **/
/** **/
/**创建人: 陈芸 时间: 2007年07月17日 **/
/** **/
/**版本号: 01 **/
/**修改记录 **/
/**************************************************************/
#include<reg52.h>
#include<absacc.h>
#include<def_pin.h>
#include<def_para.h>
#include<def_code.h>
void WDFeed(void);
void Tx(void);
void rom2ram_hanzi(uchr x,ulng y);
void rom2ram_ascii(uchr x,uchr y);
void main(void)
{
uchr cnt_zi=0,tmpi=0,tmpq=0,tmpw=0,tp=0,tmp=0;
uint i=0;
ulng tmpoffset=0;
uchr style=0,length_h=0,length_l=0,chk=0,length_s=0;
uint length_d=0;
bit f_over=0;
//片内扩展DATA设置
CHPENR=0x87;
CHPENR=0x59;
CHPCON=0x00; //CHPCON|=0x10;//片内外部存储器写允许 //CHPCON=0x00; ----则片内外部存储器写禁止
//串口初始化
TMOD=0x21; //定时器0,方式1;定时器1,方式2
TH1=0X0fd;
TL1=0x0fd;
PCON=0x00;
SCON=0x50;
//定时器初始化
TH0=0xfc;//定时1ms
TL0=0x66;
//外部中断初始化
IT0=1;
//设置中断优先级
PS=1;
PX0=1;
PT0=1;
//开中断
EA=1;
ES=1;
ET0=1;
ET1=1;
EX0=1;
TR1=1;
TR0=1;
pin_wrram=1;
pin_full=1;
while(1)
{
WDFeed();
if(f_delaywr==1)
{
f_delaywr=0;
//硬件写置1
pin_wrram=1;
if(f_normdisp==1)
{
f_normdisp=0;
cnt_zi=0;
tmpi=0;
for(i=0;i<lengthnorm;i++)
{
tp=codebuff[i];
if(tp>0x80) //汉字
{
tmpi++;
cnt_zi++;
if(tmpi==2)
{
tmpi=0;
tmpq=codebuff[i-1]-0xa0;
tmpw=codebuff[i]-0xa0;
tmpoffset=(ulng)((tmpq-1)*94+(tmpw-1))*32;
WDFeed();
CHPCON=0x00;
rom2ram_hanzi(cnt_zi,tmpoffset);
}
}
else //ASCII 码
{
if(tmpi!=0)
{
tmpi=0;
break;
}
else
{
cnt_zi++;
WDFeed();
//分析ASCii码
CHPCON=0x00;
tp=codebuff[i];
rom2ram_ascii(cnt_zi,tp);
}
}
}
}
if(f_leddisp==1)
{
f_leddisp=0;
if(f_over==1)
{
for(i=0;i<128;i++)
{
CHPCON=0x00;
ram_ce=0;
nDispRam[i]=rxbuff[i];
ram_ce=1;
}
for(i=0;i<(length_d-128);i++)
{
CHPCON|=0x10;
tmpi=rxbuff2[i];
CHPCON=0x00;
ram_ce=0;
nDispRam[128+i]=tmpi;
ram_ce=1;
}
for(i=0;i<(lengthled-length_d);i++)
{
ram_ce=0;
nDispRam[length_d+i]=0;
ram_ce=1;
}
}
else
{
for(i=0;i<length_d;i++)
{
ram_ce=0;
nDispRam[i]=rxbuff[i];
ram_ce=1;
}
for(i=0;i<(lengthled-length_d);i++)
{
ram_ce=0;
nDispRam[i+length_d]=0;
ram_ce=1;
}
}
}
f_fixdisp=0;
f_normdisp=0;
f_leddisp=0;
f_wrramover=1;
pin_wrram=0;
}
if(f_anayrx==1) //接收完数据后,对所接收的数据进行分析
{
f_anayrx=0;
f_over=f_over128;
length_d=lengthdisp;
length_s=lengthsound;
style=dispstyle;
length_h=displength_h;
length_l=displength_l;
chk=rx_check;
check=0;
check^=style;
check^=length_h;
check^=length_l;
if(f_over==1)
{
for(i=0;i<128;i++)
{
check^=rxbuff[i];
}
for(i=0;i<(length_d-127);i++)
{
check^=rxbuff2[i];
}
}
else
{
for(i=0;i<length_d;i++)
{
check^=rxbuff[i];
}
}
check^=length_s;
for(i=0;i<length_s;i++)
{
check^=soundbuff[i];
}
if(check!=chk)
{
f_transerr=1;
Tx();
}
else
{
f_transsuc=1;
Tx();
//分析语音部分
tp=length_s%2;
if(tp==0)
{
if(length_s==0x0)
{
f_handlesound=0;
isd_ce=1;
}
else
{
//save sound
for(i=0;i<length_s;i++)
{
tp=i%2;
if(tp==0)
{
if(soundbuff[i]>3)
{
f_err=1;
break;
}
}
}
if(f_err==1)
{
f_handlesound=0;
}
else
{
f_handlesound=1;
}
}
}
else
{
f_handlesound=0;
}
if(style==full)
{
//全屏
}
if(style==norm)
{
if((length_d<lengthnorm)||(length_d==lengthnorm))
{
if(length_d==0)
{
//清屏
pin_wrram=1;
f_wrramover=1;
}
else
{
for(i=0;i<lengthnorm;i++)
{
if(i<length_d)
{
codebuff[i]=rxbuff[i];
}
else
{
codebuff[i]=0x0;
}
}
f_normdisp=1;
f_leddisp=0;
f_fixdisp=0;
f_t_delaywr=1;
pin_wrram=1;
}
}
}
if(style==led)
{
if((length_d<lengthled)||(length_d==lengthled))
{
if(length_d==0)
{
//清屏
pin_wrram=1;
f_wrramover=1;
}
else
{
f_normdisp=0;
f_leddisp=1;
f_fixdisp=0;
f_t_delaywr=1;
pin_wrram=1;
}
}
}
if(style==fix)
{
for(i=0;i<12;i++)
{
if(rxbuff[i]>0x7f)
{
f_err=1;
break;
}
}
if(f_err==0)
{
if(length_d==12)
{
codebuff[0]=0xbd;
codebuff[1]=0xf0;
codebuff[2]=0xb6;
codebuff[3]=0xee;
codebuff[4]=rxbuff[0];
codebuff[5]=rxbuff[1];
codebuff[6]=rxbuff[2];
codebuff[7]=rxbuff[3];
codebuff[8]=rxbuff[4];
codebuff[9]=rxbuff[5];
codebuff[10]=0xd4;
codebuff[11]=0xaa;
codebuff[12]=0xd3;
codebuff[13]=0xe0;
codebuff[14]=0xb6;
codebuff[15]=0xee;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -