
Bu uygulama, PIC16F84A ile buton kontrolü öğrenmek isteyenler için sade ve öğretici bir örnektir. Devrede PORTA tarafına bağlı 4 adet buton giriş olarak kullanılır, PORTB tarafındaki 8 LED ise çıkış olarak sürülür. Programın temel mantığı, butonları sırayla kontrol etmek ve hangi butona basıldıysa ona karşılık gelen LED efektini çalıştırmaktır.
Basit görünmesine rağmen bu çalışma; port yönlendirme, buton okuma, bekleme alt programı, sayaç kullanımı ve temel efekt üretme konularını aynı devre içinde göstermesi açısından faydalıdır. PIC ile giriş-okuma ve çıkış sürme mantığını ilk kez çalışanlar için iyi bir başlangıç devresidir.
Devrenin çalışma mantığı
İçerik
Program ilk aşamada TRISA registerini giriş, TRISB registerini ise çıkış olacak şekilde ayarlar.
Ardından PORTB temizlenir ve butonlar sürekli döngü içinde test edilir. Herhangi bir butona basıldığında ilgili efekt alt akışı çalışır, efekt tamamlanınca program tekrar ana test bölümüne döner.
Şemaya bakıldığında RA0, RA1, RA2 ve RA3 pinlerine bağlı 4 butonun pull-up dirençlerle beslendiği, butona basıldığında girişin lojik 0 seviyesine çekildiği görülür.
Bu yüzden programda BTFSC PORTA,x testleri ile butonun basılı olup olmadığı kontrol edilmektedir. LED’ler ise RB0-RB7 üzerinden sürülür.

Butonlara göre çalışan efektler
- 1. buton: İlk 4 LED yanıp söner.
- 2. buton: Son 4 LED yanıp söner.
- 3. buton: Tüm LED’ler birlikte yanıp söner.
- 4. buton: İlk 4 ve son 4 LED sırayla dönüşümlü çalışır.
Bu yapı sayesinde aynı donanım üzerinde sadece yazılım değişikliğiyle farklı efektler üretmek mümkündür.
Efekt sayısı ve sırası geliştirilebilir, istenirse yürüyen ışık, sağ-sol kayan ışık veya farklı flaş örüntüleri de eklenebilir.
Flaş sayısı nasıl değiştirilir?
Programda efekt tekrar sayısı KNT değişkeni ile belirlenmiştir. İlgili bölümlerde yer alan:
MOVLW 0X03
MOVWF KNT
satırları, efektin kaç defa tekrar edeceğini belirler. Buradaki değer artırılarak flaş sayısı çoğaltılabilir.
Örneğin 0x03 yerine daha büyük bir değer yazıldığında efekt daha fazla tekrar eder.
8 bitlik sayaç kullanıldığı için teorik üst sınır 0xFF, yani 255 tekrardır.
PIC ile sayaç ve display kullanımını biraz daha ilerletmek isteyenler için 7 segment display nedir, anot katot yapı ve bağlantı mantığı içeriği de faydalı olabilir.
Akış diyagramı ne anlatıyor?
Akış diyagramı, yazılımın yapısını net biçimde gösterir.
Önce PIC tanıtılır, PORTA giriş ve PORTB çıkış yapılır, ardından PORTB temizlenir.
Sonraki aşamada butonlar sırayla test edilir.
Hangi buton basılıysa önce KNT sayacı yüklenir, sonra ilgili LED deseni PORTB’ye gönderilir ve ZAMAN alt programı çağrılır.
Sayaç sıfırlanana kadar bu işlem tekrar eder.
Alt tarafta yer alan ZAMAN akışı ise iki iç içe sayaç ile gecikme oluşturur. Böylece LED’ler çok hızlı değil, gözle görülebilecek hızda yanıp sönmüş olur.
Akış Diagramı

Yazılım tarafında dikkat çeken noktalar
Programda BTFSC, MOVLW, MOVWF, DECFSZ, CALL ve RETURN gibi temel assembly komutları birlikte kullanılmıştır.
Bu da örneği sadece LED yakma devresi olmaktan çıkarıp, giriş-çıkış ve kontrol akışı örneğine dönüştürür.
Bekleme için yazılan ZAMAN alt programı, iki kademeli döngü ile gecikme üretir.
Bu yöntem PIC assembly tarafında oldukça yaygındır ve zamanlayıcı kullanmadan temel bekleme oluşturmanın en bilinen yollarından biridir.
Benzer şekilde PIC assembly ve port kontrol mantığını güçlendirmek için mikroişlemciler ve mikrodenetleyiciler ders notları içeriği de iyi bir tamamlayıcı kaynak olur.
Küçük ama önemli bir not
Kodun UC_TEST bölümünde yer alan MOVWF KNTQ satırı, yazım hatası gibi görünüyor. Burada değişkenin KNT olarak kullanılması beklenir. Program derlenecekse bu satırın kontrol edilmesi gerekir. Bunun dışında yapı genel olarak buton test etme ve sayaçla efekt tekrarlatma mantığını doğru şekilde göstermektedir.
Bu devre neden öğretici?
- Giriş ve çıkış portlarının nasıl yönlendirildiğini gösterir.
- Buton okumada aktif düşük mantığın nasıl kullanıldığını öğretir.
- Sayaç değişkeni ile efekt tekrar sayısını kontrol etmeyi gösterir.
- Alt program mantığıyla gecikme oluşturmayı öğretir.
- Aynı donanım üzerinde farklı yazılım desenleriyle farklı sonuçlar alınabileceğini gösterir.
Geliştirme fikirleri
Bu temel yapı daha sonra çok kolay şekilde geliştirilebilir.
Her butona farklı LED animasyonları atanabilir, butonlara basılı tutma ve kısa basma ayrımı yapılabilir, potansiyometre ile hız kontrolü eklenebilir ya da timer interrupt kullanılarak daha kararlı efektler elde edilebilir.
İstenirse bu yapı, röle sürme veya motor kontrol gibi daha pratik çıkış uygulamalarına da dönüştürülebilir.
Daha deneysel PIC uygulamaları denemek isteyenler için çok amaçlı PIC deney test kartı da pratik bir çalışma zemini sağlayabilir.
PIC16F84 ile buton kontrollü LED efekt devresi, küçük bir örnek olmasına rağmen PIC assembly mantığını anlamak için oldukça yararlıdır.
Buton okuma, port kullanımı, gecikme alt programı ve sayaçla efekt tekrar ettirme gibi temel başlıkları tek devrede toplar.
PIC ile ilk pratiklerini yapmak isteyenler için sade, anlaşılır ve doğrudan uygulanabilir bir çalışmadır.
;PIC16F84 İLE ;BUTON KONTROLLÜ LED EFEKT DEVRESİ ;------------------------------------- ;WWW.320VOLT.COM ;------------------------------------- LIST P=16F84 ;PIC16F84' Tanıt INCLUDE "P16F84.INC" ;PIC'in INCLUDE DOSYALARI TANIT SAY1 EQU 0X0C SAY2 EQU 0X0D KNT EQU 0X0E BSF STATUS,5 ;BANK1'E GEÇ CLRF TRISB ;TRIB'Yİ TEMİZLE(PORTB ÇIKIŞ) MOVLW 0XFF ;W'YE h'FF' YÜKLE MOVWF TRISA ;W'Yİ TRISA'YA YÜKLE(PORTA GİRİŞ) BCF STATUS,5 ;BANK0'A GEÇ CLRF PORTB ;PORTB'Yİ TEMİZLE BIR_TEST BTFSC PORTA,0 ;PORTA'NIN 0. BİTİ '0' MI? GOTO IKI_TEST ;HAYIR. IKI_TEST ETİKETİNE GİT MOVLW 0X03 ;EVET. W'YE h'03' YÜKLE MOVWF KNT ;W'Yİ KNT'YE YÜKLE BIR MOVLW 0X0F ;W'YE h'0F' YÜKLE MOVWF PORTB ;W'Yİ PORTB'DEN ÇIK CALL ZAMAN ;ZAMAN ALT PROGRAMINI ÇAĞIR CLRF PORTB ;PORTB'Yİ TEMİZLE CALL ZAMAN ;ZAMAN ALT PROGRAMINI ÇAĞIR DECFSZ KNT,F ;KNT'DEN '1' ÇIKAR KNT'YE YÜKLE. KNT '0' Mİ? GOTO BIR ;HAYIR. BIR ETİKETİNE GİT GOTO BIR_TEST ;EVET. BIR_TEST ETİKETİNE GİT IKI_TEST BTFSC PORTA,1 ;PORTA'NIN 1. BİTİ 'O' MI? GOTO UC_TEST ;HAYIR. UC_TEST ETİKETİNE GİT MOVLW 0X03 ;EVET. W'YE h'03' YÜKLE MOVWF KNT ;W'Yİ KNT'YE YÜKLE IKI MOVLW 0XF0 ;W'YE h'F0' YÜKLE MOVWF PORTB ;W'Yİ PORTB'DEN ÇIK CALL ZAMAN ;ZAMAN ALT PROGRAMINI ÇAĞIR CLRF PORTB ;PORTB'Yİ TEMİZLE CALL ZAMAN ;ZAMAN ALT PROGRAMINI ÇAĞIR DECFSZ KNT,F ;KNT'DEN '1' ÇIKAR KNT'YE YÜKLE. KNT '0' Mİ? GOTO IKI ;HAYIR. IKI ETİKETİNE GİT GOTO BIR_TEST ;EVET. BIR_TEST ETİKETİNE GİT UC_TEST BTFSC PORTA,2 ;PORTA'NIN 2. BİTİ 'O' MI? GOTO DORT_TEST ;HAYIR. DORT_TEST ETİKETİNE GİT MOVLW 0X03 ;EVET. W'YE h'03' YÜKLE MOVWF KNTQ ;W'Yİ KNT'YE YÜKLE UC MOVLW 0XFF ;W'YE h'FF' YÜKLE MOVWF PORTB ;W'Yİ PORTB'DEN ÇIK CALL ZAMAN ;ZAMAN ALT PROGRAMINI ÇAĞIR CLRF PORTB ;PORTB'Yİ TEMİZLE CALL ZAMAN ;ZAMAN ALT PROGRAMINI ÇAĞIR DECFSZ KNT,F ;KNT'DEN '1' ÇIKAR KNT'YE YÜKLE. KNT '0' Mİ? GOTO UC ;HAYIR. UC ETİKETİNE GİT GOTO BIR_TEST ;EVET. BIR_TEST ETİKETİNE GİT DORT_TEST BTFSC PORTA,3 ;PORTA'NIN 3. BİTİ 'O' MI? GOTO BIR_TEST ;HAYIR. BIR_TEST ETİKETİNE GİT MOVLW 0X03 ;EVET. W'YE h'03' YÜKLE MOVWF KNT ;W'Yİ KNT'YE YÜKLE DORT MOVLW 0X0F ;W'YE h'0F' YÜKLE MOVWF PORTB ;W'Yİ PORTB'DEN ÇIK CALL ZAMAN ;ZAMAN ALT PROGRAMINI ÇAĞIR MOVLW 0XF0 ;W'YE h'F0' YÜKLE MOVWF PORTB ;W'Yİ PORTB'DEN ÇIK CALL ZAMAN ;ZAMAN ALT PROGRAMINI ÇAĞIR DECFSZ KNT,F ;KNT'DEN '1' ÇIKAR KNT'YE YÜKLE. KNT '0' Mİ? GOTO DORT ;HAYIR. UC ETİKETİNE GİT CLRF PORTB ;EVET. PORTB'Yİ TEMİZLE GOTO BIR_TEST ;BIR_TEST ETİKETİNE GİT ZAMAN MOVLW 0XFF ;W'YE h'FF' YÜKLE MOVWF SAY1 ;W'Yİ SAY1'E YÜKLE TEK1 MOVLW 0XFF ;W'YE h'FF' YÜKLE MOVWF SAY2 ;W'Yİ SAY2'E YÜKLE TEK2 DECFSZ SAY2,F ;SAY2'DEN '1' ÇIKAR SAY2'YE YÜKLE. SAY2 '0' Mİ? GOTO TEK2 ;HAYIR. TEK2 ETİKETİNE GİT DECFSZ SAY1,F ;EVET. SAY1'DEN '1' ÇIKAR SAY1'YE YÜKLE. SAY1 '0' Mİ? GOTO TEK1 ;HAYIR. TEK1 ETİKETİNE GİT RETURN ;EVET. ALT PROGRAMIN SONU END ;PROGRAMIN SONU
Uygulamanın kod ve simülasyon dosyaları;
iyi günler hocam burada bir iki sorum olacak acaba bu videoda kullandığınız kristal 4mhz mi? ayrıca pic 16f84a yı programlarken configuration ayarları ne olmalı