'------------------------------------------------------------ 'Programın adı: Uyg_8_3.bas 'Programın işlevi: LCD üzerinde ss:dd:ss formatında saati gösteren program 'Tarih:23/07/2007 Uyarlama:1.00 Derleyici:PBP '------------------------------------------------------------ DEFINE LCD_DREG PORTB ' RB0-->DB4 PortB.0 DEFINE LCD_DBIT 0 ' RB1-->DB5 PortB.1 ' RB2-->DB6 PortB.2 ' RB3-->DB7 PortB.3 DEFINE LCD_RSREG PORTB DEFINE LCD_RSBIT 4 ' RS PortB.4 DEFINE LCD_EREG PORTB DEFINE LCD_EBIT 5 ' E PortB.5 DEFINE LCD_BITS 4 ' 4 bit ile iletişim DEFINE LCD_LINES 2 ' LCD satır sayısı '---------Değişken tanımlamaları----------------------------- saat var byte ' Saat değişkenini tanımlar dsaat var byte ' LCD'de görünecek saat değişkeni dakika var byte ' Dakika değişkenini tanımlar saniye var byte ' Saniye değişkenini tanımlar TMR0_Say var byte ' Timer0 kesmelerini sayma değişkeni Guncelle var byte ' LCD güncelleme değişkeni i var byte ' Ark söndürme döngüsü '------------------------------------------------------------ @ device WDT_OFF ' Watchdog timer kapalı. Pause 100 ' LCD'nin açılmasını bekle. saat = 0 ' Zamanı ilk çalışma durumuna ayarla. dakika = 0 saniye = 0 TMR0_Say = 0 Guncelle = 1 ' LCD güncelleme bayrağı aktif ' TMR0'ı her 16.384 mS de bir kesme üretecek şekilde kur. OPTION_REG = %01010101 ' TMR0'ı seç. Prescaler=1:64 'e kur. INTCON = %10100000 ' TMR0 kesmesi etkin ON INTERRUPT Goto TMR0_Kesme 'Kesme olduğunda TMR0_KESME alt programına git. TRISB = %00000000 ' Tüm PORTB pin'leri çıkış TRISA = %11111111 ' Tüm PORTA pin'leri giriş ADCON1 = %00000111 ' Tüm PORTA girişleri dijital '------------------ Ana program döngüsü- -------------------- '---Döngü içerisinde LCD'deki zaman devamlı güncellenir.----- Ana_dongu: ' Zaman ayarı butonlarına basıldı mı? If PORTA.0 = 1 Then Dak_azalt If PORTA.1 = 1 Then Dak_arttir Kontrol: ' LCD güncellemesi zamanı geldi mi? Kontrol et If Guncelle = 1 Then Lcdout $fe, 1 ' Ekranı sil ' Zamanı ss:dd:ss formatında göster dsaat = saat ' Saat 0'sa 12'ye getir. If (saat // 12) = 0 Then dsaat = dsaat + 12 Endif ' ÖĞLEDEN SONRA MI? SABAH MI? kontrol et. If saat < 12 Then Lcdout dec2 dsaat, ":", dec2 dakika, ":", dec2 saniye LCDOUT $FE, $C0, "SABAH" Else Lcdout dec2 (dsaat - 12), ":", dec2 dakika, ":", dec2 saniye LCDOUT $FE, $C0, "OGLE" Endif guncelle = 0 ' Ekran güncellendi Endif Goto Ana_dongu ' Ana programla sonsuz döngü sağla '------------ Dakika arttırma bölümü------------------------- Dak_arttir: dakika = dakika + 1 If dakika >= 60 Then dakika = 0 saat = saat + 1 If saat >= 24 Then saat = 0 Endif Endif Goto ark_sondur '------------ Dakika azaltma bölümü-------------------------- Dak_azalt: dakika = dakika - 1 If dakika >= 60 Then dakika = 59 saat = saat - 1 If saat >= 24 Then saat = 23 Endif Endif '--------Ark söndürme ve 250 mS gecikme bölümü--------------- ark_sondur: For i = 1 to 25 Pause 10 ' Her defasında 10 mS bekle, Next i ' böylece hiçbir kesme kaçırılmaz. guncelle = 1 ' Ekran güncellemesi aktif. Goto Kontrol '--------'Her TMR0 kesmesinde işleyen alt program------------ DISABLE ' Kesme alt programında kesmeler iptal. TMR0_Kesme: TMR0_Say = TMR0_Say + 1 ' TMR0 kesmelerini say If TMR0_Say < 61 Then Kesme_sonu ' 61x16.384 mS=1 Sn ' dolmadıysa alt programdan çık. ' Bir saniye geçti, zamanı güncelle TMR0_Say = 0 saniye = saniye + 1 If saniye >= 60 Then saniye = 0 dakika = dakika + 1 If dakika >= 60 Then dakika = 0 saat = saat + 1 If saat >= 24 Then saat = 0 Endif Endif Endif guncelle = 1 ' LCD güncellemesi aktif. '-----TMR0 Kesme alt programından çıkış bölümü -------- Kesme_sonu: INTCON.2 = 0 ' Timer0 kesme bayrağını sıfırla. Resume ' Alt programdan çık ENABLE ' Kesmeleri tekrar geçerli yap. End '------------------------------------------------------------