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

📄 mouse.h

📁 一个用1602显示的多功能电子钟,内有实时时钟功能和温度显示功能!
💻 H
📖 第 1 页 / 共 2 页
字号:
#include <at89x52.h>
#include <intrins.h>
/************************************************************/                    

sbit Data_Line=P3^5;                       //数据线P3_5

sbit Clock_Line=P3^3;                            //时钟线P3_3

unsigned char table[10]={0,8,4,12,2,10,6,14,1,9};	//LED灯显示数字	  

unsigned char position[4] ={16,32,64,128};			  //LED灯选位

/***********************定义位变量***************************/

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;                  //数据处理指针


/*******************点阵显示数据字符编码*****************************/

//鼠标移动点

const unsigned char code char_P[8]={0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00};

//鼠标左键被按下

const unsigned char code char_L[8]={0x00,0x24,0x14,0x8C,0x97,0xF4,0x94,0x84};

//鼠标中键被按下

const unsigned char code char_M[8]={0x00,0x3C,0x24,0xFF,0xFF,0x24,0x3C,0x00};

//鼠标右键被按下

const unsigned char code char_R[8]={0x00,0x24,0x14,0xEC,0xA7,0xA4,0xA4,0xE4};

//多个按键被按下

const unsigned char code char_S[8]={0xFF,0xFF,0xFF,0xE7,0xF7,0xFF,0xFF,0xFF};

//---------------------------------扫描位数组----------------------------------

const unsigned char Row_Control[8]={0xFE,0xFD,0xFB,0xF7,

0xEF,0xDF,0xBF,0x7F};

unsigned char send_data[8];      //发送数据缓冲区

//鼠标移动数据缓冲区

unsigned char move_data[8]={0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00}; 

unsigned char ptr_send=0x00;     //发送数据指针     

unsigned char ptr_con1=0x00;     //扫描指针 

unsigned char button_L;                  //左键标志

unsigned char button_R;                  //右键标志

unsigned char button_M;                 //中键标志

unsigned char length_X;                  //横向位移

unsigned char length_Y;                  //纵向位移

unsigned char flag_Y;                 //横向移动标志 左移为1,右移为0

unsigned char flag_X;                 //纵向移动标志 下移位1,上移为0

unsigned char X_Lmove;                //横向左移距离

unsigned char Y_Umove;                //横向右移距离

unsigned char X_Rmove;                //纵向上移距离

unsigned char Y_Dmove;                //纵向下移距离

/***********************定义位变量***************************/

unsigned char bdata BitData;      //控制信息字节

sbit B_dat0=BitData^0;                    //BitData第0位

sbit B_dat1=BitData^1;

sbit B_dat2=BitData^2;

sbit B_dat3=BitData^3;

sbit B_dat4=BitData^4;

sbit B_dat5=BitData^5;

sbit B_dat6=BitData^6;

sbit B_dat7=BitData^7;                      //BitData第7位

/*******************************************************

 名称:   初始化运行环境   

 功能:  初始化各寄存器与端口状态

 参数:  无

 返回值:无

********************************************************/

void Init_device(void)

{

     EA=1;

     EX1=1;                               //允许外部中断1

     TL0=0xf0;              //置定时器初值0x3CB0  中断时间为25ms

     TH0=0xd8;

     TMOD=0x01;            //设定定时器/计数器0工作方式为1

     ET0=0x01;              //允许全局中断,允许定时器/计数器0溢出中断

     PX1=1;                              //设置中断优先级

     PT0=0;

     TR0=0x01;             //启动定时器/计数器0

}
/*******************************************************
 名称:   延时模块
*******************************************************/     

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;

     }

}




/*******************************************************

 名称:   显示数据模块

 功能:  将要显示的数据送到点阵模块显示

         P1_5 控制线  P1_6 数据线  P1_7 时钟线

 参数:  unsigned char s_bit   扫描列控制

         unsigned char s_data  显示数据

 返回值:无

*******************************************************/              

void DisplayData(unsigned char s_bit,unsigned char s_data)

{

   unsigned char m,n;

   P1_5=0x00;                 //拉低时钟线和控制线抑制发送

   P1_7=0x00;

   for(m=0;m<=7;m++)          //从低位到高位按位发送数据

   {                          

      P1_6=(s_bit<<m)&0x80;

      P1_7=0x01;              //拉高时钟线允许发送

      P1_7=0x00;              //拉低时钟线抑制发送

   }

   for(n=0;n<=7;n++)

   {

      P1_6=(s_data<<n)&0x80;

      P1_7=0x01;

      P1_7=0x00;

   }

   P1_5=0x01;                 //拉高控制线将移位寄存器送点阵显示

   P1_5=0x00;                 //拉底控制线锁存数据

}

/*******************************************************

 名称:   选取显示图形数据模块  

 功能:  选取显示图形对应的数据

 参数:  unsigned char *ptr     图形对应数组的数组名

 返回值:无

*******************************************************/

void ChoiceData(unsigned char *ptr) reentrant

{

   unsigned char temp;

   for(temp=0x00;temp<=0x07;temp++)

   {

       send_data[temp]=*(ptr+temp);

   }

}

⌨️ 快捷键说明

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