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

📄 text.lst

📁 自制的 PS2+51+1602测试的程序 同样适合初学者 了解和掌握51单片机学习
💻 LST
字号:
C51 COMPILER V8.02   TEXT                                                                  10/13/2007 21:47:57 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE TEXT
OBJECT MODULE PLACED IN Text.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE Text.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*         51单片机+1602LCD+PC键盘(测试OK)[路漫漫其修远兮,吾将上下而求索!] 
   2          [ 2007-1-25 10:06:00 | By: elecqht ]    */
   3            
   4          #include <Reg51.h>
   5          #include <intrins.h>   //_nop_();
   6          #include <stdio.h>
   7          #define uchar unsigned char
   8          #define uint  unsigned int
   9          #define ulong unsigned long
  10          #define nops() {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
  11          
  12          sbit LCM_RW= P3^6; //定义LCD引脚
  13          sbit LCM_RS= P3^7;
  14          sbit LCM_E=  P1^7;
  15          #define LCM_Data P0
  16          
  17          sbit Key_Data =P1^6; //定义Keyboard引脚
  18          sbit Key_CLK=  P3^3;
  19          
  20          #define Busy 0x80 //用于检测LCM状态字中的Busy标识
  21          
  22          void LCMInit(void);
  23          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  24          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  25          void Delay5Ms(void);
  26          void Delay400Ms(void);
  27          void Decode(unsigned char ScanCode);
  28          void WriteDataLCM(unsigned char WDLCM);
  29          void WriteCommandLCM(unsigned char WCLCM,BuysC);
  30          
  31          unsigned char ReadDataLCM(void);
  32          unsigned char ReadStatusLCM(void);
  33          unsigned char code cdle_net[] = {"www.newmcu.com"};
  34          unsigned char code email[] = {"zsdfwnl@163.com"};
  35          unsigned char code Cls[] = {" "};
  36          static unsigned char IntNum = 0; //中断次数计数
  37          static unsigned char KeyV; //键值
  38          static unsigned char DisNum = 0; //显示用指针
  39          static unsigned char Key_UP=0, Shift = 0;//Key_UP是键松开标识,Shift是Shift键按下标识
  40          static unsigned char BF = 0; //标识是否有字符被收到
  41          unsigned char code UnShifted[59][2] = 
  42          {
  43          0x1C, 'a',
  44          0x32, 'b',
  45          0x21, 'c',
  46          0x23, 'd',
  47          0x24, 'e',
  48          0x2B, 'f',
  49          0x34, 'g',
  50          0x33, 'h',
  51          0x43, 'i',
  52          0x3B, 'j',
  53          0x42, 'k',
  54          0x4B, 'l',
  55          0x3A, 'm',
C51 COMPILER V8.02   TEXT                                                                  10/13/2007 21:47:57 PAGE 2   

  56          0x31, 'n',
  57          0x44, 'o',
  58          0x4D, 'p',
  59          0x15, 'q',
  60          0x2D, 'r',
  61          0x1B, 's',
  62          0x2C, 't',
  63          0x3C, 'u',
  64          0x2A, 'v',
  65          0x1D, 'w',
  66          0x22, 'x',
  67          0x35, 'y',
  68          0x1A, 'z',
  69          0x45, '0',
  70          0x16, '1',
  71          0x1E, '2',
  72          0x26, '3',
  73          0x25, '4',
  74          0x2E, '5',
  75          0x36, '6',
  76          0x3D, '7',
  77          0x3E, '8',
  78          0x46, '9',
  79          0x0E, '`',
  80          0x4E, '-',
  81          0x55, '=',
  82          0x5D, '\\',
  83          0x29, ' ',
  84          0x54, '[',
  85          0x5B, ']',
  86          0x4C, ';',
  87          0x52, '\'',
  88          0x41, ',',
  89          0x49, '.',
  90          0x4A, '/',
  91          0x71, '.',
  92          0x70, '0',
  93          0x69, '1',
  94          0x72, '2',
  95          0x7A, '3',
  96          0x6B, '4',
  97          0x73, '5',
  98          0x74, '6',
  99          0x6C, '7',
 100          0x75, '8',
 101          0x7D, '9',
 102          };
 103          
 104          unsigned char code Shifted[59][2] = {
 105          0x1C, 'A',
 106          0x32, 'B',
 107          0x21, 'C',
 108          0x23, 'D',
 109          0x24, 'E',
 110          0x2B, 'F',
 111          0x34, 'G',
 112          0x33, 'H',
 113          0x43, 'I',
 114          0x3B, 'J',
 115          0x42, 'K',
 116          0x4B, 'L',
 117          0x3A, 'M',
C51 COMPILER V8.02   TEXT                                                                  10/13/2007 21:47:57 PAGE 3   

 118          0x31, 'N',
 119          0x44, 'O',
 120          0x4D, 'P',
 121          0x15, 'Q',
 122          0x2D, 'R',
 123          0x1B, 'S',
 124          0x2C, 'T',
 125          0x3C, 'U',
 126          0x2A, 'V',
 127          0x1D, 'W',
 128          0x22, 'X',
 129          0x35, 'Y',
 130          0x1A, 'Z',
 131          0x45, '0',
 132          0x16, '1',
 133          0x1E, '2',
 134          0x26, '3',
 135          0x25, '4',
 136          0x2E, '5',
 137          0x36, '6',
 138          0x3D, '7',
 139          0x3E, '8',
 140          0x46, '9',
 141          0x0E, '~',
 142          0x4E, '_',
 143          0x55, '+',
 144          0x5D, '|',
 145          0x29, ' ',
 146          0x54, '{',
 147          0x5B, '}',
 148          0x4C, ':',
 149          0x52, '"',
 150          0x41, '<',
 151          0x49, '>',
 152          0x4A, '?',
 153          0x71, '.',
 154          0x70, '0',
 155          0x69, '1',
 156          0x72, '2',
 157          0x7A, '3',
 158          0x6B, '4',
 159          0x73, '5',
 160          0x74, '6',
 161          0x6C, '7',
 162          0x75, '8',
 163          0x7D, '9',
 164          };
 165          
 166           
 167          
 168          void main(void)
 169          {
 170   1      unsigned char TempCyc;
 171   1      
 172   1      Delay400Ms(); //启动等待,等LCM讲入工作状态
 173   1      LCMInit(); //LCM初始化 
 174   1      Delay5Ms(); //延时片刻(可不要)
 175   1      
 176   1      DisplayListChar(0, 0, cdle_net);
 177   1      DisplayListChar(0, 1, email);
 178   1      ReadDataLCM();//测试用句无意义+
 179   1      for (TempCyc=0; TempCyc<10; TempCyc++)
C51 COMPILER V8.02   TEXT                                                                  10/13/2007 21:47:57 PAGE 4   

 180   1      Delay400Ms(); //延时                                    
 181   1      DisplayListChar(0, 1, Cls); 
 182   1      
 183   1      IT1 = 0; //设外部中断1为低电平触发
 184   1      EA = 1;
 185   1      EX1 = 1; //开中断
 186   1      
 187   1      do
 188   1      {
 189   2      if (BF)
 190   2      Decode(KeyV);
 191   2      else
 192   2      EA = 1; //开中断
 193   2      }       
 194   1      while(1);
 195   1      
 196   1      }
 197          
 198          //写数据
 199          void WriteDataLCM(unsigned char WDLCM) 
 200          {
 201   1      ReadStatusLCM(); //检测忙
 202   1      LCM_Data = WDLCM;
 203   1      LCM_RS = 1;
 204   1      LCM_RW = 0;
 205   1      LCM_E = 0; //若晶振速度太高可以在这后加小的延时
 206   1      LCM_E = 0; //延时
 207   1      LCM_E = 1;
 208   1      }
 209          
 210          //写指令
 211          void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
 212          {
 213   1      if (BuysC) ReadStatusLCM(); //根据需要检测忙
 214   1      LCM_Data = WCLCM;
 215   1      LCM_RS = 0;
 216   1      LCM_RW = 0; 
 217   1      LCM_E = 0;
 218   1      LCM_E = 0;
 219   1      LCM_E = 1; 
 220   1      }
 221          
 222          //读数据
 223          unsigned char ReadDataLCM(void)
 224          {
 225   1      LCM_RS = 1; 
 226   1      LCM_RW = 1;
 227   1      LCM_E = 0;
 228   1      LCM_E = 0;
 229   1      LCM_E = 1;
 230   1      return(LCM_Data);
 231   1      }
 232          
 233          //读状态
 234          unsigned char ReadStatusLCM(void)
 235          {
 236   1      LCM_Data = 0xFF; 
 237   1      LCM_RS = 0;
 238   1      LCM_RW = 1;
 239   1      LCM_E = 0;
 240   1      LCM_E = 0;
 241   1      LCM_E = 1;
C51 COMPILER V8.02   TEXT                                                                  10/13/2007 21:47:57 PAGE 5   

 242   1      while (LCM_Data & Busy); //检测忙信号
 243   1      return(LCM_Data);
 244   1      }
 245          
 246          void LCMInit(void) //LCM初始化
 247          {
 248   1      LCM_Data = 0;
 249   1      WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
 250   1      Delay5Ms(); 
 251   1      WriteCommandLCM(0x38,0);
 252   1      Delay5Ms(); 
 253   1      WriteCommandLCM(0x38,0);
 254   1      Delay5Ms(); 
 255   1      
 256   1      WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
 257   1      WriteCommandLCM(0x08,1); //关闭显示
 258   1      WriteCommandLCM(0x01,1); //显示清屏 
 259   1      WriteCommandLCM(0x06,1); // 显示光标移动设置
 260   1      WriteCommandLCM(0x0F,1); // 显示开及光标设置
 261   1      }
 262          
 263          //按指定位置显示一个字符
 264          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
 265          {
 266   1      Y &= 0x1;
 267   1      X &= 0xF; //限制X不能大于15,Y不能大于1
 268   1      X|= 0x40; //当要显示第二行时地址码+0x40;
 269   1      X |= 0x80; //算出指令码
 270   1      WriteCommandLCM(X, 1); //发命令字
 271   1      WriteDataLCM(DData); //发数据
 272   1      }
 273          
 274          //按指定位置显示一串字符
 275          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
 276          {
 277   1      unsigned char ListLength;
 278   1      
 279   1      ListLength = 0;
 280   1      Y &= 0x1;
 281   1      X &= 0xF; //限制X不能大于15,Y不能大于1
 282   1      while (DData[ListLength]>0x19) //若到达字串尾则退出
 283   1      {
 284   2      if (X <= 0xF) //X坐标应小于0xF
 285   2      {
 286   3      DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
 287   3      ListLength++;
 288   3      X++;
 289   3      }
 290   2      }
 291   1      }
 292          
 293          //5ms延时
 294          void Delay5Ms(void)
 295          {
 296   1      unsigned int TempCyc = 5552;
 297   1      while(TempCyc--);
 298   1      }
 299          
 300          //400ms延时
 301          void Delay400Ms(void)
 302          {
 303   1      unsigned char TempCycA = 5;
C51 COMPILER V8.02   TEXT                                                                  10/13/2007 21:47:57 PAGE 6   

 304   1      unsigned int TempCycB;
 305   1      while(TempCycA--)
 306   1      {
 307   2      TempCycB=7269;
 308   2      while(TempCycB--);
 309   2      };
 310   1      }
 311          
 312          void Keyboard_out(void) interrupt 2
 313          {
 314   1      if ((IntNum > 0) && (IntNum < 9))
 315   1      { 
 316   2      KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
 317   2      if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
 318   2      }
 319   1      IntNum++;
 320   1      while (!Key_CLK); //等待PS/2CLK拉高
 321   1      
 322   1      if (IntNum > 10)
 323   1      {
 324   2      IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
 325   2      BF = 1; //标识有字符输入完了
 326   2      EA = 0; //关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数要声
             -明为再入函数)
 327   2      }
 328   1      }
 329          
 330          void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码
             -+shift的断码+G的断码
 331          {
 332   1      unsigned char TempCyc; 
 333   1      
 334   1      if (!Key_UP) //当键盘松开时
 335   1      {
 336   2      switch (ScanCode)
 337   2      {
 338   3      case 0xF0 : // 当收到0xF0,Key_UP置1表示断码开始
 339   3      Key_UP = 1;
 340   3      break;
 341   3      
 342   3      case 0x12 : // 左 SHIFT
 343   3      Shift = 1;
 344   3      break;
 345   3      
 346   3      case 0x59 : // 右 SHIFT
 347   3      Shift = 1;
 348   3      break;
 349   3      
 350   3      default: 
 351   3      if (DisNum > 15)
 352   3      {
 353   4      DisplayListChar(0, 1, Cls);//清LCD第二行
 354   4      DisNum = 0; 
 355   4      }
 356   3      if(!Shift) //如果SHIFT没按下
 357   3      {
 358   4      for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
 359   4      if (UnShifted[TempCyc][0] == ScanCode) DisplayOneChar(DisNum, 1, UnShifted[TempCyc][1]);
 360   4      DisNum++;
 361   4      } 
 362   3      else //按下SHIFT
 363   3      {
C51 COMPILER V8.02   TEXT                                                                  10/13/2007 21:47:57 PAGE 7   

 364   4      for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
 365   4      if (Shifted[TempCyc][0] == ScanCode) DisplayOneChar(DisNum, 1, Shifted[TempCyc][1]);
 366   4      DisNum++;
 367   4      }
 368   3      
 369   3      break;
 370   3      }
 371   2      }
 372   1      else
 373   1      { 
 374   2      Key_UP = 0;
 375   2      switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理
 376   2      {
 377   3      case 0x12 : // 左 SHIFT
 378   3      Shift = 0;
 379   3      break;
 380   3      
 381   3      case 0x59 : // 右 SHIFT
 382   3      Shift = 0;
 383   3      break;
 384   3      }
 385   2      }
 386   1      BF = 0; //标识字符处理完了
 387   1      } 
 388          
 389           
 390            


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    592    ----
   CONSTANT SIZE    =    269    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      6      11
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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