⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 receivedata.h

📁 C51单片机通过红外通信实现PC键盘的无线通信 读取与显示具体细节请参考源程序将时钟线接入外部中断数据线接入普通I/O输入输出口
💻 H
字号:
/**********************************Copyright (c)*********************************
;**       文件名:       receivedata.h
;**       功能:         数据处理头文件,接收和处理键盘发送到主机的数据
;**       包含头文件:    无 
*********************************************************************************/ 
unsigned char ptr=0;
unsigned char flag_e0=0;
unsigned char Rec_data;
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 CheckCRC()
{
    unsigned int temp=cal_CRC(ReceiveData,4);
    if(temp==0)
        return 1;
    else
        return 0;
}
/*******************************************************
 名称:   数据处理模块   
 功能:  处理接收到的数据
 参数:  无
 返回值:无
*******************************************************/
void ProcessData()
{
    if(CheckCRC())
    {
       flag_e0=ReceiveData[0]; 
       Rec_data=ReceiveData[1];
    }
}
/*******************************************************
 名称:   显示模块
 功能:  将键盘的案件在点阵显示模块上显示出来
 参数:  无
 返回值:无
*******************************************************/
void Display(void)
{
    ProcessData();
    if(flag_e0!=1)     //处理简单数据 无F0标志
	{
		switch(Rec_data)
		{
			case 0x1C:
				ChoiceData(char_A);
				break;
			case 0x32:
				ChoiceData(char_B);
				break;
			case 0x21:
				ChoiceData(char_C);
				break;
			case 0x23:
				ChoiceData(char_D);
				break;
			case 0x24:  
				ChoiceData(char_E);
				break;
			case 0x2B:
				ChoiceData(char_F);
				break;
			case 0x34:
				ChoiceData(char_G);
				break;
			case 0x33:
				ChoiceData(char_H);
				break;
			case 0x43:
				ChoiceData(char_I);
				break;
			case 0x3B:
				ChoiceData(char_J);
				break;
			case 0x42:
				ChoiceData(char_K);
				break;
			case 0x4B:
				ChoiceData(char_L);
				break;
			case 0x3A:
				ChoiceData(char_M);
				break;
			case 0x31:
				ChoiceData(char_N);
				break;
			case 0x44:
				ChoiceData(char_O);
				break;
			case 0x4D:
				ChoiceData(char_P);
				break;
			case 0x15:
				ChoiceData(char_Q);
				break;
			case 0x2D:
				ChoiceData(char_R);
				break;
			case 0x1B:
				ChoiceData(char_S);
				break;
			case 0x2C:
				ChoiceData(char_T);
				break;
			case 0x3C:
				ChoiceData(char_U);
				break;
			case 0x2A:
				ChoiceData(char_V);
				break;
			case 0x1D:
				ChoiceData(char_W);
				break;
			case 0x22:
				ChoiceData(char_X);
				break;
			case 0x35:
				ChoiceData(char_Y);
				break;
			case 0x1A:
				ChoiceData(char_Z);
				break;
			case 0x45:
				ChoiceData(char_0);
				break;
			case 0x16:
				ChoiceData(char_1);
				break;
			case 0x1E:
				ChoiceData(char_2);
				break;
			case 0x26:
				ChoiceData(char_3);
				break;
			case 0x25:
				ChoiceData(char_4);
				break;
			case 0x2E:
				ChoiceData(char_5);
				break;
			case 0x36:
				ChoiceData(char_6);
				break;
			case 0x3D:
				ChoiceData(char_7);
				break;
			case 0x3E:
				ChoiceData(char_8);
				break;
			case 0x46:
				ChoiceData(char_9);
				break;
			case 0x70:
				ChoiceData(char_0);
				break;
			case 0x69:
				ChoiceData(char_1);
				break;
			case 0x72:
				ChoiceData(char_2);
				break;
			case 0x7A:
				ChoiceData(char_3);
				break;
			case 0x6B:
				ChoiceData(char_4);
				break;
			case 0x73:
				ChoiceData(char_5);
				break;
			case 0x74:
				ChoiceData(char_6);
				break;
			case 0x6C:
				ChoiceData(char_7);
				break;
			case 0x75:
				ChoiceData(char_8);
				break;
			case 0x7D:
				ChoiceData(char_9);
				break;
			case 0x05:
				ChoiceData(char_F1);
				break;
			case 0x06:
				ChoiceData(char_F2);
				break;
			case 0x04:
				ChoiceData(char_F3);
				break;
			case 0x0C:
				ChoiceData(char_F4);
				break;
			case 0x03:
				ChoiceData(char_F5);
				break;
			case 0x0B:
				ChoiceData(char_F6);
				break;
			case 0x83:
				ChoiceData(char_F7);
				break;
			case 0x0A:
				ChoiceData(char_F8);
				break;
			case 0x01:
				ChoiceData(char_F9);
				break;
			case 0x09:
				ChoiceData(char_F10);
				break;
			case 0x78:
				ChoiceData(char_F11);
				break;
			case 0x07:
				ChoiceData(char_F12);
				break;
			case 0x5A:
				ChoiceData(char_ET);
				break;
			case 0x12:
				ChoiceData(char_SH);
				break;
			case 0x29:
				ChoiceData(char_SP);
				break;
			case 0x11:
				ChoiceData(char_AT);
				break;
			case 0x14:
				ChoiceData(char_CT);
				break;
			case 0x0D:
				ChoiceData(char_TB);
				break;
			case 0x58:
				ChoiceData(char_CP);
				break;
			case 0x59:
				ChoiceData(char_SH);
				break;
            case 0x54:              //左中括号
				ChoiceData(char_LKuo);
				break;
			case 0x5B:              //右中括号
				ChoiceData(char_RKuo);
				break;
            case 0x66:              //退格键
	       		ChoiceData(char_Back);
				break;
			case 0x79:              //加号
				ChoiceData(char_Add);
				break;
            case 0x7B:              //减号
				ChoiceData(char_Sub);
				break;
			case 0x7C:              //乘号
				ChoiceData(char_Mul);
				break;
            case 0x4C:              //分号
				ChoiceData(char_Fen);
				break;
			case 0x41:              //逗号
				ChoiceData(char_Dou);
				break;
            case 0x49:              //句号
				ChoiceData(char_Jue);
				break;
			case 0x4A:              //斜杠
				ChoiceData(char_Sla);
				break;
            case 0x52:              //分割号
				ChoiceData(char_Jian);
				break;
			case 0x0E:              //点号
				ChoiceData(char_Dian);
				break;
            case 0x4E:              //下划线
				ChoiceData(char_DLine);
				break;
			case 0x55:              //等号
				ChoiceData(char_Den);
				break;
            case 0x5D:              //反斜杠
				ChoiceData(char_FSla);
				break;
			case 0x76:              //ESC键
				ChoiceData(char_Esc);
				break;
            case 0x71:              //ESC键
				ChoiceData(char_Jue);
				break;
			default:
                ChoiceData(char_NULL);
				break;
			}
		}
		else 
		{
			switch(Rec_data)
			{
				case 0x5A:
					ChoiceData(char_ET);
					break;
				case 0x11:
					ChoiceData(char_AT);
					break;
				case 0x14:
					ChoiceData(char_CT);
					break;
				case 0x75:
					ChoiceData(char_Upper);
					break;
				case 0x6B:
					ChoiceData(char_Left);
					break;
				case 0x72:
					ChoiceData(char_Down);
					break;
				case 0x74:
					ChoiceData(char_Right);
					break;
                case 0x4A:              
					ChoiceData(char_Sla);
                    break;
                case 0x1F:
    				ChoiceData(char_Win);
					break;
                case 0x27:
					ChoiceData(char_Win);
					break;
                case 0x2F:
					ChoiceData(char_Apps);
					break;
                case 0x71:
					ChoiceData(char_Jue);
					break;
				default:
                    ChoiceData(char_NULL);
	       			break;
               }
           }
}
/*******************************************************
 名称:   接收中断模块   
 功能:  将接收到的数据保送数码管显示
 参数:  无
 返回值:无
*******************************************************/
void Receive (void) interrupt 4
{
    if(RI)                          //当接收终端标志设立时,开始读取接收到的数据
    {
        RI = 0;                     //清除接收终端标志
        if(ptr<=3)
        {
            ReceiveData[ptr++]=SBUF;          //将接收到的数据送缓冲区保存
        }
        else
        {
            ReceiveData[0]=SBUF;          //将接收到的数据送缓冲区保存
            ptr=1;
        }
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -