// 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]