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

📄 ps2.lst

📁 单片机与键盘接口程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   PS2                                                                   07/27/2007 22:57:32 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE PS2
OBJECT MODULE PLACED IN ps2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ps2.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*******************************************************************************
   2          *  标题:  蓝海微芯LJD-SY-5200单片机开发系统演示程序                            *
   3          *  文件:  ps2.c                                                                *
   4          *  日期:  2006-8-11                                                            *
   5          *  版本:  1.0                                                                  *
   6          *  作者:  蓝海微芯                                                             *
   7          *  网站: http://www.ljd-2008.com                                              *
   8          ********************************************************************************
   9          *  描述:                                                                       *
  10          *         ps/2键盘测试程序                                                     *     
  11          *                                                                              *
  12          *                                                                              *
  13          ********************************************************************************
  14          * 【版权】 Copyright(C)微芯科技 http://www.bluemcu.com    All Rights Reserved  *          
  15          * 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!                  *
  16          *******************************************************************************/
  17          #include "define.h"
  18          #include "code.h"
  19          #include "LCD1602.h"
  20          #define uchar unsigned char
  21          bit revchar_flag=0;
  22          unsigned char mcu_revchar=0;
  23          unsigned char led_status=0;
  24          unsigned char (*keycode)[2];
  25          
  26          unsigned char code ASCII[] ="0123456789ABCDEF";
  27          
  28          uchar xdata disp_num[10]      = "0123456789";
  29          uchar xdata disp_letter[26]   = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  30          uchar xdata disp_enter[5]     = "Enter";
  31          uchar xdata disp_shift[5]     = "Shift";
  32          uchar xdata disp_back[10]     = "Back Space";
  33          uchar xdata disp_space[5]     = "Space";
  34          uchar xdata disp_ctrl[4]      = "Ctrl";
  35          uchar xdata disp_tab[3]       = "Tab";
  36          uchar xdata disp_cap[9]       = "Caps Lock";
  37          uchar xdata disp_esc[3]       = "Esc";
  38          uchar xdata disp_alt[3]       = "Alt";
  39          uchar xdata disp_lock[8]      = "Num Lock";
  40          uchar xdata disp_insert[6]    = "Insert";
  41          uchar xdata disp_delete[6]    = "Delete";
  42          uchar xdata disp_end[3]       = "End";
  43          uchar xdata disp_home[4]      = "Home";
  44          uchar xdata disp_page_up[7]   = "Page Up";
  45          uchar xdata disp_page_down[9] = "Page Down";
  46          uchar xdata disp_right[5]     = "Right";
  47          uchar xdata disp_left[4]      = "Left";
  48          uchar xdata disp_up[2]        = "Up";
  49          uchar xdata disp_down[4]      = "Down";
  50          
  51          
  52          /*
  53          void delay100us (int us)
  54          {
  55            int i; // millisecond counter
C51 COMPILER V7.50   PS2                                                                   07/27/2007 22:57:32 PAGE 2   

  56            int count;
  57            count=SYSCLK/120000;
  58            TCON &= ~0x30; // Stop Timer0 and clear overflow flag
  59            TMOD |= 0x01;
  60          //ET0=1;
  61            for (i = 0; i < us; i++) 
  62            { // count milliseconds
  63              TH0 = (-count) >> 8; // Set Timer0 to overflow in 50us
  64              TL0 = -count;
  65              TR0 = 1; // Start Timer0
  66              while (TF0 == 0); // wait for overflow
  67              TF0 = 0; // clear overflow indicator
  68              TR0 = 0; // Stop Timer0
  69            }
  70            //ET0=0;//close the interrupt
  71          }
  72          
  73          //单片机向PS/2设备发送数据程序
  74          void ps2_sentchar(unsigned char sentchar)
  75          {
  76            unsigned char sentbit_cnt  = 0x00;
  77            unsigned char sentchar_chk = 0x00;
  78                  
  79            EX0 =0; 
  80                  
  81            //发起一个传送,发起始位
  82            PS2_CLK = 0;
  83            delay100us(1);
  84            PS2_DIO = 0;                                          //起始位        
  85            PS2_CLK = 1;
  86                  
  87            //发送DATA0-7
  88            for(sentbit_cnt = 0; sentbit_cnt < 8; sentbit_cnt++)
  89            {
  90              while(PS2_CLK);                                     //等待时钟线变为低
  91              PS2_DIO = sentchar & 0x01;          //发送数据
  92              if(PS2_DIO)sentchar_chk++;          //计算校验
  93                  while(!PS2_CLK);                                //等待时钟线变高
  94                  sentchar >>= 1;                                 //待发送数据右移一位
  95            }
  96            //发送校验位  
  97            while(PS2_CLK);                                               //等待时钟线变为低
  98            switch(sentchar_chk)
  99            {
 100              case  0:
 101              case  2:
 102              case  4:
 103              case  6: PS2_DIO = 1; break;                //奇校验
 104              case  1:
 105              case  3:
 106              case  5:
 107              case  7: PS2_DIO = 0; break;                //奇校验
 108              default: break;
 109            }
 110            while(!PS2_CLK);                                  //等待时钟线变高
 111            while(PS2_CLK);                                       //等待时钟线变为低
 112                  
 113            //发送停止位,停止位总为1
 114            PS2_DIO = 1;                                                  
 115            while(!PS2_CLK);                                      //等待时钟线变高
 116            while(PS2_CLK);                                               //等待时钟线变为低
 117                  
C51 COMPILER V7.50   PS2                                                                   07/27/2007 22:57:32 PAGE 3   

 118            //接收ACK
 119            //if(PS2_DIO) error();                                //ACK信号由键盘发出,总为低电平
 120            while(!PS2_CLK);                                      //等待时钟线变高
 121                  
 122            EX0 = 1;
 123          }
 124          */
 125          void ps2ini(void)
 126          {
 127   1        IT1=1;          //外部中断1设置为下降沿触发
 128   1        EX1=1;          //允许外部中断1
 129   1        keycode=key;
 130   1      }
 131          //单片机由PS/2键盘接收数据程序:
 132          void Int1_ISR() interrupt 2 
 133          {
 134   1        static unsigned char ps2_revchar_cnt=0;
 135   1        EX1=0;
 136   1        switch(ps2_revchar_cnt)
 137   1        {
 138   2          case 1:
 139   2          case 2:
 140   2          case 3:
 141   2          case 4:
 142   2          case 5:
 143   2          case 6:
 144   2          case 7:
 145   2          case 8:
 146   2          mcu_revchar >>= 1;
 147   2          if(PS2_DIO)
 148   2              mcu_revchar |= 0x80;
 149   2              ps2_revchar_cnt++;
 150   2              break;
 151   2          case 0:
 152   2              ps2_revchar_cnt++;
 153   2              break;                                                  //开始位,
 154   2          case 9:
 155   2              ps2_revchar_cnt++;
 156   2              break;                                                  //校验位,可添加校验程序
 157   2          case 10:                                            
 158   2              ps2_revchar_cnt=0;                              //停止位
 159   2              revchar_flag=1;                                 //置接收到数据标志位
 160   2                  break;
 161   2          default:
 162   2                break;
 163   2        }     
 164   1        EX1=1;
 165   1      }
 166          
 167          void decode(void)
 168          {
 169   1        static unsigned char is_up=0;
 170   1      //static unsigned char is_numlock=0;
 171   1      //static unsigned char is_capslock=0;
 172   1              static unsigned char j;
 173   1        unsigned char i;
 174   1                      CLEARSCREEN;
 175   1      //  LCD_write_char(2,0,ASCII[mcu_revchar>>4]);
 176   1      //  LCD_write_char(2,1,ASCII[mcu_revchar&0x0f]);
 177   1              if(j>16) j=0;
 178   1        switch (mcu_revchar)
 179   1        {
C51 COMPILER V7.50   PS2                                                                   07/27/2007 22:57:32 PAGE 4   

 180   2          case 0xF0 :// The up-key identifier
 181   2                           is_up = 2;
 182   2               break;
 183   2          case 0xE0 :
 184   2               keycode=key_ex;
 185   2               break;
 186   2      /*
 187   2          case 0x77 :
 188   2                   if(is_up==0)
 189   2               if(is_numlock==0)
 190   2               {
 191   2                 led_status |=0x02;
 192   2                 is_numlock=1;
 193   2               }
 194   2               else
 195   2               {
 196   2                 led_status &=~0x02;
 197   2                 is_numlock=0;
 198   2               }
 199   2               ps2_sentchar(led_status);
 200   2               break;
 201   2          case 0x58 :
 202   2               if(is_up==0)
 203   2               if(is_capslock==0)
 204   2               {
 205   2                 led_status |=0x04;
 206   2                 is_capslock=1;
 207   2               }
 208   2               else
 209   2               {
 210   2                 led_status &=~0x04;
 211   2                 is_capslock=0;
 212   2               }
 213   2               ps2_sentchar(led_status);
 214   2      
 215   2      */
 216   2          default:
 217   2                              for(i = 0; keycode[i][0]!=mcu_revchar && keycode[i][0]; i++);
 218   2                          if (keycode[i][0] == mcu_revchar)                                   //键值
 219   2                          {
 220   3                            LCD_write_char(2,0,keycode[i][1]);                        //按键名
 221   3                            LCD_write_char(2,1,'=');                                                          //按键名
 222   3                                      LCD_write_char(2,2,ASCII[mcu_revchar>>4]);//键值高
 223   3                                      LCD_write_char(2,3,ASCII[mcu_revchar&0x0f]);//键值低
 224   3                            //printf("K%c%c ",keycode[i][1],is_up);
 225   3                            if(is_up==2)
 226   3                            {
 227   4                              keycode=key;    //defaule is key[][2];
 228   4                              is_up=0;
 229   4                            }
 230   3                          }
 231   2                          break;
 232   2              }
 233   1      //  LCD_write_char(2,2,ASCII[mcu_revchar>>4]);
 234   1      //  LCD_write_char(2,3,ASCII[mcu_revchar&0x0f]);
 235   1      
 236   1      /*以下程序段实现的功能是,在液晶屏上显示PS/2键盘上按键的键符*/
 237   1      /*
 238   1        switch(mcu_revchar)
 239   1              {
 240   1              case 0x1C:
 241   1             LCD_write_char(2,1,disp_letter[0]);
C51 COMPILER V7.50   PS2                                                                   07/27/2007 22:57:32 PAGE 5   

 242   1             break;
 243   1                case 0x32:
 244   1             LCD_write_char(2,1,disp_letter[1]);
 245   1             break;
 246   1              case 0x21:
 247   1             LCD_write_char(2,1,disp_letter[2]);
 248   1             break;
 249   1                case 0x23:
 250   1             LCD_write_char(2,1,disp_letter[3]);

⌨️ 快捷键说明

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