
PIC 16F877 İLE LCD KRONOMETRE VE GERİ SAYIM DEVRESİ PICBASIC PRO Bu devrede PIC 16f877 mikrodenetleyicisi kullanılarak LCD (Liquid Crystal Display) üzerinde kronometre ve geri sayım uygulaması yapılmıştır. Sayma işlemi için mikrodenetleyicinin TMR0 kesmesi kullanılmıştır. Devre tasarımı ve baskı devre işlemleri için Proteus ISIS ve Proteus ARES programları kullanılmıştır. Devreye ait akış diyagramı aşağıdaki gibidir.
Şekil 1:Akış diyagramı

Ön panel Görünümü

1: Menüde yukarı hareket etme ve geri sayım sayacı değer artırma butonu,
2: Menüde aşağı hareket etme ve geri sayım sayacında değer azaltma butonu,
3: Seçili menüyü onaylama butonu,
4: Kronometre ve geri sayım sayacı için Başlat/Durdur/Devam etme butonu,
5: Kronometre ve geri sayım sayacı sıfırlama ve geri sayım sayacında saat, dakika, saniye değerlerinin seçilmesi,
Devre şeması ve baskı devre alt üst görünüm

Malzeme listesi ve fiyatlar

Devreye ait mikrodenetleyici kodları MicroCode Studio Plus – PICBASIC PRO derleyicisinde yazılmış ve derlenmiştir. Derleme işlemi için bilgisayarınızda PBP246 ve MPASM assembly derleyici dosyaları bulunmalıdır.
'***************************************************************** '* DOSYA : KRONOMETRE * '* YAZAR : HASAN ÜZÜLMEZ * '* NOT : KRONOMETRE VE GERİ SAYIM SAYACI * '* TARİH : 08.03.2009 PAZAR * '* Versiyon : 1.0 * '***************************************************************** @ device pic16f877 'işlemci 16F877 @ device pic16f877, wdt_off 'Watch Dog timer kapalı @ device pic16f877, pwrt_on 'Power on timer açık @ device pic16f877, protect_off 'Kod Koruma kapalı '---------------------------LCD TANIMLAMALARI[BAŞLA]---------------------------- Define LCD_DREG PORTB 'LCD data bacakları hangi porta bağlı? Define LCD_DBIT 4 'LCD data bacakları hangi bitten başlıyor? Define LCD_EREG PORTB 'LCD Enable Bacağı Hangi Porta bağlı? Define LCD_EBIT 3 'LCD Enable Bacağı Hangi bite bağlı ? Define LCD_RWREG PORTB 'LCD R/W Bacağı Hangi Porta bağlı? Define LCD_RWBIT 2 'LCD R/W Bacağı Hangi bite bağlı ? Define LCD_RSREG PORTB 'LCD RS Bacağı Hangi Porta bağlı ? Define LCD_RSBIT 1 'LCD RS bacağı Hangi Bite bağlı ? Define LCD_BITS 4 'LCD 4 bit mi yoksa 8 bit olarak bağlı? Define LCD_LINES 2 'LCD Kaç sıra yazabiliyor '---------------------------LCD TANIMLAMALARI[BİTİŞ]---------------------------- '-------------------------DEĞİŞKEN TANIMLAMALARI[BAŞLA]------------------------- TRISA=%00011111 TRISB=0 TRISC=0 TRISD=0 TRISE=0 ADCON1=7 SIRA var byte SECENEK var byte SALISE var byte SANIYE var byte DAKIKA var byte SAAT var byte SAYAC VAR BYTE TIP VAR BYTE SALISEYENI var byte SANIYEYENI var byte DAKIKAYENI var bytE SAATYENI var byte MENU VAR PORTA.0 YUKARI var PORTA.1 ASAGI var PORTA.2 MODE VAR PORTA.3 DURDUR VAR PORTA.4 '-------------------------DEĞİŞKEN TANIMLAMALARI[BİTİŞ]------------------------- '-------------------------LCD KARAKTER HAFIZASI[BAŞLA]-------------------------- LCDOUT $FE,$40, $00, $00, $00, $00, $00, $00, $00, $00 'CGRAM 0. ADRES " " LCDOUT $FE,$48, $00, $04, $06, $1F, $06, $04, $00, $00 'CGRAM 1. "OK" LCDOUT $FE,$50, $00, $00, $00, $00, $00, $00, $00, $00 'CGRAM 2. ADRES " " LCDOUT $FE,$58, $1B, $0E, $11, $15, $17, $11, $0E, $00 'CGRAM 3. ADRES "kronometre" LCDOUT $FE,$70, $04, $00, $0E, $04, $04, $04, $0E, $00 'CGRAM 6. "i" '-------------------------LCD KARAKTER HAFIZASI[BİTİŞ]-------------------------- SAAT=0 DAKIKA=0 SANIYE=0 SALISE=0 SAATyeni=0 DAKIKAyeni=0 SANIYEyeni=0 SALISEyeni=0 clear '----------------------------ANA MENU[BAŞLA]------------------------------------ BASLANGIC: Lcdout $fe, 1 if asagi=0 then if sira<1 then call gecikme sira=sira+1 else sira=0 endif endif if YUKARI =0 then if sira<1 then call gecikme sira=sira-1 else sira=0 endif endif IF SIRA>1 THEN SIRA=1 LCDOUT $FE,$80,SIRA+1," KRONOMETRE" LCDOUT $FE,$C0,SIRA," GER",6," SAYIM" CALL GECIKME SAAT=0 DAKIKA=0 SANIYE=0 SALISE=0 SAATyeni=0 DAKIKAyeni=0 SANIYEyeni=0 SALISEyeni=0 IF SIRA=0 AND MENU=0 THEN while menu=0 wend GOTO KRONOMETRE ENDIF IF MENU=0 THEN while menu=0 wend goto GERI_SAYIM endif goto BASLANGIC '----------------------------ANA MENU[BİTİŞ]------------------------------------ '---------------------------GERİ SAYIM[BAŞLA]----------------------------------- GERI_SAYIM: LCDOUT $FE,1 LCDOUT $FE,$83,"GER",6," SAYIM" LCDOUT $FE,$C1,3," ",DEC2 SAAT,":",DEC2 DAKIKA,":",DEC2 SANIYE,":",DEC2 SALISE call gecikme IF DURDUR=0 THEN while DURDUR=0 wend IF SECENEK<2 THEN SECENEK=SECENEK+1 ELSE SECENEK=0 CALL GECIKME ENDIF ENDIF IF SECENEK=0 THEN IF ASAGI=0 THEN IF SAAT=0 THEN SAAT=100 SAAT=SAAT-1 CALL GECIKME ENDIF IF YUKARI=0 THEN IF SAAT=99 THEN SAAT=-1 SAAT=SAAT+1 CALL GECIKME ENDIF ENDIF IF SECENEK=1 THEN IF ASAGI=0 THEN IF DAKIKA=0 THEN DAKIKA=60 DAKIKA=DAKIKA-1 CALL GECIKME ENDIF IF YUKARI=0 THEN IF DAKIKA=>59 THEN DAKIKA=-1 DAKIKA=DAKIKA+1 CALL GECIKME ENDIF ENDIF IF SECENEK=2 THEN IF ASAGI=0 THEN IF SANIYE=0 THEN SANIYE=60 SANIYE=SANIYE-1 CALL GECIKME ENDIF IF YUKARI=0 THEN IF SANIYE=>59 THEN SANIYE=-1 SANIYE=SANIYE+1 CALL GECIKME ENDIF ENDIF if mode=0 then while mode=0 wend TIP=1 if SALISE=0 AND SANIYE=0 AND DAKIKA=0 AND SAAT=0 THEN GOTO GERI_SAYIM ELSE IF saat=>0 AND dakika=>0 AND SANIYE>0 THEN SANIYE=SANIYE-1 ELSE IF DAKIKA=0 AND SANIYE=0 THEN IF SAAT>0 THEN SAAT=SAAT-1 : DAKIKA=59 :SANIYE=59 ENDIF IF SANIYE=0 THEN IF DAKIKA>0 THEN DAKIKA=DAKIKA-1 : sANIYE=59 ENDIF ENDIF salise=100 goto KESME_AYAR ENDIF else if menu=0 then while menu=0 wend goto BASLANGIC else GOTO GERI_SAYIM endif ENDIF '---------------------------GERİ SAYIM[BİTİŞ]----------------------------------- '------------------------KRONOMETRE MENÜSÜ[BAŞLA]------------------------------- KRONOMETRE: LCDOUT $FE,1 LCDOUT $FE,$83,"KRONOMETRE" LCDOUT $FE,$C1,3," ",DEC2 SAAT,":",DEC2 dakika,":",DEC2 saniye,":",DEC2 salise CALL GECIKME if mode=0 then while mode=0 wend TIP=0 goto KESME_AYAR else if menu=0 then while menu=0 wend goto BASLANGIC else GOTO KRONOMETRE endif endif '--------------------------KRONOMETRE MENÜSÜ[BİTİŞ]----------------------------- '-----------------------KESME KONFİGÜRASYONU[BAŞLA]----------------------------- KESME_AYAR: ON INTERRUPT GoTo KESME 'kesme oluşursa KESME adlı etikete git. OPTION_REG=%10000101 'Pull up dirençleri İPTAL- Bölme oranı 1/64. INTCON=%10100000 'Kesmeler aktif ve TMR0 kesmesi aktif TMR0=0 IF TIP=0 THEN GOTO ARTIR IF TIP=1 THEN GOTO AZALT '-----------------------KESME KONFİGÜRASYONU[BİTİŞ]----------------------------- '----------------------------GERI SAYIM[BAŞLA]---------------------------------- AZALT: LCDOUT $FE,$C3, DEC2 SAAT,":",DEC2 DAKIKA,":",DEC2 SANIYE,":",DEC2 SALISE if mode=0 then SALISEyeni=SALISE SANIYEyeni=SANIYE SAATyeni=SAAT DAKIKAyeni=DAKIKA while mode=0 wend goto G_DURAGAN_ZAMAN: else goto AZALT endif G_DURAGAN_ZAMAN: if durdur=0 then HIGH PORTB.0 SAAT=0 DAKIKA=0 SANIYE=0 SALISE=0 SAATyeni=0 DAKIKAyeni=0 SANIYEyeni=0 SALISEyeni=0 endif LCDOUT $FE,$C3, DEC2 SAATYENI,":",DEC2 DAKIKAYENI,":",DEC2 SANIYEYENI,":",DEC2 SALISEYENI if mode=0 then while mode=0 wend goto G_DEVAM else if menu=0 then CALL GECIKME goto BASLANGIC else GOTO G_DURAGAN_ZAMAN endif endif G_DEVAM: SAAT=SAATyeni DAKIKA=DAKIKAyeni SANIYE=SANIYEyeni SALISE=SALISEyeni goto AZALT '----------------------------GERI SAYIM[BİTİŞ]---------------------------------- '----------------------------KRONOMETRE[BAŞLA]---------------------------------- ARTIR: LCDOUT $FE,$C3,DEC2 saat,":",DEC2 dakika,":",DEC2 saniye,":",DEC2 salise if mode=0 then saliseyeni=salise saniyeyeni=saniye saatyeni=saat dakikayeni=dakika while mode=0 wend goto K_DURAGAN_ZAMAN: else goto ARTIR endif K_DURAGAN_ZAMAN: if durdur=0 then saatyeni=0 dakikayeni=0 saniyeyeni=0 saliseyeni=0 endif LCDOUT $FE,$C3,DEC2 SAATYENI,":",DEC2 dakikaYENI,":",DEC2 saniyeYENI,":",DEC2 saliseYENI if mode=0 then while mode=0 wend goto K_DEVAM else if menu=0 then CALL GECIKME goto BASLANGIC else GOTO K_DURAGAN_ZAMAN endif endif K_DEVAM: saat=saatyeni dakika=dakikayeni saniye=saniyeyeni salise=saliseyeni goto ARTIR '----------------------------KRONOMETRE[BİTİŞ]---------------------------------- '------------------------KESME FONKSIYONU[BAŞLA]-------------------------------- DISABLE KESME: IF TIP=0 THEN SAYAC=SAYAC+1 IF SAYAC=1 then SAYAC=0 salise=salise+1 IF salise=100 THEN salise=0 saniye=saniye+1 IF saniye=60 THEN saniye=0 dakika=dakika+1 IF dakika=60 THEN dakika=0 saat=saat+1 IF saat=99 THEN saat=0 ENDIF ENDIF ENDIF ENDIF ENDIF IF TIP=1 THEN SAYAC=SAYAC+1 IF SAYAC=1 then SAYAC=0 SALISE=SALISE-1 IF SALISE=0 THEN IF SANIYE<>0 THEN SANIYE=SANIYE-1 SALISE=100 ENDIF IF SANIYE=0 THEN IF DAKIKA<>0 THEN DAKIKA=DAKIKA-1 SANIYE=59 ENDIF IF DAKIKA=0 THEN IF SAAT<>0 THEN SAAT=SAAT-1 DAKIKA=59 ENDIF ENDIF ENDIF ENDIF ENDIF if SALISE=0 AND SANIYE=0 AND DAKIKA=0 AND SAAT=0 THEN GOTO GERI_SAYIM ENDIF INTCON.2=0 RESUME '------------------------KESME FONKSIYONU[BİTİŞ]-------------------------------- GECIKME: PAUSE 100 RETURN END
Projenin tamamlanmış hali ve test aşamalarına ait resimler







PIC16F877 ile lcd kronometre ve geri sayım devresine ait tüm dosyalar isis simülasyon ares pcb ve kaynak picbasic pro yazılım;