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

📄 test.lst

📁 用51单片机做的简单频率计,KEIL C环境,带工程文件,可直接编译运行.主要演示如何在内存很少,无法启用RTOS的单片机(例如2051)中使用状态机和时间片来完成实时多任务并行处理.例子中对键盘,信
💻 LST
字号:
C51 COMPILER V7.02b   TEST                                                                 05/11/2003 22:20:35 PAGE 1   


C51 COMPILER V7.02b, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN test.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE test.c ROM(SMALL) BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include <reg51.h>
   2          
   3          unsigned char* ver = "00000000";
   4          
   5          sbit CS0 = P3^7;
   6          sbit CS1 = P3^1;
   7          sbit CS2 = P3^0;
   8          sbit CS3 = P3^3;
   9          
  10          sbit KEY_SET    = P3^5;
  11          sbit KEY_FUNC   = P3^4;
  12          sbit IN_PIN             = P3^2;
  13          
  14          #define DATA_PORT P1
  15          
  16          void out_cs_mask(bit n){
  17   1              CS0 = n;
  18   1              CS1 = n;
  19   1              CS2 = n;
  20   1              CS3 = n;
  21   1      }
  22          
  23          void out_cs(unsigned char cs, bit n){
  24   1              switch (cs){
  25   2                      case 0:                 CS0 = n;                        break;
  26   2                      case 1:                 CS1 = n;                        break;
  27   2                      case 2:                 CS2 = n;                        break;
  28   2                      case 3:                 CS3 = n;                        break;
  29   2              }
  30   1      }
  31          
  32          unsigned char font[16] = "\xe7\x84\xd3\xd6" "\xb4\x76\x77\xe4" "\xf7\xf6\x00\x00" "\x00\x00\x00\x00";
  33          
  34          #define DISP_WIDTH 4
  35          unsigned char disp_buff[DISP_WIDTH];
  36          
  37          unsigned char dot_pos = DISP_WIDTH;
  38          unsigned char disp_cs = 0;
  39          void out_disp_buff(){
  40   1              unsigned char disp_data;
  41   1              out_cs_mask(0);
  42   1      
  43   1              disp_data = disp_buff[disp_cs];//~表示共阳驱动,不加该运算则是共阴驱动
  44   1              if (dot_pos == disp_cs)
  45   1                      disp_data |= 0x08;
  46   1      
  47   1              if ((disp_cs & 1) == 0){
  48   2                      unsigned char d;
  49   2                      d = (disp_data & 0x80) >> 3;
  50   2                      d |= (disp_data & 0x40) >> 1;
  51   2                      d |= (disp_data & 0x20) << 1;
  52   2                      d |= (disp_data & 0x10) << 3;
  53   2                      d |= (disp_data & 0x8) >> 3;
  54   2                      d |= (disp_data & 0x4) >> 1;
  55   2                      d |= (disp_data & 0x2) << 1;
C51 COMPILER V7.02b   TEST                                                                 05/11/2003 22:20:35 PAGE 2   

  56   2                      d |= (disp_data & 0x1) << 3;
  57   2                      disp_data = d;
  58   2              }
  59   1      
  60   1              DATA_PORT = ~disp_data;
  61   1              out_cs(disp_cs, 1);
  62   1              disp_cs++;
  63   1              if (disp_cs == DISP_WIDTH)
  64   1                      disp_cs = 0;
  65   1      }
  66          
  67          bit sys_wake_up = 0;
  68          bit gate_start = 0;
  69          
  70          unsigned char jiffies = 0;
  71          unsigned int gate = 0;
  72          void timer_isr(void) interrupt 1 using 1{
  73   1              jiffies++;
  74   1              if(IN_PIN){
  75   2                      if(gate_start){
  76   3                              gate_start = 0;
  77   3                              sys_wake_up = 1;
  78   3                      }
  79   2              }else{
  80   2                      if(!gate_start){
  81   3                              gate_start = 1;
  82   3                              gate = 0;
  83   3                      }else
  84   2                              gate++;
  85   2              }
  86   1      
  87   1              if (jiffies % 10 == 0)
  88   1                      sys_wake_up = 1;
  89   1      }
  90          
  91          void timer_init(void){
  92   1              TMOD=0x02;
  93   1              TH0=TL0=-100;//12M
  94   1      //      TH0=TL0=-200;//24M
  95   1              EA=1;
  96   1              ET0=1;
  97   1              TR0=1;
  98   1      }
  99          
 100          #define CALC_DEC(x) ((n / x) % 10)
 101          void out_dec(unsigned int n, unsigned char dot_poss){
 102   1              unsigned char i;
 103   1              disp_buff[0] = font[CALC_DEC(1000)];
 104   1              disp_buff[1] = font[CALC_DEC(100)];
 105   1              disp_buff[2] = font[CALC_DEC(10)];
 106   1              disp_buff[3] = font[CALC_DEC(1)];
 107   1              disp_buff[dot_poss] |= 0x08;
 108   1              for(i=0; i<DISP_WIDTH; i++){
 109   2                      if (disp_buff[i] != font[0])
 110   2                              break;
 111   2                      disp_buff[i] = 0x00;
 112   2              }
 113   1      }
 114          
 115          #define FUCTION_FREQENCY 0
 116          #define FUCTION_PULSE 1
 117          #define FUCTION_MAX 2
C51 COMPILER V7.02b   TEST                                                                 05/11/2003 22:20:35 PAGE 3   

 118          unsigned char function_select = FUCTION_FREQENCY;
 119          
 120          bit key_func = 0;
 121          
 122          void key_scan(void){
 123   1              //按键为低电平触发,如要改为高电平触发,将"!KEY_FUNC"中的"!"去掉.
 124   1              if(!KEY_FUNC){
 125   2                      if(!key_func){//原来未按下,改变设置模式,否则不作处理.
 126   3                              function_select++;
 127   3                              if (function_select == FUCTION_MAX)
 128   3                                      function_select = FUCTION_FREQENCY;//FUCTION_FREQENCY == 0
 129   3                              key_func = 1;
 130   3                      }
 131   2              }else
 132   1                      key_func = 0;
 133   1      }
 134          
 135          #define FLASH_CHECK(x) disp_flash % x < x / 2
 136          void sys_run(){
 137   1              out_dec(0, DISP_WIDTH - 1);
 138   1              while(1){
 139   2                      if (!sys_wake_up)
 140   2                              continue;
 141   2                      sys_wake_up = 0;
 142   2      
 143   2                      key_scan();
 144   2      
 145   2                      if(function_select == FUCTION_FREQENCY){
 146   3                              unsigned int value = 8888;
 147   3                              unsigned char dot_poss = DISP_WIDTH - 1;
 148   3                              if(gate < 10){
 149   4                                      value = 10000 / gate;
 150   4                                      dot_poss = DISP_WIDTH - 1;
 151   4                              }else if(gate < 100){
 152   4                                      value = 100000 / gate;
 153   4                                      dot_poss = DISP_WIDTH - 2;
 154   4                              }else if(gate < 1000){
 155   4                                      value = 1000000 / gate;
 156   4                                      dot_poss = DISP_WIDTH - 3;
 157   4                              }else if(gate < 10000){
 158   4                                      value = 10000000 / gate;
 159   4                                      dot_poss = DISP_WIDTH - 4;
 160   4                              }
 161   3      
 162   3                              out_dec(value, dot_poss);
 163   3                      }else{
 164   3                              if(gate < 9999)
 165   3                                      out_dec(gate, DISP_WIDTH - 1);
 166   3                              else
 167   3                                      out_dec(gate / 10, DISP_WIDTH - 2);
 168   3                      }
 169   2      
 170   2                      out_disp_buff();
 171   2              }
 172   1      }
 173          
 174          void main(){
 175   1              timer_init();
 176   1              sys_run();
 177   1      }
 178          
 179          
C51 COMPILER V7.02b   TEST                                                                 05/11/2003 22:20:35 PAGE 4   

 180          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    609    ----
   CONSTANT SIZE    =      9    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     29       5
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      3       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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