[Aporte] Temporizador con PIC16F877A para exposición de PCB´s con UV

#1
Hi All,
Below is Timer, you can use this timer for UV - PCB, below code write with MikroC.

I hope this help for everyone are looking for this project.

Hola a todos,
A continuación se muestra el temporizador, puede usar este temporizador para UV - PCB, debajo de escribir código con MikroC.

Espero que esta ayuda para todos esté buscando este proyecto.
Código:
 // Asengleem Indonesia - Bandung
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

sbit SET at RA0_bit;
sbit SPS at RA1_bit;
sbit CLR at RA2_bit;
sbit MS at RA3_bit;


// Variabel
int hitung;
short detik, menit;
char ff;
char psn [22];
bit mulai, pt, ptn, selesai, oldstate;

char * CopyConst2Ram (char * dest, const char * src) {
  char * d;
  d = dest;
  for (; * dest ++ = * src ++;) asm clrwdt;
  return d;
  }


void tunda () {
Delay_ms (2500);
}

void Tone1 () {
Sound_Play (659, 250);
}

void Tone2 () {
Sound_Play (698, 250);
}

void Tone3 () {
Sound_Play (784, 250);
}

void Melody () {
Tone1 (); Tone2 (); Tone3 (); Tone3 ();
Tone1 (); Tone2 (); Tone3 (); Tone3 ();
Tone1 (); Tone2 (); Tone3 ();
Tone1 (); Tone2 (); Tone3 (); Tone3 ();
Tone1 (); Tone2 (); Tone3 ();
Tone3 (); Tone3 (); Tone2 (); Tone2 (); Tone1 ();

}

void ToneA () {
Sound_Play (880, 50);
}

void ToneC () {
Sound_Play (1046, 50);
}

void ToneE () {
Sound_Play (1318, 650);
}

void Melody2 () {
unsigned short i;
for (i = 9; i> 0; i--) {
ToneA (); ToneC (); ToneE ();
}
}

// Definisikan Karakter Yang Akan Ditampilkan
const char rdf [] = "ASENGLEEM";
const char tmr [] = "Timer";
const char stt [] = "Version_1_FRW";
const char sttmr [] = "Exposure Time";
const char sset [] = "Set";
const char ss [] = "Remaining";
const char strm [] = "Exposure On";
const char bersihkan [] = "";
const char bersihkan1 [] = "";
const char sls [] = "Finish";
const char info [] = "----> Open Box RW";


void interrupt ()
{
TMR0 = 255; // Atur Timer 255
hitung ++; // Tambahkan Nilai
INTCON.TMR0IF = 0; // Bersihkan Interrupt Flag
INTCON.T0IF = 0;
}

void main ()
  {
  oldstate = 0;
  CMCON = 155;
  ADCON1 = 0xFF; // Bila Ini di aktifkan maka tidak counting
  OPTION_REG = 0b00001000;
  INTCON.PEIE = 0;
  INTCON.TMR0IE = 0;
  TMR0 = 255;
       
// Lcd_Out (1,1, CopyConst2Ram (psn, rdf));
     Sound_Init (& PORTD, 5);
  // Sound_Play (880, 1000);

  TRISA = 0b11111111;
  TRISB = 0b00000000; // Definisi Semua PORTB Untuk Output, Ke LCD 2 * 16
  TRISD = 0b11000000; // Definisi PORTD 4-5 Untuk Output Dan Lain Nya Off, Ke Led 2 * Untuk Indikator, Ke External Lampu Atau Perangkat Yg Akan Di Kontrol
  TRISE = 0b00000000; // Definis Semua PORTE Untuk Output
  PORTE = 0b00000100; // PORTE RE2 Untuk Menyalakan Indikator Power Led
  PORTD = 0; // Bersihkan PORTD to 0 Standby

  detik = 0; // Definisi variabel detik
  menit = 0; // Definisi variabel menit

  mulai = 0; // Mulai Dari NOL
  pt = 0;
  ptn = 0;
  selesai = 0;

  awal:

  Lcd_Init ();
  Lcd_Cmd (_LCD_CLEAR);
  Lcd_Cmd (_LCD_CURSOR_OFF);
  Lcd_Out (1,1, CopyConst2Ram (psn, rdf));
  Lcd_Out (2,6, CopyConst2Ram (psn, tmr));

spanking();

  Lcd_Cmd (_LCD_CLEAR);
  Lcd_Cmd (_LCD_CURSOR_OFF);
  Lcd_Out (1,2, CopyConst2Ram (psn, stt));

  delay_ms (200);

  Lcd_Cmd (_LCD_CLEAR);
  Lcd_Cmd (_LCD_CURSOR_OFF);
// PORTE = 0b00000100; // Power Led RE3

Lcd_Out (1,1, CopyConst2Ram (psn, sttmr));
Lcd_Out (2,1, CopyConst2Ram (psn, sset));

  while (1)

    {
    Lcd_Chr (2, 12, menit / 10 + '0'); // Tempatkan "MENIT" Pada Baris 2 Dan Kolom # .12
    Lcd_Chr_CP (menit% 10 + '0');
    Lcd_Chr_CP (':');
    Lcd_Chr_CP (detik / 10 + '0');
    Lcd_Chr_CP (detik% 10 + '0');


  {
          if (hitung> = 2294.999)
         {
         hitung = 0; // Reset Variabel Ke NOL
         if (mulai+1)
         {
         detik--;
         if (detik <0) // Jika Detik Lebih Kecil Dari NOL
         {
         detik = 59; // Detik
            menit--;
              if (menit <1)
              {



                Lcd_Out (1,1, CopyConst2Ram (psn, sls));
                Lcd_Out (2,1, CopyConst2Ram (psn, bersihkan));
                                                            // Lcd_Chr (2,15,0);


                PORTD.F2 = 1;
                PORTD.F5 = 1;
                PORTD.F0 = 0;
                PORTD.F1 = 0;
                 Delay_ms (200);
               
            Lcd_Out (2,1, CopyConst2Ram (psn, bersihkan));
            Lcd_Out (2,1, CopyConst2Ram (psn, info));

             
                   Melody (); // Play Melody
                // Melody2 ();
               // ToneE ();
               
                  menit = 0;
                  detik = 0;
                  mulai = 0;

                goto awal;
                 
            Delay_ms (511125000);
             
             }
           }
          }
         }


        if (! MS) // Jika Swith DIP, Dipilih Ke Menit Atau Detik, Maka Atur Posisi Digit Tersebut

        {

         if (SET) // Jika Switch DIP Terpilih Pada Detik, Maka Atur Untuk Menit

         {

          pt = 1;
         }
         if (! SET && pt)
         {

                pt = 0;
                detik ++; // Naikkan Nilai Plus 1 Setiap Penekanan Push Button Dalam Digit Detik
                if (detik == 60) detik = 0; // Jika Push Button Detik Hingga 60, Maka Detik Kembali Ke NOL, Nilai 60 Adalah Maksimal 1 Menit SAMA DENG 60 Detik
       
        PORTD = 0b00000000;
                Delay_ms (50);
         if (SET) oldstate = 1; // Setiap Kali Tekan LED Detik Berdkedip

         
        }

          PORTD.F4 = 1; // Led Untuk Detik
          PORTD.F3 = 0;

        }
         


        else // Bila DIP Switch Bukan Posisi Detik, Maka Digit Pada Menit
        {
          // PORTD.F3 = 1; // Led Untuk Menit
           //PORTD.F4 = 0;

           // if (SET)
         if (SET) // Jika Switch DIP Terpilih Pada Menit, Maka Atur Untuk Menit
             // Delay_ms (100);
         // if (! SET) // Kalau seperti ini menghitung sendiri


         {

          pt = 0;


        }
         if (SET && 1)


         {

         
          pt = 0;
          menit ++; // Naikkan Nilai Plus 1 Setiap Penekanan Push Button Dalam Digit Menit
          if (menit == 60) menit = 0; // Jika Push Button Menit Hingga 60, Maka Menit Kembali Ke NOL, Nilai 60 Adalah Maksimal 1Jam SAMA DENG 60 Menit
          PORTD = 0b00000000;
         
                  Delay_ms (50);
         if (SET) oldstate = 1;
         }
       
         PORTD.F3 = 1; // Led Untuk Menit
         PORTD.F4 = 0;
       
        }
        if (!SPS) // Tekan Maka Akan Memulai Menghitung Mundur Dari Waktu Yang Telah Diatur
           

                 
        {

           ptn = 1;
                            // Here is Start Timing
                          Delay_ms (62);
                          Lcd_Out (1,1, CopyConst2Ram (psn, strm));
                          Lcd_Out (2,1, CopyConst2Ram (psn, bersihkan1));
                          Lcd_Out (2,1, CopyConst2Ram (psn, ss));
                             

                             
                           PORTD.F0 = 1;
                           PORTD.F1 = 1;

                           Delay_ms (60);

                         
        }
      if (SPS && 1) // Bila Di Tekan Kembali, Maka Penghitungan Diberhentikan Sementara, Hingga Ada Penekanan Kembali
        {
       ptn = 0;
       
         mulai = ~ mulai; // Membalikkan Status


       }
     

       


      Delay_ms (52); // Bantu atur timer


    }

        }

       }
      //} [/ CODE]
 
Última edición por un moderador:

Fogonazo

Exorcista & Moderador eventual
#2
¡ Gracias por la contribución !

Dentro de tus posibilidades trata de escribir en español

¡ Thanks for the contribution !

Within your possibilities try to write in Spanish
 
Arriba