' "On Interrupt" komutunu kullanan LCD saat programı ' TMR0 ve prescaler kullanır. ' Butonlar saat ve dakikayı ayarlamak için kullanılabilir. Define LCD_DREG PORTD Define LCD_DBIT 4 Define LCD_RSREG PORTE Define LCD_RSBIT 0 Define LCD_EREG PORTE Define LCD_EBIT 1 Saat var byte dSaat var byte ' Display de görünecek saat değişkeni Dakika var byte Saniye var byte tick var byte ' Saniye parçacıkları Guncelle var byte ' LCD güncellenme durumu i var byte ' Döngü değişkeni ADCON1 = 7 ' PORTA ve E dijital Low PORTE.2 ' LCD'yi yazma moduna geçir Pause 100 ' LCD 'nin açılması için bekle Saat = 0 ' Başlangıç zamanı olarak 00:00:00'ı ayarla Dakika = 0 Saniye = 0 tick = 0 Guncelle = 1 ' Güncelleme aktif ' TMR0 'ı her 16,384 milisaniyede kesecek şekilde kur. OPTION_REG = $55 ' TMR0 konfigurasyonunu ayarla ve PORTB pullup'larını etkinleştir. INTCON = $a0 ' TMR0 interrupt'ını etkinleştir. On Interrupt Goto tickint ' Interrupt oluşursa TickInt altprogramına git ' Ana Program Döngüsü ANADONGU: PORTB = 0 ' PORTB pinlerini düğmeleri okumak için LOW konumuna al TRISB = $f0 ' PORTB 'nin düğmelere bağlı pinlerini giriş diğerlerini çıkışa ayarla ' Zamanı ayarlamak için bir düğmeye basılmışmı? If PORTB.7 = 0 Then Dakikayi_Azalt If PORTB.6 = 0 Then Dakikayi_Artir ' Son 2 düğme dakika ayarı için If PORTB.5 = 0 Then Saati_Azalt If PORTB.4 = 0 Then Saati_Artir ' İlk 2 düğme saat ayarı için ' Ekran güncellenecek mi? Kontrol: If Guncelle = 1 Then Lcdout $fe, 1 ' Ekranı sil ' Zamanı tt:dd:ss formatında göster t-saat,d-sakika,s-saniye dSaat = Saat ' Saati 0-12 aralığına getir If (Saat // 12) = 0 Then dSaat = dSaat + 12 Endif ' AM mi PM mi kontrol et If Saat < 12 Then Lcdout dec2 dSaat, ":", dec2 Dakika, ":", dec2 Saniye, " AM" Else Lcdout dec2 (dSaat - 12), ":", dec2 Dakika, ":", dec2 Saniye, " PM" Endif Guncelle = 0 ' Ekran güncellendi Endif Goto ANADONGU ' Sonsuz döngü sağla ' Dakikayı Artır Dakikayi_Artir: Dakika = Dakika + 1 If Dakika >= 60 Then Dakika = 0 Endif Goto debounce ' Saati Artır Saati_Artir: Saat = Saat + 1 If Saat >= 24 Then Saat = 0 Endif Goto debounce ' Dakikayı Azalt Dakikayi_Azalt: Dakika = Dakika - 1 If Dakika >= 60 Then Dakika = 59 Endif Goto debounce ' Saati Azalt Saati_Azalt: Saat = Saat - 1 If Saat >= 24 Then Saat = 23 Endif ' 250ms bekle debounce: For i = 1 to 25 Pause 10 ' 10ms bekle (Hiçbir interrupt'ın kaybolmaması için) Next i Guncelle = 1 ' Ekran güncellenmesi aktif Goto Kontrol ' Her Timer kesmesini işleyecek Interrupt rutini disable ' Interrupt lar devre dışı TickInt: Tick = Tick + 1 ' Saniye parçacıklarını say If Tick < 61 Then tiCik ' 61 * 16,384ms = 1sn ' Bir saniye geçti zamanı güncelle Tick = 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 ' Ekran güncellenmesi aktif tiCik: INTCON.2 = 0 ' Timer Interrupt bayrağını sıfırla Resume End