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

📄 ps2_bin.lst

📁 ps2的驱动
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.07   PS2_BIN                                                               05/26/2005 16:04:50 PAGE 1   


C51 COMPILER V7.07, COMPILATION OF MODULE PS2_BIN
OBJECT MODULE PLACED IN PS2_BIN.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PS2_BIN.C BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*****************************************************************************/
   2          //main.c
   3          //功能:从PS/2口接受键盘信息,解码成ACSII码,通过UART发送出去,并且控制键盘
   4          //修改:
   5          //时间:2006-7-8
   6          //作者:R.S.J
   7          /*****************************************************************************/
   8          
   9          #include <reg51.h>
  10          #include <intrins.h>
  11          
  12          //#include "PS2.h"
  13          
  14          #define EINT (EA = 1)
  15          #define DINT (EA = 0)
  16          
  17          #define MAXBUFFER 15
  18          
  19          #define WAITFORKEYBOARDPULSE  while(!scl); while(scl)
  20          
  21          #define COMMAND_RESET     0xFF  //命令:复位键盘
  22          #define COMMAND_READID    0xF2 //命令:读键盘ID
  23          #define COMMAND_SETSTATUS 0xED //命令:设置状态CapsLock,NumLock,ScrollLock
  24          #define COMMAND_SETRATE   0xF3 //命令:设置速率,延时
  25          #define COMMAND_ENABLE    0xF4 //命令:使能键盘
  26          #define CAPSLOCK_EN       0x04  //使能CapsLock  灯
  27          #define NUMLOCK_EN        0x02  //使能NumLock   灯
  28          #define SCROLLLOCK_EN     0x01  //使能ScrollLock灯
  29          #define CAPSLOCK_DIS      0x03  //关闭CapsLock灯
  30          #define NUMLOCK_DIS       0x05  //关闭NumLock灯
  31          #define SCROLLLOCK_DIS    0x06 //关闭ScrollLock灯
  32          #define DISALL            0x00  //关闭所有灯
  33          
  34          
  35          #define CODE_POST     0xAA  //键盘上电自检成功 Power On Self Test
  36          #define CODE_ACK      0xFA  //键盘应答码
  37          #define CODE_ECHO     0xEE  //键盘的回应码
  38          #define CODE_BREAK    0xF0  //断码
  39          #define CODE_EXTEND   0xE0  //扩展码
  40          #define CODE_PAUSE    0xE1  //Pause键起始码 E1+14+77/E1+F0+14/F0+77
  41          #define CODE_LSHIFT   0x12  //左Shift键通码
  42          #define CODE_RSHIFT   0x59  //右Shift键通码
  43          #define CODE_LCTRL    0x14  //左CTRL键通码
  44          #define CODE_RCTRL    0x14  //右CTRL键通码 0xE0,0x14
  45          #define CODE_LALT     0x11  //左ALT键通码
  46          #define CODE_RALT     0x11  //右ALT键通码  0xE0,0x11
  47          #define CODE_NUMLOCK  0x77  //NumLock键
  48          #define CODE_CAPSLOCK 0x58  //CapsLock键
  49          #define CODE_SCROLLLOCK 0x7E//SCROLLLOCK键
  50          #define nodefinedkey   0x00//
  51          
  52          #define OUTPORT P2    //电平输出口定义
  53          
  54          /* 函数定义 */
  55          unsigned char ReadPS2(); //读PS2端口获取PS2发送的数据
C51 COMPILER V7.07   PS2_BIN                                                               05/26/2005 16:04:50 PAGE 2   

  56          void KeyScan();          //获得键值
  57          void KeyTransmit();      //发送键值
  58          void Order(unsigned char);            //向键盘发送命令
  59          //void KickDog();          //喂狗
  60          void Delay(unsigned char);
  61          void LedLock(unsigned char);
  62          /* 变量定义 */
  63          sbit sda = P3^4;     //P3.7做为数据线//^^^^^^^^^^^^^^^^^^^^^^
  64          sbit scl = P3^2;     //P3.2做为时钟线
  65          sbit key_sw = P1^1;  //P1.2作为键盘电源开关
  66          
  67          int  i;
  68          unsigned char KeyCodeBuff[MAXBUFFER+1] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//键值缓存
  69          unsigned char KeyCodeSum      = 0; //键码数
  70          bit KeyFlag                   = 0; //有键标志
  71          bit KeyUpFlag                 = 0; //键弹起标志
  72          bit KeyExtendFlag             = 0; //扩展键标志
  73          bit KeyLedLockFlag            = 0; //三个Led键被按下的标志
  74          bit KeyBoardConnectFlag       = 0; //键盘连接标志
  75          bit KeyPauseFlag              = 0; //Pause键标志
  76          bit KeyMakeCodeFlag           = 0; //键盘发送通码标志
  77          /*
  78          bit CapsLockFlag              = 0; //CapsLock标志
  79          bit NumLockFlag               = 0; //NumLock标志
  80          bit ScrollLockFlag            = 0; //ScrollLock标志
  81          */
  82          unsigned char E1flag                    = 0;//我家的
  83          unsigned char E0flag                    = 0;//
  84          ///////////////////////////////////////////
  85          unsigned char KeyIDLo   = 0; //键盘ID低字节
  86          unsigned char KeyIDHi   = 0; //键盘ID高字节
  87          unsigned char LedStatus = 0; //NumLock,CapsLock,ScrollLock灯控制
  88          unsigned char dat[6]= 0x00;  // 输出数据缓存
  89          unsigned char sum=0x00;
  90          /*********************************************************/
  91          //函数:main()
  92          //功能:主函数
  93          //输入:无
  94          //输出:无
  95          //描述:
  96          /*********************************************************/
  97          unsigned char code keyval[]=
  98          {
  99          0x76,0x05,0x06,0x04,0x0c,0x03,0x0b,0x83,0x0a,0x01,0x09,0x78,0x07,
 100          0x0e,0x16,0x1e,0x26,0x25,0x2e,0x36,0x3d,0x3e,0x46,0x45,0x4e,0x55,
 101          0x5d,0x66,0x0d,0x15,0x1d,0x24,0x2d,0x2c,0x35,0x3c,0x43,0x44,0x4d,
 102          0x54,0x5b,0x58,0x1c,0x1b,0x23,0x2b,0x34,0x33,0x3b,0x42,0x4b,0x4c,
 103          0x52,0x5a,0x12,0x1a,0x22,0x21,0x2a,0x32,0x31,0x3a,0x41,0x49,0x4a,
 104          0x59,0x14,0x11,0x29,0x7e,0x77,0x7c,0x7b,0x6c,0x75,0x7d,0x6b,0x73,
 105          0x74,0x69,0x72,0x7a,0x70,0x71,0x69,0x79,
 106          
 107          };
 108          unsigned char code e0_keyval[]=
 109          {0x11,0x1F,0x14,0x12,0x70,0x6c,0x7d,0x71,0x69,0x7a,0x4a,0x5a,0x75,0x6b,0x72,0x74,0x5e,0x3f,0x37,0x7c,0x27,
             -0x2f};
 110          unsigned char code pausekey[]={0xe1,0x14};
 111          //unsigned char code pausekey[]={0xe1,0x14}
 112          
 113          void main()
 114          {
 115   1      DINT; //关中断
 116   1              
C51 COMPILER V7.07   PS2_BIN                                                               05/26/2005 16:04:50 PAGE 3   

 117   1      for(i=0;i<1000;i++)
 118   1                      ;//延时稳定
 119   1              
 120   1              /*  初始化变量  */
 121   1      sda = 0;
 122   1      scl = 0;      //端口设置为高
 123   1      key_sw = 1;   //关键盘
 124   1              for(i=0;i<1000;i++)
 125   1                      Delay(10);
 126   1              for(i = 0;i<16;i++)
 127   1              {
 128   2                      KeyCodeBuff[i] = 0;
 129   2              }
 130   1              KeyCodeSum              = 0;
 131   1              KeyFlag                 = 0;
 132   1              KeyUpFlag               = 0;
 133   1              KeyExtendFlag           = 0;
 134   1              KeyLedLockFlag          = 0;
 135   1              KeyBoardConnectFlag     = 0;
 136   1              KeyPauseFlag            = 0;
 137   1              KeyMakeCodeFlag         = 0;
 138   1              KeyIDLo                 = 0;
 139   1              KeyIDHi                 = 0;
 140   1              LedStatus               = 0;
 141   1      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 142   1      TMOD=0x22; // 定时器1 工作于方式2
 143   1      //20
 144   1      SCON=0x40; // 串口工作于方式1
 145   1      TH1=0xfa; //装入初值,22.1184MHZ 的晶振,9600 的波特率
 146   1      TL1=0xfa;
 147   1      TL0 = 0xff;
 148   1      TH0 = 0xff;
 149   1      PCON=0x00; //波特率无倍增
 150   1      TR1=1; //开启定时器1 开始工作
 151   1      TR0=1; //开启定时器0 开始工作
 152   1      //EA=1;
 153   1      WDT_CONTR = 0x3f;   //开硬件狗
 154   1      ES=1;   
 155   1      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 156   1      /*
 157   1              TMOD = 0x22;  //T1为波特率发生器设置19200波特率
 158   1              //T0为采样键盘时钟发生器
 159   1              TL1 = 0xFD;
 160   1              TH1 = 0xFD;
 161   1      // TL0 =
 162   1      // TH0 =
 163   1      PCON |= 0x80; //SMOD设置为1
 164   1      SCON = 0x50;  //串口控制寄存器
 165   1            //工作方式
 166   1            //非多机通讯方式
 167   1            //允许接收
 168   1            //
 169   1      
 170   1      TR1 = 1;      //定时器1开始
 171   1      */
 172   1              IT0 = 0;      //低电平引起中断
 173   1      
 174   1              ES = 1;       //开串口中断
 175   1              EX0 = 1;      //开外部0中断
 176   1              key_sw = 0;   //开键盘电源
 177   1              scl = 1;
 178   1              sda = 1;
C51 COMPILER V7.07   PS2_BIN                                                               05/26/2005 16:04:50 PAGE 4   

 179   1                
 180   1      Delay(1);
 181   1              while(!KeyBoardConnectFlag)
 182   1                      ReadPS2();//等待键盘自检成功
 183   1                      
 184   1              Order(COMMAND_RESET);   //复位键盘
 185   1              ReadPS2();              //等待键盘应答
 186   1              Delay(5);
 187   1              
 188   1              Order(COMMAND_SETSTATUS);//设置状态灯CapsLock,NumLock,ScrollLock
 189   1              ReadPS2();               //等待键盘应答
 190   1              LedStatus = DISALL;
 191   1              Order(LedStatus);        //关闭所有灯
 192   1              ReadPS2();               //等待键盘应答
 193   1              /*
 194   1              Order(COMMAND_READID);   //读键盘ID
 195   1              ReadPS2();               //等待键盘应答
 196   1              KeyIDLo = ReadPS2();     //获得键盘ID低字节
 197   1              KeyIDHi = ReadPS2();     //获得键盘ID高字节
 198   1              */
 199   1              LedStatus = NUMLOCK_EN;  //开NumLock灯
 200   1              Order(COMMAND_SETSTATUS);   
 201   1              ReadPS2();               //等待应答
 202   1              Order(LedStatus);        //
 203   1              ReadPS2();               //等待应答
 204   1              Order(COMMAND_SETRATE);  //设置速率延时
 205   1              ReadPS2();               //等待应答
 206   1              Order(0x20);             //500ms/30
 207   1              ReadPS2();
 208   1              Order(COMMAND_ENABLE);   //使能键盘
 209   1              ReadPS2();
 210   1              Order(COMMAND_SETRATE);  //设置速率延时
 211   1              ReadPS2();
 212   1              Order(0x20);             //
 213   1              ReadPS2();
 214   1              
 215   1              Delay(200);              //延时
 216   1              
 217   1              EINT;                    //开总中断
 218   1           
 219   1      while(1)
 220   1      {
 221   2      //  KeyScan();//扫描键盘
 222   2        if(KeyFlag == 1)
 223   2        {
 224   3         KeyFlag = 0;
 225   3         KeyTransmit();//
 226   3        
 227   3        }
 228   2      
 229   2      WDT_CONTR = 0x3f;// 喂狗
 230   2      
 231   2      }
 232   1      }
 233          
 234          /*********************************************************/
 235          //函数:uart
 236          //功能:串口中断

⌨️ 快捷键说明

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