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

📄 display.h

📁 C51单片机实现对PC鼠标的读取与显示具体细节请参考源程序将时钟线接入外部中断数据线接入普通I/O输入输出口
💻 H
字号:
/**********************************Copyright (c)*********************************
;**       文件名:       pointdisplay.h
;**       功能:         点阵显示头文件,在点阵模块上显示图形
;**       包含头文件:    intrins.h  Keil内部函数头文件
*********************************************************************************/ 
#include <intrins.h>
/*************************点阵显示数据字符编码**********************************/
//鼠标移动点
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位
/************************************************************/
/*******************************************************
 名称:   显示数据模块
 功能:  将要显示的数据送到点阵模块显示
         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 + -