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

📄 ps2key.lst

📁 基于MS51系列单片机的PS2接口程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 122      =1  0x7D, '9',
 123      =1  };
  33          #include "assic.h" 
   1      =1  
   2      =1  code unsigned char ASSIC2_1[61][2]=
   3      =1          {
   4      =1          0X15,'q',
   5      =1          0x16,'1',
   6      =1          0x1a,'z',
   7      =1          0x1b,'s',
   8      =1          0x1c,'a',
   9      =1          0x1d,'w',
  10      =1          0x1e,'2',
  11      =1          0x21,'c',
  12      =1          0x22,'x',
  13      =1          0x23,'d',
  14      =1          0x24,'e',
  15      =1          0x25,'4',
  16      =1          0x26,'3',
  17      =1          0x29,' ',
C51 COMPILER V7.08   PS2KEY                                                                04/08/2006 16:38:20 PAGE 7   

  18      =1          0x2a,'v',
  19      =1          0x2b,'f',
  20      =1          0x2c,'t',
  21      =1          0x2d,'r',
  22      =1          0x2e,'5',
  23      =1          0x31,'n',
  24      =1          0x32,'b',
  25      =1          0x33,'h',
  26      =1          0x34,'g',
  27      =1          0x35,'y',
  28      =1          0x36,'6',
  29      =1          0x3a,'m',
  30      =1          0x3b,'j',
  31      =1          0x3c,'u',
  32      =1          0x3d,'7',
  33      =1          0x3e,'8',
  34      =1          0x41,',',
  35      =1          0x42,'k',
  36      =1          0x43,'i',
  37      =1          0x44,'o',
  38      =1          0x45,'0',
  39      =1          0x46,'9',
  40      =1          0x49,'.',
  41      =1          0x4a,'/',
  42      =1          0x4b,'l',
  43      =1          0x4c,':',
  44      =1          0x4d,'p',
  45      =1          0x4e,'-',
  46      =1          0x52,'\'',
  47      =1          0x54,'[',
  48      =1          0x55,'=',
  49      =1          0x5b,']',
  50      =1          0x5d,'\\',
  51      =1          0x69,'1',
  52      =1          0x6b,'4',
  53      =1          0x6c,'7',
  54      =1          0x70,'0',
  55      =1          0x71,'.',
  56      =1          0x72,'2',
  57      =1          0x73,'5',
  58      =1          0x74,'6',
  59      =1          0x75,'8',
  60      =1          0x79,'+',
  61      =1          0x7a,'3',
  62      =1          0x7b,'-',
  63      =1          0x7c,'*',
  64      =1          0x7d,'9'
  65      =1                  };
  66      =1  code unsigned char ASSIC2_2[61][2]=
  67      =1          {
  68      =1          0X15,'Q',
  69      =1          0x16,'1',
  70      =1          0x1a,'Z',
  71      =1          0x1b,'S',
  72      =1          0x1c,'A',
  73      =1          0x1d,'W',
  74      =1          0x1e,'2',
  75      =1          0x21,'C',
  76      =1          0x22,'X',
  77      =1          0x23,'D',
  78      =1          0x24,'E',
  79      =1          0x25,'4',
C51 COMPILER V7.08   PS2KEY                                                                04/08/2006 16:38:20 PAGE 8   

  80      =1          0x26,'3',
  81      =1          0x29,' ',
  82      =1          0x2a,'V',
  83      =1          0x2b,'F',
  84      =1          0x2c,'T',
  85      =1          0x2d,'R',
  86      =1          0x2e,'5',
  87      =1          0x31,'N',
  88      =1          0x32,'B',
  89      =1          0x33,'H',
  90      =1          0x34,'G',
  91      =1          0x35,'Y',
  92      =1          0x36,'6',
  93      =1          0x3a,'M',
  94      =1          0x3b,'J',
  95      =1          0x3c,'U',
  96      =1          0x3d,'7',
  97      =1          0x3e,'8',
  98      =1          0x41,',',
  99      =1          0x42,'K',
 100      =1          0x43,'I',
 101      =1          0x44,'O',
 102      =1          0x45,'0',
 103      =1          0x46,'9',
 104      =1          0x49,'.',
 105      =1          0x4a,'/',
 106      =1          0x4b,'l',
 107      =1          0x4c,':',
 108      =1          0x4d,'P',
 109      =1          0x4e,'-',
 110      =1          0x52,'\'',
 111      =1          0x54,'[',
 112      =1          0x55,'=',
 113      =1          0x5b,']',
 114      =1          0x5d,'\\',
 115      =1          0x69,'1',
 116      =1          0x6b,'4',
 117      =1          0x6c,'7',
 118      =1          0x70,'0',
 119      =1          0x71,'.',
 120      =1          0x72,'2',
 121      =1          0x73,'5',
 122      =1          0x74,'6',
 123      =1          0x75,'8',
 124      =1          0x79,'+',
 125      =1          0x7a,'3',
 126      =1          0x7b,'-',
 127      =1          0x7c,'*',
 128      =1          0x7d,'9'
 129      =1  
 130      =1          
 131      =1  
 132      =1  
 133      =1  
 134      =1  
 135      =1                  };  
  34          #define LCM_RW  P2_6 //定义LCD引脚
  35          #define LCM_RS  P2_7
  36          #define LCM_E   P2_5
  37          #define LCM_Data  P0
  38          
  39          #define Key_Data P3_4 //定义Keyboard引脚
C51 COMPILER V7.08   PS2KEY                                                                04/08/2006 16:38:20 PAGE 9   

  40          #define Key_CLK  P3_3
  41          
  42          #define Busy    0x80 //用于检测LCM状态字中的Busy标识
  43          
  44          void LCMInit(void);
  45          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  46          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  47          void Delay5Ms(void);
  48          void Delay400Ms(void);
  49          void Decode(unsigned char ScanCode);
  50          void WriteDataLCM(unsigned char WDLCM);
  51          void WriteCommandLCM(unsigned char WCLCM,BuysC);
  52          
  53          unsigned char ReadDataLCM(void);
  54          unsigned char ReadStatusLCM(void);
  55          
  56          unsigned char dcode(unsigned char index);
  57          char Keyboard_out(void);
  58          
  59          unsigned char code cdle_net[] = {"--www.cdle.net--"};
  60          unsigned char code email[] = {"pnzwzw@cdle.net"};
  61          unsigned char code Cls[] = {"                "};
  62          static unsigned char IntNum = 0; //中断次数计数
  63          static unsigned char KeyV; //键值
  64          static unsigned char DisNum = 0; //显示用指针
  65          static unsigned char Key_UP=0, Shift = 0;//Key_UP是键松开标识,Shift是Shift键按下标识
  66          static unsigned char BF = 0; //标识是否有字符被收到
  67          
  68          static unsigned char tt[20];
  69          static unsigned char t=0;
  70          
  71          
  72          
  73          
  74          void main(void)
  75          {
  76   1       
  77   1              unsigned char TempCyc;
  78   1              unsigned n;
  79   1              n=dcode(0);
  80   1              Delay400Ms(); //启动等待,等LCM讲入工作状态
  81   1              LCMInit(); //LCM初始化
  82   1              Delay5Ms(); //延时片刻(可不要)
  83   1      
  84   1              DisplayListChar(0, 0, cdle_net);
  85   1              DisplayListChar(0, 1, email);
  86   1              ReadDataLCM();//测试用句无意义
  87   1              for (TempCyc=0; TempCyc<10; TempCyc++)
  88   1                              Delay400Ms(); //延时
  89   1              DisplayListChar(0, 1, Cls);     
  90   1              
  91   1              IT1 = 1; //设外部中断1为低电平触发
  92   1              EA = 1;
  93   1              EX1 = 1; //开中断
  94   1      
  95   1              do
  96   1                      {
  97   2                                      EX1=1;
  98   2                                      t=Keyboard_out();
  99   2                                              DisplayOneChar(0, 1, dcode(t));
 100   2                                       
 101   2                       
C51 COMPILER V7.08   PS2KEY                                                                04/08/2006 16:38:20 PAGE 10  

 102   2                      } 
 103   1              while(1);
 104   1      }
 105          
 106          //写数据
 107          void WriteDataLCM(unsigned char WDLCM) 
 108          {
 109   1              ReadStatusLCM(); //检测忙
 110   1              LCM_Data = WDLCM;
 111   1              LCM_RS = 1;
 112   1              LCM_RW = 0;
 113   1              LCM_E = 0; //若晶振速度太高可以在这后加小的延时
 114   1              LCM_E = 0; //延时
 115   1              LCM_E = 1;
 116   1      }
 117          
 118          //写指令
 119          void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
 120          {
 121   1              if (BuysC) ReadStatusLCM(); //根据需要检测忙
 122   1              LCM_Data = WCLCM;
 123   1              LCM_RS = 0;
 124   1              LCM_RW = 0;     
 125   1              LCM_E = 0;
 126   1              LCM_E = 0;
 127   1              LCM_E = 1;      
 128   1      }
 129          
 130          //读数据
 131          unsigned char ReadDataLCM(void)
 132          {
 133   1              LCM_RS = 1; 
 134   1              LCM_RW = 1;
 135   1              LCM_E = 0;
 136   1              LCM_E = 0;
 137   1              LCM_E = 1;
 138   1              return(LCM_Data);
 139   1      }
 140          
 141          //读状态
 142          unsigned char ReadStatusLCM(void)
 143          {
 144   1              LCM_Data = 0xFF; 
 145   1              LCM_RS = 0;
 146   1              LCM_RW = 1;
 147   1              LCM_E = 0;
 148   1              LCM_E = 0;
 149   1              LCM_E = 1;
 150   1              while (LCM_Data & Busy); //检测忙信号
 151   1              return(LCM_Data);
 152   1      }
 153          
 154          void LCMInit(void) //LCM初始化
 155          {
 156   1              LCM_Data = 0;
 157   1              WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
 158   1              Delay5Ms(); 
 159   1              WriteCommandLCM(0x38,0);
 160   1              Delay5Ms(); 
 161   1              WriteCommandLCM(0x38,0);
 162   1              Delay5Ms(); 
 163   1      
C51 COMPILER V7.08   PS2KEY                                                                04/08/2006 16:38:20 PAGE 11  

 164   1              WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
 165   1              WriteCommandLCM(0x08,1); //关闭显示
 166   1              WriteCommandLCM(0x01,1); //显示清屏
 167   1              WriteCommandLCM(0x06,1); // 显示光标移动设置
 168   1              WriteCommandLCM(0x0F,1); // 显示开及光标设置
 169   1      }
 170          
 171          //按指定位置显示一个字符
 172          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
 173          {
 174   1              Y &= 0x1;
 175   1              X &= 0xF; //限制X不能大于15,Y不能大于1
 176   1              if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
 177   1              X |= 0x80; //算出指令码
 178   1              WriteCommandLCM(X, 1); //发命令字
 179   1              WriteDataLCM(DData); //发数据
 180   1      }
 181          
 182          //按指定位置显示一串字符
 183          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
 184          {
 185   1              unsigned char ListLength;
 186   1      
 187   1        ListLength = 0;
 188   1              Y &= 0x1;
 189   1              X &= 0xF; //限制X不能大于15,Y不能大于1
 190   1              while (DData[ListLength]>0x19) //若到达字串尾则退出
 191   1                      {
 192   2                              if (X <= 0xF) //X坐标应小于0xF
 193   2                                      {
 194   3                                              DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
 195   3                                              ListLength++;
 196   3                                              X++;
 197   3                                      }
 198   2                      }
 199   1      }
 200          
 201          //5ms延时
 202          void Delay5Ms(void)
 203          {
 204   1              unsigned int TempCyc = 5552;
 205   1              while(TempCyc--);
 206   1      }
 207          
 208          //400ms延时
 209          void Delay400Ms(void)
 210          {
 211   1              unsigned char TempCycA = 5;
 212   1              unsigned int TempCycB;
 213   1              while(TempCycA--)
 214   1                      {
 215   2                              TempCycB=7269;
 216   2                              while(TempCycB--);
 217   2                      };
 218   1      }
 219          /*
 220          void Keyboard_out(void) interrupt 2
 221          {
 222                  unsigned int time;
 223                          EX1 = 0; 
 224                  do{
 225                  time=0;
C51 COMPILER V7.08   PS2KEY                                                                04/08/2006 16:38:20 PAGE 12  

 226                  while(Key_CLK){
 227                                                  time++;
 228                                                  if(time>10000)break;
 229                                                  } 
 230                  if ((IntNum > 0) && (IntNum < 9))
 231                          {                       
 232                                  KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
 233                                  if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
 234                          }
 235                  IntNum++;
 236                  time=0;
 237                  while (!Key_CLK){
 238                                                  time++;
 239                                                  if(time>10000)break;
 240                                                  }
 241                                           //等待PS/2CLK拉高
 242          
 243                  }
 244                  while(IntNum<11);
 245                                  IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
 246                                  BF = 1; //标识有字符输入完了
 247                          //      EA = 0; //关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函

⌨️ 快捷键说明

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