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

📄 better.lst

📁 基于IAP12C5A62s2的led显示
💻 LST
字号:
C51 COMPILER V8.02   BETTER                                                                05/12/2012 16:30:22 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE BETTER
OBJECT MODULE PLACED IN better.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE better.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #define uint unsigned int//  // 定义新类型,方便下次使用
   2          #define uchar unsigned char
   3          #include"STC12C5A.h"
   4          #include <intrins.h> 
   5          #define WaitTime 0x01
   6          #define ENABLE_IAP 0x82
   7          #define address 0x2800   
   8          #define CMD_IDLE 0//        //定义时钟频率     
   9          #define CMD_READ 1//        //读命令
  10          #define CMD_PROGRAM 2//     //写命令
  11          #define CMD_ERASE 3//      //擦除命令,一般需要几个毫秒
  12          sbit shang=P2^0;//          //行列式键盘行线的定义
  13          sbit xia=P2^1;
  14          sbit  a =P4^6;//                      // 数码管段码和单片机I/O口的对应关系
  15          sbit  b =P4^5; 
  16          sbit dp =P2^4;
  17          sbit  d =P2^6;
  18          sbit  e =P2^7;
  19          sbit  g =P0^6;
  20          sbit  f =P0^7;
  21          sbit  c =P2^5;
  22          sbit P44=P4^4;//                      //74hc244片选信号
  23          sbit  SMG_1=P0^1;//           //数码管位选信号
  24          sbit  SMG_2=P0^2;
  25          sbit  SMG_3=P0^3;
  26          sbit  SMG_4=P0^4;
  27          sbit  SMG_5=P0^5;
  28          sbit  SMG_6=P0^0;
  29          sbit  P3_6=P3^6;//            //键盘列线的定义
  30          sbit  P3_7=P3^7;
  31          sbit  P2_3=P2^3;
  32          sbit  P2_2=P2^2;
  33          void display(uint cha); 
  34          void start(); 
  35          void delay(uint time);
  36          void disable();
  37          void enable();
  38          void IapIdle();
  39          uint IapReadByte(uint addr);
  40          void IapProgramByte(uint addr, uchar dat);
  41          void IapEraseSector(uint addr);
  42          void INT0_init();
  43          void INT0time() ;
  44          void systeminit();
  45          static uint cha;
  46          static long int yichu;//         //时间计数,一旦达到设定值,关闭数码管 
  47          static bit state;
  48          void main(void)
  49          { 
  50   1        uchar t;
  51   1        shang=0;xia=0;
  52   1        systeminit();//                 //系统初始化函数,stc12c5a62s2单片机的I/O口工作方式的设定
  53   1        start();//                      //系统显示校验函数,这里会从9显示到0,最后显示上一次的数码管亮的值              
  54   1        INT0_init();//                          //开启定时器0中断
  55   1        while(1){     //                        //死循环
C51 COMPILER V8.02   BETTER                                                                05/12/2012 16:30:22 PAGE 2   

  56   2        if(state==0 ){//                //如果状态0,则执行判键及相应的显示函数
  57   3        if(P3_6==0)//                   //键盘1和5的判键
  58   3                { delay(20);
  59   4                  if(P3_6==0)
  60   4                  { shang=1;
  61   5                    if(P3_6==1)
  62   5                          cha=1;
  63   5                    else
  64   5                         cha=5;
  65   5                    shang=0;
  66   5                   }
  67   4                  }
  68   3               if(P3_7==0)//            //键盘2和6的判键
  69   3              { delay(20);
  70   4                if(P3_7==0)
  71   4            { shang=1;  
  72   5                      if(P3_7==1)
  73   5                     cha=2;
  74   5                  else
  75   5                     cha=6;
  76   5                  shang=0;
  77   5                 }
  78   4                }
  79   3              if(P2_3==0)//                     //键盘3和7的判键
  80   3              { delay(20);
  81   4            if(P2_3==0)
  82   4                 { shang=1;
  83   5                   if(P2_3==1)
  84   5                     cha=3;
  85   5                   else
  86   5                     cha=7;
  87   5                   shang=0;
  88   5                      }
  89   4              }
  90   3               if(P2_2==0)              //键盘4的判键
  91   3                { delay(20); 
  92   4                  if(P2_2==0)
  93   4                        cha=4; }
  94   3         }
  95   2        if(!(P2_2==1&&P2_3==1&&P3_6==1&&P3_7==1))      //按键按下判定语句
  96   2      {        yichu=0;              //如果有按键按下,重新设置溢出值,使达到关状态的时间相同
  97   3           if(state==1){         //如果为关闭状态
  98   4           delay(500);           //延时20ms
  99   4               if(!(P2_2==1&&P2_3==1&&P3_6==1&&P3_7==1))        //如果有按键按下,状态清零,开始判键程序
 100   4            state=0;}
 101   3         }
 102   2        if(yichu>=80000)           //达到数码管关闭时间
 103   2                { do{disable();}while(P2_2==1&&P2_3==1&&P3_6==1&&P3_7==1);        //若无按键按下,则执行关闭语句
 104   3              yichu=0;        //重设溢出值
 105   3                  enable();       //点亮数码管
 106   3                      state=1;        //状态设1,为关闭后点亮状态
 107   3            }
 108   2          if(t!=cha)          //如果有不同的键按下
 109   2              { IapEraseSector(address);           //eeprom擦除
 110   3                IapProgramByte(address,cha);       //eeprom写
 111   3                t=cha;            //保存目前的按键值,和下一次做比较,看是否要进行写操作
 112   3                }
 113   2        }
 114   1      
 115   1      }
 116          void systeminit()
 117          { P4SW=0x7F;             
C51 COMPILER V8.02   BETTER                                                                05/12/2012 16:30:22 PAGE 3   

 118   1        P0M1=0x00;
 119   1        P0M0=0xff;
 120   1        P2M1=0x00;
 121   1        P2M0=0xff;
 122   1        P3M1=0x00;
 123   1        P3M0=0xff;
 124   1        P4M1=0x00;
 125   1        P4M0=0xff;
 126   1        P44=0;
 127   1        }
 128          void display(uint cha)             //显示函数,其中小数点一直关闭
 129          { 
 130   1          switch(cha){                                                 
 131   2              case 0: a=1;b=1;c=1;d=1;e=1;f=1;g=0;dp=0;break;         //显示数值0
 132   2              case 1: a=0;b=1;c=1;d=0;e=0;f=0;g=0;dp=0;break;             //显示数值1
 133   2              case 2: a=1;b=1;c=0;d=1;e=1;f=0;g=1;dp=0;break;         //显示数值2
 134   2              case 3: a=1;b=1;c=1;d=1;e=0;f=0;g=1;dp=0;break;         //显示数值3
 135   2              case 4: a=0;b=1;c=1;d=0;e=0;f=1;g=1;dp=0;break;         //显示数值4
 136   2              case 5: a=1;b=0;c=1;d=1;e=0;f=1;g=1;dp=0;break;         //显示数值5
 137   2              case 6: a=1;b=0;c=1;d=1;e=1;f=1;g=1;dp=0;break;         //显示数值6
 138   2              case 7: a=1;b=1;c=1;d=0;e=0;f=0;g=0;dp=0;break;         //显示数值7
 139   2              case 8: a=1;b=1;c=1;d=1;e=1;f=1;g=1;dp=0;break;         //显示数值8
 140   2              case 9: a=1;b=1;c=1;d=1;e=0;f=1;g=1;dp=0;break;         //显示数值9
 141   2                }     
 142   1       }
 143          void INT0_init()           //开启中断,每2000/12 us溢出一次
 144          { TMOD=0x18;
 145   1        TH0=(65536-2000)/256;
 146   1        TL0=(65536-2000)%256;
 147   1        TR0=1;
 148   1        ET0=1;
 149   1        EA=1;
 150   1        }
 151          void start(void)          //系统初始显示函数
 152          { 
 153   1         uchar  time=100;
 154   1         char  i;
 155   1         shang=0;xia=0;                         
 156   1         enable();
 157   1         for(i=9;i>=0;i--)      //显示数字9-0
 158   1         { display(i);
 159   2           delay(3000);
 160   2               }
 161   1         do{display(IapReadByte(address));yichu--;}while((P3_6&&P3_7&&P2_3&&P2_2==1));        //如无按键按下,则
             -显示上一次保存的数值
 162   1         }
 163          void delay(uint time )     //延时函数
 164          { 
 165   1              unsigned long int j=time*40;
 166   1              do{ 
 167   2                  ;  }while(j--);
 168   1       }       
 169           void disable()           //数码管关闭
 170           {
 171   1               SMG_1=0;
 172   1               SMG_2=0;
 173   1               SMG_3=0;
 174   1               SMG_4=0;
 175   1               SMG_5=0;
 176   1               SMG_6=0; 
 177   1               }
 178           void enable()             //数码管开启显示
C51 COMPILER V8.02   BETTER                                                                05/12/2012 16:30:22 PAGE 4   

 179           {
 180   1               SMG_1=1;
 181   1               SMG_2=1;
 182   1               SMG_3=1;
 183   1               SMG_4=1;
 184   1               SMG_5=1;
 185   1               SMG_6=1; 
 186   1               }
 187           void INT0time() interrupt 1      //定时器中断0
 188           {   static uchar liangdu;               
 189   1               TH0=(65536-2000)/256;
 190   1           TL0=(65536-2000)%256;
 191   1               display(cha);
 192   1               liangdu++;
 193   1               if(liangdu<=2*cha)           //pwm控制程序,其中数字1亮度最小,占空比最小
 194   1                 P44=0;
 195   1               else
 196   1              {
 197   2                P44=1;
 198   2                if(liangdu==15)
 199   2                  liangdu=0;
 200   2               }      
 201   1              yichu++;                      //每溢出一次,溢出次数加一
 202   1      
 203   1              }
 204          
 205          void IapIdle()                    //eeprom初始函数
 206          { IAP_CONTR = 0; 
 207   1        IAP_CMD   = 0; 
 208   1        IAP_TRIG  = 0; 
 209   1        IAP_ADDRH = 0x80; 
 210   1        IAP_ADDRL = 0; 
 211   1      }
 212          uint IapReadByte(uint addr)
 213          { uint dat;
 214   1        IAP_CONTR =ENABLE_IAP;
 215   1        IAP_CMD   = CMD_READ; 
 216   1        IAP_ADDRL = addr; 
 217   1        IAP_ADDRH = addr >> 8; 
 218   1        IAP_TRIG  = 0x5a;             //因为是IAP单片机,所以触发命令有所不同
 219   1        IAP_TRIG  = 0xa5; 
 220   1        _nop_(); 
 221   1        dat = IAP_DATA;
 222   1        IapIdle(); 
 223   1        return dat; 
 224   1      }
 225          void IapProgramByte(uint addr,uchar dat)    //eeprom写函数
 226          {IAP_CONTR = ENABLE_IAP; 
 227   1      IAP_CMD = CMD_PROGRAM; 
 228   1      IAP_ADDRL = addr; 
 229   1      IAP_ADDRH = addr >> 8; 
 230   1      IAP_DATA = dat;
 231   1      IAP_TRIG = 0x5a; 
 232   1      IAP_TRIG = 0xa5; 
 233   1      _nop_(); 
 234   1      IapIdle();
 235   1      }
 236          void IapEraseSector(uint addr)        //eeprom扇区擦出函数
 237          {IAP_CONTR = ENABLE_IAP; 
 238   1      IAP_CMD = CMD_ERASE; 
 239   1      IAP_ADDRH=addr>>8; 
 240   1      IAP_ADDRL=addr;
C51 COMPILER V8.02   BETTER                                                                05/12/2012 16:30:22 PAGE 5   

 241   1      IAP_TRIG = 0x5a; 
 242   1      IAP_TRIG = 0xa5;
 243   1      _nop_(); 
 244   1      IapIdle();
 245   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    834    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7       7
   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 + -