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

📄 ps2.lst

📁 607506ps2Test 607506ps2Test 607506ps2Test 607506ps2Test
💻 LST
字号:
C51 COMPILER V7.06   PS2                                                                   06/06/2004 19:47:47 PAGE 1   


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

stmt level    source

   1          #include <at89x51.h>
   2          #include "scancodes.h"
   3          
   4          #define LCM_RW    P1_1 //定义LCD引脚
   5          #define LCM_RS    P1_0
   6          #define LCM_E     P1_2
   7          #define LCM_Data  P0
   8          
   9          #define Key_Data  P1_7 //定义Keyboard引脚
  10          #define Key_CLK   P3_2
  11          
  12          #define Busy 0x80 //用于检测LCM状态字中的Busy标识
  13          
  14          void LCMInit(void);
  15          void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData);
  16          void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData);
  17          void Delay5Ms(void);
  18          void Delay400Ms(void);
  19          void Decode(unsigned char ScanCode);
  20          void WriteDataLCM(unsigned char WDLCM);
  21          void WriteCommandLCM(unsigned char WCLCM,BuysC);
  22          
  23          unsigned char ReadDataLCM(void);
  24          unsigned char ReadStatusLCM(void);
  25          unsigned char code cdle_net[] = {"-www.cdle.net--"};
  26          unsigned char code email[] = {"pnzwzw@cdle.net"};
  27          unsigned char code Cls[] = {" "};
  28          static unsigned char IntNum = 0; //中断次数计数
  29          static unsigned char KeyV; //键值
  30          static unsigned char DisNum = 0; //显示用指针
  31          static unsigned char Key_UP=0, Shift = 0;//Key_UP是键松开标识,Shift是Shift键按下标识
  32          static unsigned char BF = 0; //标识是否有字符被收到
  33          
  34          void main(void)
  35          {
  36   1              unsigned char TempCyc;
  37   1      
  38   1              Delay400Ms(); //启动等待,等LCM讲入工作状态
  39   1              LCMInit(); //LCM初始化 
  40   1              Delay5Ms(); //延时片刻(可不要)
  41   1      
  42   1              DisplayListChar(0, 0, cdle_net);
  43   1              DisplayListChar(0, 1, email);
  44   1              ReadDataLCM();//测试用句无意义
  45   1              for(TempCyc=0; TempCyc<10; TempCyc++) {
  46   2                      Delay400Ms(); //延时
  47   2              }
  48   1              DisplayListChar(0, 1, Cls);
  49   1      
  50   1              IT0 = 0; //设外部中断1为低电平触发
  51   1              EX0 = 1; //开中断
  52   1              EA = 1;
  53   1      
  54   1              while(1) {
  55   2                      if(BF)
C51 COMPILER V7.06   PS2                                                                   06/06/2004 19:47:47 PAGE 2   

  56   2                              Decode(KeyV);
  57   2                      else {
  58   3                              EA = 1; //开中断
  59   3                      }
  60   2              }
  61   1      }
  62          
  63          //写数据
  64          void WriteDataLCM(unsigned char WDLCM) 
  65          {
  66   1              ReadStatusLCM(); //检测忙
  67   1              LCM_Data = WDLCM;
  68   1              LCM_RS = 1;
  69   1              LCM_RW = 0;
  70   1              LCM_E = 0; //若晶振速度太高可以在这后加小的延时
  71   1              LCM_E = 0; //延时
  72   1              LCM_E = 1;
  73   1      }
  74          
  75          //写指令
  76          void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
  77          {
  78   1              if(BuysC) ReadStatusLCM(); //根据需要检测忙
  79   1              LCM_Data = WCLCM;
  80   1              LCM_RS = 0;
  81   1              LCM_RW = 0;
  82   1              LCM_E = 0;
  83   1              LCM_E = 0;
  84   1              LCM_E = 1; 
  85   1      }
  86          
  87          //读数据
  88          unsigned char ReadDataLCM(void)
  89          {
  90   1              LCM_RS = 1; 
  91   1              LCM_RW = 1;
  92   1              LCM_E = 0;
  93   1              LCM_E = 1;
  94   1      
  95   1      return(LCM_Data);
  96   1      }
  97          
  98          //读状态
  99          unsigned char ReadStatusLCM(void)
 100          {
 101   1              LCM_Data = 0xFF; 
 102   1              LCM_RS = 0;
 103   1              LCM_RW = 1;
 104   1              LCM_E = 0;
 105   1              LCM_E = 1;
 106   1              while(LCM_Data & Busy); //检测忙信号
 107   1      
 108   1              return(LCM_Data);
 109   1      }
 110          
 111          void LCMInit(void) //LCM初始化
 112          {
 113   1              LCM_Data = 0;
 114   1              WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
 115   1              Delay5Ms(); 
 116   1              WriteCommandLCM(0x38,0);
 117   1              Delay5Ms(); 
C51 COMPILER V7.06   PS2                                                                   06/06/2004 19:47:47 PAGE 3   

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

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

⌨️ 快捷键说明

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