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

📄 timer.c

📁 Firmware that controlls the robotic griller
💻 C
字号:
#define buzzer_on 0x01
#define buzzer_off 0x02
#define disperse_coal 0x03
#define start_cooking 0x04
#define stop_cooking 0x05
#define on_fan 0x06
#define off_fan 0x07

char data[2];
unsigned short time_count,delay_count,repetition, buffer,error;
unsigned int lapsed_time;
char dummy, fan_reg;
unsigned short mask(unsigned short num)
       {
       switch (num)
           {
           case 0 : return 0x7e;
           case 1 : return 0x18;
           case 2 : return 0xb6;
           case 3 : return 0xbc;
           case 4 : return 0xd8;
           case 5 : return 0xec;
           case 6 : return 0xee;
           case 7 : return 0x38;
           case 8 : return 0xfe;
           case 9 : return 0xf8;
           }
       }

 void convert_data(unsigned int buffer)
      {
      data[1] = 0;
      data[0] = 0;
      while (buffer > 0)
            {
            buffer--;
            data[0]++;
            if (data[0] > 9)
               {
               data[0] = 0;
               data[1]++;
               }
            }
      }

void interrupt()
       {
       TMR0 = 0;
       if (INTCON.T0IF)
          {
          lapsed_time++;
          if (lapsed_time == 425)
             {
             lapsed_time = 0;
             time_count--;
             dummy++;
             if (time_count >= 100)
                {
                time_count = 0;
                INTCON.GIE = 0;
                INTCON.T0IE = 0;
                }
             }
          }
       INTCON.T0IF = 0;
       }

void scan()
     {
     convert_data(time_count);
     PORTB = mask (data[1]);
     if (data[1] > 0)
         {
         PORTA.F2 = 1;
         Delay_ms (5);
         PORTA.F2 = 0;
         }
     
     PORTB = mask (data[0]);
     PORTA.F1 = 1;
     Delay_ms (5);
     PORTA.F1 = 0;
     }

void Delay_1_sec()
     {
     delay_count = 50;
     while (delay_count > 0)
           {
           scan();
           delay_count--;
           }
     }
     
void Delay_500_msec()
     {
     delay_count = 12;
     while (delay_count > 0)
           {
           scan();
           delay_count--;
           }
     }

void beep()
     {
     Man_Send (buzzer_on);
     Man_Send (buzzer_off);
     }

void acknowledge()
     {
     TRISA.F0 = 1;
     Delay_1_sec();
     Delay_1_sec();
     while (!PORTA.F0)
           {
           Delay_1_sec();
           }
     TRISA.F0 = 0;
     }

void main ()
     {
     TRISA = 0x18;
     TRISB = 0x01;
     PORTA = 0;
     PORTB = 0;
     Delay_ms(1000);
     acknowledge();
     time_count = 0;
     OPTION_REG = 0x03;
     data[0] = 0;
     data[1] = 0;
     Man_Send_Config (&PORTA,0);
     Delay_1_sec();
     Delay_1_sec();
     Delay_1_sec();
     Delay_1_sec();
     Delay_1_sec();
     Delay_1_sec();
     Delay_1_sec();
     Delay_1_sec();
     beep();
     beep();
     beep();
     beep();
     while (1)
           {
           scan();
           if ((PORTA & 0x18) == 0x18) // disperse button has been trigged
              {
              beep();
              Delay_1_sec();
              Man_Send (disperse_coal);
              acknowledge();
              }
           if (((PORTA & 0x18) == 0x08) && time_count < 95) // increment button
              {
              time_count = time_count + 5;
              beep();
              Delay_1_sec();
              }
           if (((PORTA & 0x18) == 0x10) && time_count > 0) // start stop button
              {
              beep();
              Delay_1_sec ();
              dummy = 0;
              Man_send (start_cooking);
              acknowledge();
              INTCON.GIE = 1;
              INTCON.T0IE = 1;
              TMR0 = 0;
              while (((PORTA & 0x18) != 0x10) && time_count > 0 )
                    {
                    scan();
                    if (dummy == 3 && fan_reg == 0)
                       {
                       Man_Send(on_fan);
                       fan_reg = 1;
                       dummy = 0;
                       }
                    if (dummy == 3 && fan_reg == 1)
                       {
                       Man_Send(off_fan);
                       fan_reg = 0;
                       dummy = 0;
                       }
                    if ((PORTA & 0x18) == 0x18) // disperse button has been trigged
                       {
                       beep();
                       Man_Send (disperse_coal);
                       }
                    }
              INTCON.GIE = 0;
              INTCON.T0IE = 0;
              Man_send (stop_cooking);
              Man_send (stop_cooking);
              Man_send (stop_cooking);
              Man_send (stop_cooking);
              Man_send (stop_cooking);
              Man_send (stop_cooking);
              Man_send (stop_cooking);
              Man_send (stop_cooking);
              acknowledge();
              repetition = 40;
              while (repetition > 0)
                    {
                    Delay_500_msec();
                    Man_Send (buzzer_on);
                    Delay_ms (250);
                    Man_Send (buzzer_off);
                    repetition--;
                    }
              Man_Send (buzzer_off);
              time_count = 0;
              }
           if (PORTB.F0 && time_count > 0) // decrement button
              {
              time_count = time_count - 5;
              beep();
              Delay_1_sec();
              }
           }
     }
     

     

⌨️ 快捷键说明

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