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

📄 com.h

📁 C51单片机实现对PC鼠标的读取与显示具体细节请参考源程序将时钟线接入外部中断数据线接入普通I/O输入输出口
💻 H
字号:
/**********************************Copyright (c)*********************************
;**       文件名:       com.h
;**       功能:         数据处理头文件,接收和处理鼠标发送到主机的数据
;**                      发送对鼠标的控制命令
;**       包含头文件:    at89x52.h   芯片功能模块定义 
*********************************************************************************/
#include <at89x52.h>
/************************************************************/		         
sbit Data_Line=P3^5;				 //数据线P3_5
sbit Clock_Line=P3^3;				 //时钟线P3_3
/***********************定义位变量***************************/
unsigned char bdata Temp_Buffer;	 //接收字节
sbit D_Buf0=Temp_Buffer^0;		     //Temp_Buffer第0位
sbit D_Buf1=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 Data_Buf[3];            //接收鼠标数据缓冲区
unsigned char Buffer_ptr=0x00;		  //缓冲区指针
unsigned char Data_ptr=0;			  //数据处理指针
/*******************************************************
 名称:   延时模块
 功能:  软件延时
 参数:  unsigned int count 延时长度
 返回值:无
*******************************************************/     
void Delay(unsigned int count)
{  
	unsigned char j,k;
    unsigned int i;
    for(i=0;i<count;i++)
       for(j=0;j<10;j++)
          for(k=0;k<120;k++)
           ;
}
/*******************************************************
 名称:   发送模块
 功能:  发送一个字节的控制命令
 参数:  unsigned char dat 控制命令
 返回值:无
*******************************************************/     
//发送一个字符
void Send_data(unsigned char dat)
{
     unsigned char ptr;
     TR0=0;					         //关闭定时器
     EX1=0;					         //关闭外部中断1
     ACC=dat;				         //将要发送的数据放入A寄存器
     Clock_Line=0;			         //拉低时钟线
     Delay(30);				         //延时100ms以上
     Data_Line=0;			         //拉低数据线
     Delay(2);
     Clock_Line=1;			         //释放时钟线
     for(ptr=0;ptr<=7;ptr++)         //低位在前,一次发送8个数据位
     {
         do{
         }while(Clock_Line==1);      //等待设备释放时钟线
         Data_Line=(dat>>ptr)&0x01;  //发送数据位
         do{
         }while(Clock_Line==0);	     //等待设备拉低时钟线
     }
     do{
     }while(Clock_Line==1);
     Data_Line=~P;				     //发送校验位,奇校验
     do{
     }while(Clock_Line==0);
     
     do{
     }while(Clock_Line==1);
     Data_Line=1;					 //发送停止位
     do{
     }while(Clock_Line==0);
     
     do{
     }while(Clock_Line==1);
     do{
     }while(Clock_Line==0);

     EX1=1;						     //打开外部中断1
     TR0=1;						     //打开定时器中断
}
/*******************************************************
 名称:   奇偶校验模块
 功能:  对接收到的数据进行奇偶校验
 参数:  无
 返回值:校验正确  1
         校验错误  0
*******************************************************/  
unsigned char Checkout(void)
{
     ACC=Temp_Buffer;
     if(~P==Buffer[9])
        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(Data_ptr<=2)         //将鼠标发送的3字节信号分别存入缓冲区
            Data_Buf[Data_ptr++]=Temp_Buffer; 
        else
        {
            Data_Buf[0]=Temp_Buffer; 
            Data_ptr=1;
        }
     }
}
/*******************************************************
 名称:   外部中断1服务程序
 功能:  接收鼠标发送到主机的各个数据位
 参数:  无
 返回值:无
*******************************************************/
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;
     }
} 

⌨️ 快捷键说明

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