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

📄 mouse.h

📁 一个用1602显示的多功能电子钟,内有实时时钟功能和温度显示功能!
💻 H
📖 第 1 页 / 共 2 页
字号:

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

 名称:   取数模块   

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

 参数:  无

 返回值: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(X_Rmove>30)
				{
				P0=table[8]|position[0];
				Delay(10);
				}

               

            }

            else    if(!flag_X)                                  //右移

            {

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

					if(X_Lmove>30)
				{
				P0=table[8]|position[3];
				Delay(10);
				}

                /*if(flag_Y)

                {

                    temp=256-length_Y;

                    Y_Dmove+=temp/4;

                }

                else

                {

                    Y_Umove+=length_Y/4;

                }*/

            }
			 if(flag_Y)                    //上移

                {

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

                    Y_Dmove+=temp/4;   //每4个单位为1毫米,取位移毫米
					if(Y_Dmove>30)
				{
				P0=table[8]|position[1];
				Delay(10);
				}

                }

                else                            //下移

                {

                    Y_Umove+=length_Y/4;
					if(Y_Umove>30)
				{
				P0=table[8]|position[2];
				Delay(10);
				}


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

            Data_Buf[2]=0;

        }

    }

    else                                                         //有键被按下

    {   

        if(button_L+button_M+button_R==1)

        {   

            if(button_L==1)

			{
				P1_7=0;
				Delay(100);
				P1_7=1;

			}

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

            else if(button_R==1)   

		{
				P1_0=0;
				Delay(100);
				P1_0=1;

			}


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

            else 
			{
				P1_3=0;
				Delay(100);
				P1_3=1;

			}



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

        }

        else
			{
				P1=0x00;
				Delay(100);
				P1=0xff;

			}

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

}

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

 名称:   主函数

 功能:  应用程序入口

 参数:  无

 返回值:无

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

void main()

{

     Init_device();                 //调用初始化模块

        Send_data(0xF4);            //使能鼠标,允许鼠标发送数据

     do{

     }while(Temp_Buffer!=0xFA);

     //ChoiceData(char_P);       //显示鼠标点

     while(1)

     {
		P1_2=0;
        ProcessData();        //调用数据处理模块

     }

}   


⌨️ 快捷键说明

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