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

📄 main.lst

📁 KeilC开发,51通过8255对外部4*4键盘进行控制.按键分别为0-9以及上下左右,加上确认取消.
💻 LST
字号:
C51 COMPILER V7.06   MAIN                                                                  09/02/2005 20:04:34 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include <reg51.h>
   2          #include <stdio.h>
   3          #include <8255A.h>
   4          #include <intrins.h>
   5          #include <keyboard.h>
   6          #define ADDR_LED XBYTE[0X4000]
   7          /*////////////////////////////*/
   8          /*/                     常量定义         /*/
   9          /*////////////////////////////*/
  10          
  11          /* 定时器初值 */
  12          #define V_T1   0xfd   /*SCOM  9600 baud,  ! notice: crystal 11.0592MHz */
  13          #define V_TH0   0xee  /*   ~ 5ms ,  ! notice: crystal 11.0592MHz */
  14          #define V_TL0   0x00
  15          
  16          /* 1s软件定时器溢出值,200个5ms */
  17          #define V_T1s   200
  18          
  19          /* 数码管段驱动寄存器地址 */
  20          #define ADDR_8SEG       XBYTE[0x2000]
  21          
  22          /* 数码管位驱动和指示灯驱动寄存器地址 */
  23          #define ADDR_SEL        XBYTE[0x4000]
  24          
  25          /* 按键 */
  26          sbit KEY1=      P1^0;   /*P1^0等同p1.0管脚*/
  27          sbit KEY2=      P1^1;
  28          sbit KEY3=      P1^2;
  29          sbit KEY4=      P1^3;
  30          
  31          
  32          /*////////////////////////////*/
  33          /*/                     变量定义         /*/
  34          /*////////////////////////////*/
  35          
  36          /* 1s软件定时器计数 */
  37          unsigned char clock1s,k=0,key;
  38          /* 1s软件定时器溢出标志,位变量 */
  39          bit clock1s_flag;
  40          
  41          /* 数码管位驱动和指示灯驱动信号输出缓存,定义了一个可位寻址的变量 */
  42          unsigned char bdata output_sel;
  43                  sbit led_1 = output_sel^5;
  44                  sbit led_2 = output_sel^6;
  45                  sbit led_3 = output_sel^7;
  46                  sbit led_4 = output_sel^4;
  47          
  48          /* 数码管扫描驱动指针,(为测试外部存储器(U3 6264),特使用xdata类型) */
  49          unsigned char data digi_scaner;
  50          
  51          /* 测试用计数器,(为测试外部存储器(U3 6264),特使用xdata类型) */
  52          unsigned int data test_counter;
  53          /* 扫描字符,(为测试外部存储器(U3 6264),特使用xdata类型) */
  54          unsigned char data digi[4];
  55          
C51 COMPILER V7.06   MAIN                                                                  09/02/2005 20:04:34 PAGE 2   

  56          //
  57          char n=0,key_flag=0;
  58          
  59          //////////////////////////////////////////////////////////////////////////
  60          //////////////////////////////////////////////////////////////////////////
  61          
  62          void Delay()
  63          {
  64   1              Uchar i=0;
  65   1              for(i=0;i<=100;i++);
  66   1      }
  67          
  68          unsigned char CHARTOSEG7(unsigned char DATA)
  69          {
  70   1              unsigned char AA;
  71   1              switch (DATA)
  72   1              {
  73   2                      case  'H': AA=0x89;break; /* 'H'*/
  74   2                  case  'E': AA=0x86;break; /* 'E'*/
  75   2              case  'L': AA=0xc7;break; /* 'L'*/
  76   2              case  'O': AA=0xc0;break; /*字符'O'*/
  77   2              case  'U': AA=0x41;break; /* 'U.'*/
  78   2              case  'J': AA=0xf1;break; /* 'W'的后半部*/
  79   2              case  'o': AA=0xa3;break; /* 'o'*/
  80   2              case  'r': AA=0xaf;break; /* 'r'*/
  81   2              case  'l': AA=0xf9;break; /* 'l'*/
  82   2              case  'd': AA=0xa1;break; /* 'd'*/
  83   2              case  0: AA=0xc0;break; /* ‘0’*/
  84   2              case  1: AA=0xf9;break; /* ‘1’*/
  85   2              case  2: AA=0xa4;break; /* ‘2’*/
  86   2              case  3: AA=0xb0;break; /* ‘3’*/
  87   2              case  4: AA=0x99;break; /* ‘4’*/
  88   2              case  5: AA=0x92;break; /* ‘5’*/
  89   2              case  6: AA=0x82;break; /* ‘6’*/
  90   2              case  7: AA=0xf8;break; /* ‘7’*/
  91   2              case  8: AA=0x80;break; /* ‘8’*/
  92   2              case  9: AA=0x90;break; /* ‘9’*/
  93   2              case 10: AA=0x88;break; /* ‘A’*/
  94   2              case 11: AA=0x83;break; /* ‘B’*/
  95   2              case 12: AA=0xc6;break; /* ‘C’*/
  96   2              case 13: AA=0xa1;break; /* ‘D’*/
  97   2              case 14: AA=0x86;break; /* ‘E’*/
  98   2              case 15: AA=0x8e;break; /* ‘F’*/
  99   2              case '-':AA=0xdf;break; /* 破折号*/
 100   2              case '_':AA=0xf7;break; /* 下划线*/
 101   2              case ' ':AA=0xff;break; /* 消隐  */
 102   2              default: AA=0xff;
 103   2              }
 104   1              return(AA);
 105   1      }
 106          
 107          
 108          
 109          timer0() interrupt 1 using 0         
 110          {
 111   1      
 112   1              EA=0;  /*关中断*/   /*EA: enable all*/
 113   1      
 114   1              /* 重新对计数器赋初值,并启动定时计数 */
 115   1              TH0=V_TH0;
 116   1          TL0=V_TL0;
 117   1          TR0=1;
C51 COMPILER V7.06   MAIN                                                                  09/02/2005 20:04:34 PAGE 3   

 118   1      
 119   1              /* 1秒钟软定时器计数 */
 120   1              if (++clock1s>=V_T1s)
 121   1              {
 122   2                      clock1s_flag = ~clock1s_flag; /*当1秒到时,溢出标志置1 */
 123   2                      clock1s = 0;
 124   2              }
 125   1      
 126   1      
 127   1              output_sel = 0xf0; /*初值,令数码管驱动位无效,指示灯全灭*/
 128   1      
 129   1              /* 检测到按键被按下(0)时,相应的指示灯亮(0) */
 130   1              if (KEY1==0) {led_1 = 0;k=1;}
 131   1                      else if (k==1) {key=1;k=0;}
 132   1              if (KEY2==0) {led_2 = 0;k=2;}
 133   1                      else if (k==2) {key=2;k=0;}
 134   1              if (KEY3==0) {led_3 = 0;k=3;}
 135   1                      else if (k==3) {key=3;k=0;}
 136   1              if (KEY4==0) {led_4 = 0;k=4;}
 137   1                      else if (k==4) {key=4;k=0;}
 138   1      
 139   1              /* 数码管扫描驱动指针值从1到4重复变换,每5ms间隔对一个数码管进行驱动,20ms一个轮回 */
 140   1              if (++digi_scaner>=5) digi_scaner = 1;
 141   1              switch (digi_scaner)
 142   1              {
 143   2                      case 1: /* 驱动第一个数码管 */
 144   2                                      output_sel |= 0x01;
 145   2                                      ADDR_8SEG = CHARTOSEG7(digi[0]);                         /*输出到锁存器U5(在电路图中找)*/
 146   2                                      break;
 147   2      
 148   2                      case 2: /* 驱动第二个数码管 */
 149   2                                      output_sel |= 0x02;
 150   2                                      ADDR_8SEG = CHARTOSEG7(digi[1]); /*输出到锁存器U5*/
 151   2                                      break;
 152   2      
 153   2                      case 3: /* 驱动第三个数码管 */
 154   2                                      output_sel |= 0x04;
 155   2                                      ADDR_8SEG = CHARTOSEG7(digi[2]); /*输出到锁存器U5*/
 156   2                                      break;
 157   2      
 158   2                      case 4: /* 驱动第四个数码管 */
 159   2                                      output_sel |= 0x08;
 160   2                                      ADDR_8SEG = CHARTOSEG7(digi[3]); /*输出到锁存器U5*/
 161   2                                      break;
 162   2              }
 163   1      
 164   1      
 165   1              ADDR_SEL = output_sel;          /*输出到锁存器U6(在电路图中找)*/
 166   1      
 167   1              EA=1;  /*开中断*/
 168   1      }
 169          
 170          
 171          void SerialInit()
 172          {
 173   1              /* 单片机系统初始化 */
 174   1          P1=0XFF;
 175   1          P3=0XFF;
 176   1          /** 中断工作寄存器初始化 **/
 177   1          IE=0X80;
 178   1          IP=0;
 179   1          IT0=0;
C51 COMPILER V7.06   MAIN                                                                  09/02/2005 20:04:34 PAGE 4   

 180   1          IT1=0;
 181   1          /** 定时器工作寄存器初始化 **/
 182   1              TMOD=0X21;
 183   1              TH1=V_T1;
 184   1          TL1=V_T1;
 185   1          TH0=V_TH0;
 186   1          TL0=V_TL0; 
 187   1          /** 串行通信口工作初始化 **/
 188   1              SM0=0;           /*SCOM MODE 1 (8BIT UART VARBR)*/
 189   1          SM1=1;
 190   1              SM2=0;
 191   1              REN=1;
 192   1              TI=1;
 193   1              /** 全局变量赋初值 **/
 194   1              clock1s=0;
 195   1              clock1s_flag=0;
 196   1              digi_scaner=1;
 197   1      
 198   1              /** 开定时器,定时器0中断允许 **/
 199   1          TR0=1;
 200   1          TR1=1;
 201   1              ET0=1;
 202   1              output_sel = 0xf0; /*初值,令数码管驱动位无效,指示灯全灭*/
 203   1      
 204   1      }
 205          
 206          
 207          void main()
 208          {
 209   1              int temp;
 210   1              SerialInit();
 211   1              
 212   1              EA=0;
 213   1              Init8255A();
 214   1              printf("init\n");
 215   1              EA=1;
 216   1      
 217   1              EA=0;
 218   1              SelectForm0(0,0,0,1);
 219   1              
 220   1      //      while(1)
 221   1              {
 222   2      //              PortA=0xff-0x80;
 223   2      //              temp=0;
 224   2      //              while(temp==0)
 225   2                      {
 226   3      //                      temp=getrow();
 227   3                      }
 228   2      //              while(temp!=0)
 229   2                      {
 230   3      //                      temp=getrow();
 231   3                      }
 232   2      //              printf("%d\n",temp);
 233   2              }
 234   1      
 235   1              while (1)
 236   1              {
 237   2      //              if (clock1s_flag) {clock1s_flag=1;printf("%x,%x\n",col,row);}
 238   2                      /*if (key_flag)   
 239   2                      {
 240   2                              EA=0;
 241   2                              putchar(col+0x30);
C51 COMPILER V7.06   MAIN                                                                  09/02/2005 20:04:34 PAGE 5   

 242   2                              putchar(0x20);
 243   2                              putchar(row+0x30);
 244   2                              putchar(13);putchar(10);
 245   2                              key_flag=0;
 246   2                              printf()
 247   2                              EA=1;
 248   2                      }*/
 249   2                      EA=0;
 250   2                      temp=GetKey();
 251   2                      printf("%d\n",temp) ;
 252   2                      EA=1;
 253   2                      digi[0]=temp%10;
 254   2                      digi[1]=temp/10;
 255   2              }
 256   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    580    ----
   CONSTANT SIZE    =     10    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     13       3
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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