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

📄 ps2key.lst

📁 PS2扩展功能
💻 LST
字号:
C51 COMPILER V8.02   PS2KEY                                                                08/12/2008 00:55:51 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE PS2KEY
OBJECT MODULE PLACED IN PS2Key.OBJ
COMPILER INVOKED BY: D:\安装程序\UV3\C51\BIN\C51.EXE PS2Key.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*============================================================
   2          函数名称:1602显示键盘PS2
   3          函数功能:1602显示键盘PS2
   4          李灿松
   5          时间:2008.10.11
   6          说明:
   7          连接线图:       
   8                 ---------------------------------------------------
   9                 |LCM-----51   |  LCM-----51   |  LCM------51      |
  10                 --------------------------------------------------|
  11                 |DB0-----P1.0 |  DB4-----P1.4 |  RW-------P2.1    |
  12                 |DB1-----P1.1 |  DB5-----P1.5 |  RS-------P2.0    |
  13                 |DB2-----P1.2 |  DB6-----P1.6 |  E--------P2.2    |
  14                 |DB3-----P1.3 |  DB7-----P1.7 |  VLCD接1K电阻到GND|
  15                 ---------------------------------------------------
  16          
  17          Keyboard接线
  18                PS/2--------51
  19                1 DATA------P3.4
  20                3 GND
  21                4 VCC
  22                5 CLK-------P3.3 接在51的外部中断,触发方式为低电平
  23          
  24          =============================================================*/
  25          #include <at89x51.h>
  26          #include "scancodes.h"
  27          #include<intrins.h>
  28          
  29          #define L1602_RW  P2_1 //定义LCD引脚
  30          #define L1602_RS  P2_0
  31          #define L1602_E   P2_2
  32          #define L1602_DB0_DB7 P0  
  33          #define uchar unsigned char
  34          #define uint  unsigned int
  35          
  36          #define Key_Data P3_4 //定义Keyboard引脚
  37          #define Key_CLK  P3_3
  38          
  39          #define Busy    0x80 //用于检测LCM状态字中的Busy标识
  40          
  41          void Delay5Ms(void);
  42          void Delay400Ms(void);
  43          void Decode(unsigned char ScanCode);
  44          void print(uchar a,uchar *str);
  45          void print1(uchar a,uchar t);
  46          void LCM1602_Init(void);
  47          
  48          unsigned char ReadDataLCM(void);
  49          unsigned char ReadStatusLCM(void);
  50          unsigned char code cdle_net[] = {"welcom"};
  51          unsigned char code email[] = {"cansong"};
  52          unsigned char code Cls[] = {"                "};
  53          static unsigned char IntNum = 0; //中断次数计数
  54          static unsigned char KeyV; //键值
  55          static unsigned char DisNum = 0; //显示用指针
C51 COMPILER V8.02   PS2KEY                                                                08/12/2008 00:55:51 PAGE 2   

  56          static unsigned char Key_UP=0, Shift = 0;//Key_UP是键松开标识,Shift是Shift键按下标识
  57          static unsigned char BF = 0; //标识是否有字符被收到
  58          typedef bit BOOL ; 
  59          uchar aa=0x80;
  60          
  61          /**********************************************************************************************
  62          函数名称:主函数
  63          函数功能:主函数
  64          说明: 
  65          **********************************************************************************************/
  66          void main(void)
  67          {
  68   1              unsigned char TempCyc;
  69   1      
  70   1              Delay400Ms(); //启动等待,等LCM讲入工作状态
  71   1              LCM1602_Init(); //LCM初始化
  72   1              Delay5Ms(); //延时片刻(可不要)
  73   1      
  74   1              print(0x80,cdle_net);
  75   1              print(0xc0,email);
  76   1              for (TempCyc=0; TempCyc<3; TempCyc++)
  77   1                              Delay400Ms(); //延时
  78   1              LCM1602_Init(); //LCM初始化 
  79   1              IT1 = 0; //设外部中断1为低电平触发
  80   1              EA = 1;
  81   1              EX1 = 1; //开中断
  82   1      
  83   1              do
  84   1                      {
  85   2                              if (BF)
  86   2                                      Decode(KeyV);
  87   2                              else
  88   2                                      EA = 1; //开中断
  89   2                      }
  90   1              while(1);
  91   1      }
  92          /**********************************************************************************************
  93          函数名称:延时函数
  94          函数功能:延时
  95          说明: 
  96          **********************************************************************************************/
  97          void delay(unsigned int delay_time) //延时程序
  98          {
  99   1       while(delay_time--);
 100   1      }
 101          
 102          
 103          void LCM1602_Delay(uchar count)
 104          {
 105   1              uchar i;
 106   1              while(--count!=0)
 107   1                 {for(i=0;i<250;i++);}        
 108   1      }
 109          /**********************************************************************************************
 110          函数名称:初始化函数
 111          函数功能:液晶1602初始化
 112          说明:
 113          **********************************************************************************************/
 114          void  LCM1602_Init(void)
 115          {
 116   1       void LCM1602_WriteData(uchar LCM1602_data);
 117   1       void LCM1602_WriteCMD(uchar LCM1602_command);
C51 COMPILER V8.02   PS2KEY                                                                08/12/2008 00:55:51 PAGE 3   

 118   1       LCM1602_WriteCMD(0x38);    //显示两行,每个字符为5*7个像素
 119   1       delay(1);
 120   1       LCM1602_WriteCMD(0x06);    //光标移动设置,光标右移
 121   1       delay(1);
 122   1       LCM1602_WriteCMD(0x0c);    //现设开,光标开,闪烁开
 123   1       delay(1);
 124   1       LCM1602_WriteCMD(0x01);    //清屏
 125   1       delay(1);
 126   1      }
 127          void  print(uchar a,uchar *str)
 128          {
 129   1       void  LCM1602_WriteData(uchar LCM1602_data);
 130   1       void  LCM1602_WriteCMD(uchar LCM1602_command);
 131   1       LCM1602_WriteCMD(a);
 132   1       while(*str!='\0')
 133   1          {
 134   2          LCM1602_WriteData(*str++);
 135   2              }
 136   1       *str=0;
 137   1      }
 138          void print1(uchar a,uchar t)
 139          {
 140   1       LCM1602_WriteCMD(a);
 141   1       LCM1602_WriteData(t);
 142   1      }
 143          
 144          
 145          
 146          /**********************************************************************************************
 147          函数名称:写命令和写数据函数
 148          函数功能:向LCD写命令和数据
 149          说明:LCM1602_WriteCMD是写命令函数,void LCM1602_WriteData是写数据函数
 150          **********************************************************************************************/
 151          void LCM1602_WriteCMD(uchar LCM1602_command)
 152          {
 153   1      BOOL lcd_bz();
 154   1      while(lcd_bz());        //测忙
 155   1      L1602_RS=0;
 156   1      L1602_RW=0;
 157   1      L1602_E=0;
 158   1      _nop_();
 159   1      _nop_();
 160   1      L1602_DB0_DB7=LCM1602_command;
 161   1      _nop_();
 162   1      _nop_();_nop_();
 163   1      L1602_E=1;    //命令总送出
 164   1      _nop_();_nop_();_nop_();
 165   1      L1602_E=0; 
 166   1      }
 167          
 168          void LCM1602_WriteData(uchar LCM1602_data)
 169          {
 170   1      BOOL lcd_bz();
 171   1      while(lcd_bz());        //测忙
 172   1      L1602_RS=1;
 173   1      L1602_RW=0;
 174   1      L1602_E=0;
 175   1      L1602_DB0_DB7=LCM1602_data;
 176   1      _nop_();
 177   1      _nop_();
 178   1      _nop_();
 179   1      _nop_();
C51 COMPILER V8.02   PS2KEY                                                                08/12/2008 00:55:51 PAGE 4   

 180   1      L1602_E=1;   //数据送出
 181   1      _nop_();
 182   1      _nop_();
 183   1      _nop_();
 184   1      L1602_E=0;
 185   1      }
 186          
 187          
 188          /**********************************************************************************************
 189          函数名称:LCD检测忙函数
 190          函数功能:检测LCD是否处于忙状态
 191          说明: 
 192          **********************************************************************************************/
 193          BOOL lcd_bz()
 194          {                                                       // 测试LCD忙碌状态
 195   1              BOOL result;
 196   1              L1602_RS=0;
 197   1          L1602_RW=1;
 198   1          L1602_E=1;
 199   1              _nop_();
 200   1              _nop_();
 201   1              _nop_();
 202   1              _nop_();
 203   1              result = (BOOL)(P0 & 0x80);
 204   1              L1602_E = 0;
 205   1              return result;  
 206   1      }
 207          /**********************************************************************************************
 208          函数名称:延时函数
 209          函数功能:延时
 210          说明: 
 211          **********************************************************************************************/
 212          
 213          //5ms延时
 214          void Delay5Ms(void)
 215          {
 216   1              unsigned int TempCyc = 5552;
 217   1              while(TempCyc--);
 218   1      }
 219          
 220          //400ms延时
 221          void Delay400Ms(void)
 222          {
 223   1              unsigned char TempCycA = 5;
 224   1              unsigned int TempCycB;
 225   1              while(TempCycA--)
 226   1                      {
 227   2                              TempCycB=7269;
 228   2                              while(TempCycB--);
 229   2                      };
 230   1      }
 231          /**********************************************************************************************
 232          函数名称:中断函数
 233          函数功能:每十一次(IntNum)中断一次,读取键盘值
 234          说明: 
 235          **********************************************************************************************/
 236          void Keyboard_out(void) interrupt 2
 237          {
 238   1              if ((IntNum > 0) && (IntNum < 9))
 239   1                      {                       
 240   2                              KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
 241   2                              if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
C51 COMPILER V8.02   PS2KEY                                                                08/12/2008 00:55:51 PAGE 5   

 242   2                      }
 243   1              IntNum++;
 244   1              while (!Key_CLK); //等待PS/2CLK拉高
 245   1      
 246   1              if (IntNum > 10)
 247   1                      {
 248   2                              IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
 249   2                              BF = 1; //标识有字符输入完了
 250   2                              EA = 0; //关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数

⌨️ 快捷键说明

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