📄 processdata.h
字号:
/**********************************Copyright (c)*********************************
;** 文件名: ProcessData.h
;** 功能: 数据处理头文件,接收和处理键盘发送到主机的数据,
;** 将数据组合好后,利用红外线发送
;** 包含头文件: 无
*********************************************************************************/
#include <at89x52.h> //芯片功能定义头文件
sbit Data_Line=P3^4; //数据线P3_4
sbit Clock_Line=P3^2; //时钟线P3_2
/***********************定义位变量***************************/
unsigned char bdata Temp_Buffer; //接收字节
sbit D_Buf0=Temp_Buffer^0; //Temp_Buffer第0位
sbit D_Buf1=Temp_Buffer^1; //Temp_Buffer第1位
sbit D_Buf2=Temp_Buffer^2;
sbit D_Buf3=Temp_Buffer^3;
sbit D_Buf4=Temp_Buffer^4;
sbit D_Buf5=Temp_Buffer^5;
sbit D_Buf6=Temp_Buffer^6;
sbit D_Buf7=Temp_Buffer^7; //Temp_Buffer第7位0
/************************************************************/
unsigned char Buffer[11]; //缓冲数组 缓存设备到主机的数据
unsigned char Rec_ptr=0x00; //接收数据指针
unsigned char Rec_data=0xFF; //接收数据
unsigned char Buffer_ptr=0x00; //缓冲区数据指针
unsigned char ptr_data=0; //接收数据计数
unsigned char flag_e0=0; //扩展数据E0标志 有E0位1 否则为0
unsigned char Packet[6]; //键盘信息
unsigned char flag_KeyChanged=0; //按键改变标志
const unsigned int code CRC_Code[16]={ /* CRC余式表 */
0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,};
/*******************************************************
名称: CRC校验模块
功能: 对接收到的数据进行CRC校验
参数: unsigned char *ptr 源数据
unsigned char len 数据长度
返回值:int CRC CRC值
*******************************************************/
unsigned int cal_CRC(unsigned char *ptr,unsigned char len)
{
unsigned int CRC=0;
unsigned int temp;
while(len--!=0)
{
temp=((unsigned char)(CRC/256))/16; //暂存CRC的高四位
CRC<<=4; //CRC右移4位,相当于取CRC的低12位
CRC^=CRC_Code[temp^(*ptr/16)]; //CRC的高4位和本字节的前半字节
//相加后查表计算CRC, 然后加上上一次CRC的余数
temp=((unsigned char)(CRC/256))/16; //暂存CRC的高4位
CRC<<=4; //CRC右移4位, 相当于CRC的低12位
CRC^=CRC_Code[temp^(*ptr&0x0f)]; //CRC的高4位和本字节的后半字节
//相加后查表计算CRC,然后再加上上一次CRC的余数
ptr++;
}
return CRC;
}
/*******************************************************
名称: 奇偶校验模块
功能: 对接收到的数据进行奇偶校验
参数: 无
返回值:校验正确 1
校验错误 0
*******************************************************/
unsigned char Checkout(void)
{
ACC=Temp_Buffer; //将数据送A寄存器
if(~P==Buffer[9]) //将奇偶校验位于A寄存器奇偶标志进行比较
return 1;
else
return 0;
}
/*******************************************************
名称: 数据处理模块
功能: 处理接收到的数据
参数: 无
返回值:无
*******************************************************/
void ProcessData()
{
if(Packet[0]==flag_e0 && Packet[1]==Rec_data)
{
flag_KeyChanged=1;
}
else
{
flag_KeyChanged=0;
}
Packet[0]=flag_e0;
Packet[1]=Rec_data;
}
/*******************************************************
名称: 发送模块
功能: 利用串口发送1个字符
参数: 无
返回值:无
*******************************************************/
void SendData()
{
unsigned char i;
unsigned int temp;
unsigned char crch,crcl;
temp=cal_CRC(Packet,2);
crch=temp>>8;
crcl=temp;
Packet[2]=crch;
Packet[3]=crcl;
for(i=0;i<=3;i++)
{
SBUF=Packet[i]; //发送数据送发送缓冲区
while(TI==0); //等待发送完成
TI=0; //置发送完成标志
}
}
/*******************************************************
名称: 组合数据模块
功能: 将接收到的数据为组合成数据
参数: 无
返回值:无
*******************************************************/
void CombinData(void)
{
/*********将接收到的各位赋值给Temp_Buffer对应的位***********/
D_Buf0=Buffer[1];
D_Buf1=Buffer[2];
D_Buf2=Buffer[3];
D_Buf3=Buffer[4];
D_Buf4=Buffer[5];
D_Buf5=Buffer[6];
D_Buf6=Buffer[7];
D_Buf7=Buffer[8];
/************************************************************/
if(Checkout()) //如果奇偶校验正确
{
if(Temp_Buffer!=0xF0)
{
if(ptr_data==0) //处理接收到的第一个数据
{
if(Temp_Buffer==0xE0) //如果接收到的第一个数据为E0
{
flag_e0=1; //置E0标志
ptr_data=1; //允许要求再接收第二个数据
}
else
{
flag_e0=0; //否则清楚FO标志与E0标志
Rec_data=Temp_Buffer; //接收缓冲区中的数据
ptr_data=0;
ProcessData();
return; //跳出此次处理 准备处理下一组数据
}
}
else if(ptr_data==1) //处理接收到的第二个数据
{
if(Temp_Buffer==0xF0) //如果接收到的第二个数据为F0
return;
else
{
Rec_data=Temp_Buffer;
ptr_data=0;
ProcessData();
return;
}
}
else //处理接收到的第三个数据
{
Rec_data=Temp_Buffer; //接收缓冲区中的数据
ptr_data=0; //准备处理下一组数据
ProcessData();
}
}
}
}
/*******************************************************
名称: 外部中断0服务程序
功能: 接收键盘发送到主机的个数据位
参数: 无
返回值:无
*******************************************************/
void ReceiveKeyBoardData(void) interrupt 0
{
TR0=0;
if(Rec_ptr<=10)
{
do{
}while(Clock_Line==0); //等待设备拉高时钟线
Buffer[Rec_ptr++]=Data_Line; //接收数据
}
else
{
CombinData(); //组合接收到的数据
do{
}while(Clock_Line==0); //等待设备拉高时钟线
Buffer[0]=Data_Line; //接收数据
Rec_ptr=0x01;
}
TR0=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -