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

📄 ps2key.lst

📁 PS/2键盘+LCM1602+串口调试C51源码
💻 LST
字号:
C51 COMPILER V8.05a   PS2KEY                                                               10/20/2008 09:46:38 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE PS2KEY
OBJECT MODULE PLACED IN PS2Key.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PS2Key.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          
   2          #include <at89x52.h>
   3          #include "scancodes.h"
   4          
   5          #define LCM_RW  P1_1 //定义LCD引脚
   6          #define LCM_RS  P1_0
   7          #define LCM_E   P1_2
   8          #define LCM_Data  P2
   9          
  10          #define Key_Data P3_4 //定义Keyboard引脚
  11          #define Key_CLK  P3_2
  12          
  13          #define Busy    0x80 //用于检测LCM状态字中的Busy标识
  14          
  15          void LCMInit(void);
  16          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  17          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  18          void Delay5Ms(void);
  19          void Delay400Ms(void);
  20          void Decode(unsigned char ScanCode);
  21          void WriteDataLCM(unsigned char WDLCM);
  22          void WriteCommandLCM(unsigned char WCLCM,BuysC);
  23          
  24          unsigned char ReadDataLCM(void);
  25          unsigned char ReadStatusLCM(void);
  26          unsigned char code cdle_net[] = {"    youxitun"};
  27          unsigned char code email[] = {"  QQ 166388866  "};
  28          unsigned char code Cls[] = {"                "};
  29          
  30          static unsigned char IntNum = 0; //中断次数计数
  31          static unsigned char KeyV; //键值
  32          static unsigned char DisNum = 0; //显示用指针
  33          static unsigned char Key_UP=0, Shift = 0;//Key_UP是键松开标识,Shift是Shift键按下标识
  34          static unsigned char BF = 0; //标识是否有字符被收到
  35          
  36          void main(void)
  37          {
  38   1              unsigned char TempCyc;
  39   1      
  40   1              RCAP2L=0XD8;
  41   1              RCAP2H=0XFF;                    
  42   1              TL2=0XD8;
  43   1              TH2=0XFF;
  44   1              T2CON=0X34;     
  45   1              SCON=0X50;      //9600bps,12MHZ,T2
  46   1      
  47   1              Delay400Ms(); //启动等待,等LCM讲入工作状态
  48   1              LCMInit(); //LCM初始化
  49   1              Delay5Ms(); //延时片刻(可不要)
  50   1      
  51   1              DisplayListChar(0, 0, cdle_net);
  52   1              DisplayListChar(0, 1, email);
  53   1              ReadDataLCM();//测试用句无意义
  54   1              for (TempCyc=0; TempCyc<10; TempCyc++)
  55   1                              Delay400Ms(); //延时
C51 COMPILER V8.05a   PS2KEY                                                               10/20/2008 09:46:38 PAGE 2   

  56   1              DisplayListChar(0, 1, Cls);     
  57   1              DisplayListChar(0, 0, Cls);
  58   1      
  59   1              IT0 = 0; //设外部中断0为低电平触发
  60   1              EA = 1;
  61   1              EX0 = 1; //开中断
  62   1      
  63   1              do
  64   1                      {
  65   2                              if (BF)
  66   2                                      Decode(KeyV);
  67   2                              else
  68   2                                      EA = 1; //开中断
  69   2                      }
  70   1          while(1);
  71   1      }
  72          
  73          //写数据
  74          void WriteDataLCM(unsigned char WDLCM) 
  75          {
  76   1              ReadStatusLCM(); //检测忙
  77   1              LCM_Data = WDLCM;
  78   1              LCM_RS = 1;
  79   1              LCM_RW = 0;
  80   1              LCM_E = 0; //若晶振速度太高可以在这后加小的延时
  81   1              LCM_E = 0; //延时
  82   1              LCM_E = 1;
  83   1      }
  84          
  85          //写指令
  86          void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
  87          {
  88   1              if (BuysC) ReadStatusLCM(); //根据需要检测忙
  89   1              LCM_Data = WCLCM;
  90   1              LCM_RS = 0;
  91   1              LCM_RW = 0;     
  92   1              LCM_E = 0;
  93   1              LCM_E = 0;
  94   1              LCM_E = 1;      
  95   1      }
  96          
  97          //读数据
  98          unsigned char ReadDataLCM(void)
  99          {
 100   1              LCM_RS = 1; 
 101   1              LCM_RW = 1;
 102   1              LCM_E = 0;
 103   1              LCM_E = 0;
 104   1              LCM_E = 1;
 105   1              return(LCM_Data);
 106   1      }
 107          
 108          //读状态
 109          unsigned char ReadStatusLCM(void)
 110          {
 111   1              LCM_Data = 0xFF; 
 112   1              LCM_RS = 0;
 113   1              LCM_RW = 1;
 114   1              LCM_E = 0;
 115   1              LCM_E = 0;
 116   1              LCM_E = 1;
 117   1              while (LCM_Data & Busy); //检测忙信号
C51 COMPILER V8.05a   PS2KEY                                                               10/20/2008 09:46:38 PAGE 3   

 118   1              return(LCM_Data);
 119   1      }
 120          
 121          void LCMInit(void) //LCM初始化
 122          {
 123   1              LCM_Data = 0;
 124   1              WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
 125   1              Delay5Ms(); 
 126   1              WriteCommandLCM(0x38,0);
 127   1              Delay5Ms(); 
 128   1              WriteCommandLCM(0x38,0);
 129   1              Delay5Ms(); 
 130   1      
 131   1              WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
 132   1              WriteCommandLCM(0x08,1); //关闭显示
 133   1              WriteCommandLCM(0x01,1); //显示清屏
 134   1              WriteCommandLCM(0x06,1); // 显示光标移动设置
 135   1              WriteCommandLCM(0x0F,1); // 显示开及光标设置
 136   1      }
 137          
 138          //按指定位置显示一个字符
 139          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
 140          {
 141   1              Y &= 0x1;
 142   1              X &= 0xF; //限制X不能大于15,Y不能大于1
 143   1              if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
 144   1              X |= 0x80; //算出指令码
 145   1              WriteCommandLCM(X, 1); //发命令字
 146   1              WriteDataLCM(DData); //发数据
 147   1      }
 148          
 149          //按指定位置显示一串字符
 150          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
 151          {
 152   1              unsigned char ListLength;
 153   1      
 154   1        ListLength = 0;
 155   1              Y &= 0x1;
 156   1              X &= 0xF; //限制X不能大于15,Y不能大于1
 157   1              while (DData[ListLength]>0x19) //若到达字串尾则退出
 158   1                      {
 159   2                              if (X <= 0xF) //X坐标应小于0xF
 160   2                                      {
 161   3                                              DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
 162   3                                              ListLength++;
 163   3                                              X++;
 164   3                                      }
 165   2                      }
 166   1      }
 167          
 168          //5ms延时
 169          void Delay5Ms(void)
 170          {
 171   1              unsigned int TempCyc = 5552;
 172   1              while(TempCyc--);
 173   1      }
 174          
 175          //400ms延时
 176          void Delay400Ms(void)
 177          {
 178   1              unsigned char TempCycA = 5;
 179   1              unsigned int TempCycB;
C51 COMPILER V8.05a   PS2KEY                                                               10/20/2008 09:46:38 PAGE 4   

 180   1              while(TempCycA--)
 181   1                      {
 182   2                              TempCycB=7269;
 183   2                              while(TempCycB--);
 184   2                      };
 185   1      }
 186          
 187          
 188          
 189          
 190          void Keyboard_out(void) interrupt 0
 191          {
 192   1              if ((IntNum > 0) && (IntNum < 9))
 193   1                      {                       
 194   2                              KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
 195   2                              if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
 196   2                      }
 197   1              IntNum++;
 198   1              while (!Key_CLK); //等待PS/2CLK拉高
 199   1      
 200   1              if (IntNum > 10)
 201   1                      {
 202   2                              IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
 203   2                              BF = 1; //标识有字符输入完了
 204   2                              EA = 0; //关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数

⌨️ 快捷键说明

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