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

📄 tracert.h

📁 C51单片机实现对PC键盘的读取与显示 具体细节请参考源程序 将时钟线接入外部中断 数据线接入普通I/O输入输出口
💻 H
字号:
/**********************************Copyright (c)*********************************
;**       文件名:       tracert.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
/*******************************************************
 名称:   奇偶校验模块
 功能:  对接收到的数据进行奇偶校验
 参数:  无
 返回值:校验正确  1
         校验错误  0
*******************************************************/
unsigned char Checkout(void)
{
     ACC=Temp_Buffer;                 //将数据送A寄存器
     if(~P==Buffer[9])                //将奇偶校验位于A寄存器奇偶标志进行比较
        return 1;
     else
        return 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; 
                    return;                //跳出此次处理 准备处理下一组数据
				}
			}
			else if(ptr_data==1)           //处理接收到的第二个数据
			{
				if(Temp_Buffer==0xF0)      //如果接收到的第二个数据为F0
				    return;
				else
				{
					Rec_data=Temp_Buffer;
					ptr_data=0;
                    return;
				}
			}
			else                           //处理接收到的第三个数据
			{
				Rec_data=Temp_Buffer;      //接收缓冲区中的数据 
				ptr_data=0;                //准备处理下一组数据
            }
		}
	}
}
/*******************************************************
 名称:   外部中断0服务程序
 功能:  接收键盘发送到主机的各个数据位
 参数:  无
 返回值:无
*******************************************************/
void ReceiveData(void)  interrupt 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;
     }
} 
/*******************************************************
 名称:   显示模块
 功能:  将键盘的案件在点阵显示模块上显示出来
 参数:  无
 返回值:无
*******************************************************/
void Display(void)
{
    if(flag_e0!=1)     //处理简单数据 无断码标志 无E0标志
	{
		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 					   //处理带E0标志的数据
		{
			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;
               }
           }
}

⌨️ 快捷键说明

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