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

📄 protocol.lst

📁 通过89s51实现的模拟键盘代码
💻 LST
字号:
C51 COMPILER V7.02a   PROTOCOL                                                             04/23/2005 11:28:04 PAGE 1   


C51 COMPILER V7.02a, COMPILATION OF MODULE PROTOCOL
OBJECT MODULE PLACED IN protocol.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE protocol.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          //接收子函数
   2          #include <head.c>
   3          #include <math.h>
   4          volatile unsigned char bdata s_buf,r_buf; //发送缓冲区、接收缓冲区
   5          volatile unsigned char data  last_s;      //上次发送字节
   6          extern bit scan_on;              //扫描状态,main_t.c中定义
   7          sbit s_buf0=s_buf^0;
   8          sbit r_buf7=r_buf^7;
   9          //新添加的变量
  10          unsigned char data send_delay,delay_count;
  11          volatile unsigned char bdata parity_buf;
  12          sbit parity_buf0=parity_buf^0;
  13          volatile unsigned char data first_delay,old_delay;//拍发速率、延迟时间
  14          volatile unsigned char bdata scan_v,temp1,temp2;
  15          sbit c0=scan_v^5;
  16          sbit c1=scan_v^6;
  17          sbit a0=scan_v^0;
  18          sbit a1=scan_v^1;
  19          sbit a2=scan_v^2;
  20          sbit b0=scan_v^3;
  21          sbit b1=scan_v^4;
  22          sbit temp1_0=temp1^0;
  23          sbit temp1_1=temp1^1;
  24          sbit temp1_2=temp1^2;
  25          sbit temp2_0=temp2^0;
  26          sbit temp2_1=temp2^1;
  27          
  28          void set_scan_v(unsigned char vv)//设置扫描速度(拍发速率、延迟时间)
  29          //根据PS2协议,通过vv得到延缓时间first_delay和拍发速率old_delay的值
  30          //系统缺省设置:拍发速率=10个/s±20%,延时=500ms±20%
  31          //根据默认值是SCAN_V_DEFAULT 0x2c 00101100  first_delay=220,old_delay=44
  32          //每计数220个对应延时500ms,每1/440 s计数一次,如果系统频率为11MHz,也就是计数器每计到25000,增加一次计数值
             -send_delay
  33          {
  34   1       scan_v=vv;
  35   1       temp1=0;
  36   1       temp1_0=c0;
  37   1       temp1_1=c1;
  38   1       first_delay=(1+temp1)*60;
  39   1       first_delay=first_delay/6*Frequence;
  40   1       temp1=0;
  41   1       temp2=0;
  42   1       temp1_0=a0;
  43   1       temp1_1=a1;
  44   1       temp1_2=a2;
  45   1       temp2_0=b0;
  46   1       temp2_1=b1;
  47   1       old_delay=(8+temp1)*(1<<temp2);  
  48   1       old_delay=old_delay/6*Frequence;
  49   1      /* unsigned char i,j;
  50   1        double cps;
  51   1        float code repeat_rate[32]={2.0,2.1,2.3,2.5,2.7,3.0,3.3,3.7,4.0,4.3,4.6,5.0,5.5,6.0,6.7,7.5,
  52   1      8.0,8.6,9.2,10.0,10.9,12.0,13.3,15.0,16.0,17.1,18.5,20.0,21.8,24.0,26.7,30.0};
  53   1        i=(vv>>5)&0x03;
  54   1        j=vv&0x1f;
C51 COMPILER V7.02a   PROTOCOL                                                             04/23/2005 11:28:04 PAGE 2   

  55   1        first_delay=(unsigned char)((4/(i+1))*(Frequence/(12*TIMER_COUNT)));
  56   1        cps = 1 /((8 + (vv & 0x07)) * exp(log(2) * ((vv >> 3) & 0x03)) * 0.00417);
  57   1      // old_delay=(unsigned char)(((repeat_rate[j]))*(Frequence/(12*TIMER_COUNT)));
  58   1      */
  59   1      }
  60          
  61          void set_default()//设置缺省值
  62          {
  63   1        KBCLK=1;
  64   1        KBDATA=1;
  65   1        clr_buf();
  66   1        set_scan_v(SCAN_V_DEFAULT);//SCAN_V_DEFAULT在head.c中定义
  67   1      }
  68          
  69          bit parity()//计算parity_buf中一个字节的奇偶校验值
  70           {
  71   1        bit PARITY=1;
  72   1        unsigned char data c;
  73   1        for(c=0;c<8;c++)
  74   1          {
  75   2            PARITY^=parity_buf0;
  76   2            parity_buf=parity_buf>>1;
  77   2          }
  78   1        return PARITY; 
  79   1       }
  80          void delay()//reentrant       //延时24us  
  81           {
  82   1         unsigned char data t=DELAY;
  83   1         for(;--t;);
  84   1       }
  85          
  86           void sleep()       //延时16us
  87           {
  88   1         unsigned char data t=SLEEP;
  89   1         for(;--t;);
  90   1       }
  91          
  92          unsigned char receive(void)      //接收子函数
  93          //返回接收到的字节,接收错误则返回0
  94          {
  95   1          unsigned char data i;
  96   1          bit PARITY;
  97   1          ET1=0;
  98   1          r_buf=0;
  99   1          while(!KBCLK);//等待KBCLK变高
 100   1          delay(); 
 101   1          if(KBDATA)    //KBDATA应该为低,表示接收到起始位,如果此时KBDATA为高,则退出并发送错误状态字0xfe 
 102   1           { send(0xfe);
 103   2             return 0;}
 104   1          delay();
 105   1          sleep();
 106   1          KBCLK=0;      //KBCLK由键盘控制,产生时钟信号
 107   1          for(i=0;i<8;i++)//将KBDATA上的数据在KBCLK的上升沿存入接收缓冲区r_buf7中
 108   1            {
 109   2              delay();
 110   2              sleep();
 111   2              KBCLK=1;
 112   2              sleep();
 113   2              if(!KBCLK) return 0; //如果KBCLK被拉低,表明主机取消发送
 114   2                      r_buf7=KBDATA;
 115   2              if(i!=7)
 116   2                 r_buf=r_buf>>1;
C51 COMPILER V7.02a   PROTOCOL                                                             04/23/2005 11:28:04 PAGE 3   

 117   2              delay();
 118   2              KBCLK=0;
 119   2            }
 120   1          delay();
 121   1          sleep();
 122   1          KBCLK=1;
 123   1          sleep();
 124   1          if(!KBCLK) return 0;   //如果KBCLK被拉低,表明主机取消发送    
 125   1          PARITY=KBDATA;         //接收奇偶校验位
 126   1          delay();
 127   1          KBCLK=0;
 128   1          delay();
 129   1          sleep();
 130   1          KBCLK=1;
 131   1              //停止位
 132   1          delay();
 133   1          if(!KBDATA) {send(0xfe);return 0;}//接收停止位,此时KBDATA应该为高,否则发送0xfe报错
 134   1          KBDATA=0;//发送应答位,表明已经收到主机数据
 135   1          sleep();
 136   1          KBCLK=0;
 137   1          sleep();
 138   1          delay();
 139   1          KBCLK=1; 
 140   1          sleep();
 141   1          KBDATA=1;//将KBCLK和KBDATA置高
 142   1          sleep();
 143   1          ET1=1;   //开中断
 144   1          parity_buf=r_buf;
 145   1          if(PARITY==parity())
 146   1                 return r_buf;
 147   1          else {send(0xfe);return 0;}//判断奇偶校验位是否正确
 148   1              //缺错误处理 *
 149   1              //给主机时间抑制下次的通信
 150   1              sleep();
 151   1          delay();
 152   1      }
 153          
 154          bit send(unsigned char c)       //发送子函数
 155          //返回1表示发送成功,返回0表示发送失败
 156          /*当时钟线和数据线均为高电平时,允许键盘发送数据,系统将接收数据;
 157          当时钟线被拉为低电平时,表明系统禁止数据传输。发送时序包含1个低
 158          电平触发的起始位、8位数据位、1个奇校验位和1个高电平的结束位*/
 159          {
 160   1          unsigned char data i;
 161   1          bit PARITY;
 162   1              KBCLK=1;
 163   1              if(!KBCLK)//主机禁止键盘发送数据
 164   1                return 0;
 165   1          ET1=0;               //关闭中断
 166   1          parity_buf=c;
 167   1          PARITY=parity();//计算c的奇偶校验值
 168   1          last_s=c;       //保存上一次发送字节
 169   1          s_buf=c;        //发送数据缓冲

⌨️ 快捷键说明

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