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

📄 pc鼠标示例源代码.c

📁 ** 描述: PC鼠标
💻 C
📖 第 1 页 / 共 2 页
字号:

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位

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

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

 名称:   显示数据模块

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

         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);

   }

}

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

 名称:   取数模块   

 功能:  依次从数组中取出要显示的数据

 参数:  无

 返回值:unsigned char setdata    要显示的数据

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

unsigned char LeftSet(void)

{

   unsigned char setdata;

   if(ptr_send<=7)

   {

     setdata=send_data[ptr_send];

     ptr_send++;

   }

   else

   {

     setdata=send_data[0];

     ptr_send=0x01;

   }

   return setdata;                     //返回取得的数据

}

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

 名称:   扫描控制模块

 功能:  控制扫描的列

 参数:  无

 返回值:unsigned char setbit  当前扫描的列

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

unsigned char RowScan(void)

{

   unsigned char setbit;

   if(ptr_con1<=7)

   {

     setbit=Row_Control[ptr_con1];

     ptr_con1++;

   }

   else

   {

     setbit=Row_Control[0];

     ptr_con1=0x01;

   }

   return setbit;                       //返回扫描的列

}

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

 名称:   移动控制模块

 功能:  在点阵显示模块上移动显示数据

 参数:  无

 返回值:unsigned char mode  模块模式 

         0---左移  1---右移

                2---上移  3---下移

          unsigned char step  移动距离

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

void Move(unsigned char mode,unsigned char step)

{

    unsigned char i,j;

    unsigned char temp[8];

    for(i=0;i<=7;i++)                  //将要移动的数据放入移动缓冲区

        send_data[i]=move_data[i];

    switch(mode)

    {

        case 0:                     //左移

            j=0;

            for(i=0;i<=7;i++)          //保存显示数据

                temp[i]=send_data[i];  

            for(i=0;i<=7-step;i++)  //左移step位

                send_data[i]=send_data[i+step];

            for(i=8-step;i<=7;i++)  //将移出的数据存回

                send_data[i]=temp[j++];

            break;

        case 1:                     //右移

            j=8-step;

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

                temp[i]=send_data[i];

            for(i=7;i>=step;i--)

                send_data[i]=send_data[i-step];

            for(i=0;i<step;i++)

                send_data[i]=temp[j++];

            break;

        case 2:                    //上移

            for(i=0;i<7;i++)    //将每列数据循环移动step位

                send_data[i]=_cror_(send_data[i],step);

            break;

        case 3:

            for(i=0;i<7;i++)       //下移

                send_data[i]=_crol_(send_data[i],step);

            break;

        default:

            break;

    }

    for(i=0;i<=7;i++)                   //将移动后的数据放入移动数据缓冲区

        move_data[i]=send_data[i];

}

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

 名称:   数据处理模块

 功能:  处理接收到的数据

 参数:  无

 返回值:无

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

void ProcessData()

{

    unsigned char temp;

    BitData=Data_Buf[1];

    button_L=B_dat0;

    button_R=B_dat1;

    button_M=B_dat2;

    flag_X=B_dat4;

    flag_Y=B_dat5;

    length_X=Data_Buf[2];

    length_Y=Data_Buf[0]; 

    if(button_L+button_R+button_M==0)  //没有键被按下

    {

        ChoiceData(move_data);

        if(Data_Buf[0]+Data_Buf[2]!=0) //如果位移不为0

        {

            if(flag_X)                            //左移

            {

                temp=256-length_X;         //取位移绝对值

                X_Rmove+=temp/4;          //每4个单位为1毫米,取位移毫米

                if(flag_Y)                    //上移

                {

                    temp=256-length_Y; //取位移绝对值

                    Y_Dmove+=temp/4;   //每4个单位为1毫米,取位移毫米

                }

                else                            //下移

                {

                    Y_Umove+=length_Y/4;

                }

            }

            else                                    //右移

            {

                X_Lmove+=length_X/4;   //每4个单位为1毫米,取位移毫米

                if(flag_Y)

                {

                    temp=256-length_Y;

                    Y_Dmove+=temp/4;

                }

                else

                {

                    Y_Umove+=length_Y/4;

                }

            }

            Data_Buf[0]=0;                    //清空位移

            Data_Buf[2]=0;

        }

    }

    else                                                         //有键被按下

    {   

        if(button_L+button_M+button_R==1)

        {   

            if(button_L==1)

                ChoiceData(char_L);           //左键被按下

            else if(button_R==1)   

                ChoiceData(char_R);      //右键被按下      

            else 

                ChoiceData(char_M);      //中键被按下      

        }

        else

            ChoiceData(char_S);                   //多个键被按下

    }

}

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

 名称:   定时器中断服务模块  

 功能:  显示图形

 参数:  无

 返回值:无

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

void TimerOver(void) interrupt 1  

{

   DisplayData(RowScan(),LeftSet()); //显示点阵图形

   if(X_Lmove>=1)                               //如果鼠标左移大于等于1毫米

   {

       Move(1,1);                                //左移一个单位

       X_Lmove=0;                             //清除左移长度

   }

   if(X_Rmove>=1)                               //如果鼠标右移大于等于1毫米

   {

       Move(0,1);

       X_Rmove=0;

   }

   if(Y_Umove>=1)                               //如果鼠标上移大于等于1毫米

   {

       Move(2,1);

       Y_Umove=0;

   }

   if(Y_Dmove>=3)                            //如果鼠标下移大于等于1毫米

   {

       Move(3,1);

       Y_Dmove=0;

   }

   TL0=0x78;                       //重置定时器初值0xFCB0

   TH0=0xEC;

}

 


⌨️ 快捷键说明

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