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

📄 test.lst

📁 一个51单片机温度控制器,又一个示范如何在2051这样的小内存小ROM单片机上实现实时多任务小例子.使用时间片和状态机来完成任务的调度,而不是靠任务切换机制(这样小的资源是不足以支持RTOS的)
💻 LST
📖 第 1 页 / 共 2 页
字号:
 184          
 185          void out_time(unsigned int out_time){
 186   1              unsigned char h, m;
 187   1              m = out_time % 60;
 188   1              h = out_time / 60;
 189   1              disp_buff[0] = font[h/10];
 190   1              disp_buff[1] = font[h%10];
 191   1              disp_buff[2] = font[m/10];
 192   1              disp_buff[3] = font[m%10];
 193   1              disp_buff[4] = font[15];
 194   1              disp_buff[5] = font[15];
 195   1      }
 196          
 197          #define FUCTION_NORMAL 0
 198          #define FUCTION_TIME_ADJUST 1
 199          #define FUCTION_TIMER_ON_SET 2
 200          #define FUCTION_TIMER_OFF_SET 3
 201          #define FUCTION_MAX 4
 202          unsigned char function_select = FUCTION_NORMAL;
 203          
 204          unsigned int key_set = 0;               //各按键按下去的时间,按住该键不放时,每运行一次键扫该值加1.
 205          bit key_func = 0;
 206          #define PUSH_DELAY 100          //100ms
 207          #define FIRST_PUSH_DELAY 250            //250ms
 208          
 209          void key_scan(void){
 210   1              unsigned int diff;
 211   1              //按键为高电平触发.
 212   1              if(key_reg & KEY_SET){
 213   2                      disp_flash = 0;
 214   2                      if(key_set){//原来已经按下,连续增加.
 215   3                              if(key_set % PUSH_DELAY == 0 && key_set > FIRST_PUSH_DELAY){
 216   4                                      unsigned int _key_set = key_set - FIRST_PUSH_DELAY;
 217   4                                      diff = _key_set / PUSH_DELAY;
 218   4                              }else
 219   3                                      diff = 0;
 220   3                      }else
 221   2                              diff = 1;
 222   2                      if (function_select == FUCTION_TIME_ADJUST){
 223   3                              timer_isr_stop = 1;
 224   3                              time += diff;
 225   3                              time %= 1440;   //一天为1440分钟
 226   3                      }else if (function_select == FUCTION_TIMER_ON_SET){
 227   3                              timer_on += diff;
 228   3                              timer_on %= 720;        //一天为1440分钟
 229   3                      }else if (function_select == FUCTION_TIMER_OFF_SET){
 230   3                              timer_long += diff;
 231   3                              timer_long %= 121;
 232   3                              if(timer_long < 10)
 233   3                                      timer_long += 10;
 234   3                      }
 235   2                      if (key_set < 65500)
 236   2                              key_set++;
 237   2              }else
 238   1                      key_set = 0;
 239   1      
 240   1              if(key_reg & KEY_FUNC){
C51 COMPILER V7.02b   TEST                                                                 01/25/2004 00:49:19 PAGE 5   

 241   2                      disp_flash = 0;
 242   2                      if(!key_func){//原来未按下,改变设置模式,否则不作处理.
 243   3                              function_select++;
 244   3                              if (function_select == FUCTION_MAX){
 245   4                                      function_select = FUCTION_NORMAL;//FUCTION_NORMAL == 0
 246   4                                      if (timer_isr_stop){
 247   5                                              timer_isr_stop = 0;
 248   5                                              time_ms = 0;
 249   5                                      }
 250   4                              }
 251   3                              key_func = 1;
 252   3                      }
 253   2              }else
 254   1                      key_func = 0;
 255   1      }
 256          
 257          #define FLASH_CHECK(x) disp_flash % x < x / 2
 258          void sys_run(){
 259   1              bit disp_on = 1;
 260   1              while(1){
 261   2                      if (!sys_wake_up)
 262   2                              continue;
 263   2                      sys_wake_up = 0;
 264   2                      key_scan();
 265   2                      if(function_select == FUCTION_NORMAL){
 266   3                              unsigned int diff_time;
 267   3                              diff_time = time % 720;
 268   3                              if (diff_time >= timer_on && diff_time < timer_on + timer_long){//timer_long 为0时,定时器不再作输出.
 269   4                                      //out low
 270   4                                      OUT_PIN = 0;
 271   4                                      disp_flash++;
 272   4                                      if(FLASH_CHECK(500))
 273   4                                              disp_on = 1;
 274   4                                      else
 275   4                                              disp_on = 0;
 276   4                              } else {
 277   4                                      //out high
 278   4                                      OUT_PIN = 1;
 279   4                                      disp_on = 1;
 280   4                              }
 281   3                      } else {
 282   3                              disp_flash++;
 283   3                              if(FLASH_CHECK(1000))
 284   3                                      disp_on = 1;
 285   3                              else
 286   3                                      disp_on = 0;
 287   3                      }
 288   2                      
 289   2                      if (function_select == FUCTION_TIME_ADJUST){
 290   3                              dot_pos = 0;
 291   3                              out_time(time);
 292   3                      }else if (function_select == FUCTION_TIMER_ON_SET){
 293   3                              dot_pos = 1;
 294   3                              out_time(timer_on);
 295   3                      }else if (function_select == FUCTION_TIMER_OFF_SET){
 296   3                              dot_pos = 2;
 297   3                              out_time(timer_long);
 298   3                      }else{
 299   3                              dot_pos = DISP_WIDTH;
 300   3                              out_time(time);
 301   3                      }
 302   2                      if (disp_on)
C51 COMPILER V7.02b   TEST                                                                 01/25/2004 00:49:19 PAGE 6   

 303   2                              out_disp_buff();
 304   2                      else
 305   2                              out_cs_mask(1);
 306   2              }
 307   1      }
 308          
 309          
 310          
 311          void main(){
 312   1      #if 1
 313   1              timer_init();
 314   1              sys_run();
 315   1      #else
                      unsigned char i;
                      unsigned int j;
              
                      out_cs_mask(0);
                      for(i=0; ;){
                              if (i==16)
                                      i=0;
                              //DATA_PORT = ~(1 << i);
              //              out_cs_mask(1);
              //              spiout(1 << i);
              //              spiout(font[i]);
              //              out_disp_buff();
              //              out_cs_mask(0);
              //              for(j=0; j<500; j++);
              //              disp_buff[0] = font[i];
              //              disp_buff[1] = font[(i+1)&0xf];
              //              disp_buff[2] = font[(i+2)&0xf];
              //              disp_buff[3] = font[(i+3)&0xf];
              //              disp_buff[4] = font[(i+4)&0xf];
              //              disp_buff[5] = font[(i+5)&0xf];
              //              for(j=0; j<200; j++);
              //                      out_disp_buff();
              #if 0
                              unsigned char disp_data;
                              out_cs_mask(1);
                              //键盘扫描
                              key_reg = 0;
                              disp_data = 1<<key_cs;
                              spiout(disp_data);
                              if(KEY_LINE)
                                      key_reg |= disp_data;
                              else
                                      key_reg &= ~disp_data;
                              key_cs++;
                              key_cs &= 7;
                              spiout(key_reg);
                              out_cs_mask(0);
                              for(j=0; j<500; j++);
              #endif
                      }
              #endif
 357   1      }
 358          
 359          
 360          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    912    ----
C51 COMPILER V7.02b   TEST                                                                 01/25/2004 00:49:19 PAGE 7   

   CONSTANT SIZE    =     28    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     24       6
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      3       3
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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