PIC16F877A ile Proteus uygulaması

Joep

Üye
Katılım
16 Tem 2026
Mesajlar
2
Puanları
1
Yaş
26
Dostlar selamlar, Proteusta PIC16F877A , 7448 entegresi ile 7 segment li 4 hane Displayde 0 dan 9999 a kadar sayma işlemi yaptırmak istiyorum, Güncel kurduğum devre şemasını ve mikroişlemcinin devre kartını ek kısmına ekledim. Sorun ise ekranda görüldüğü üzere a-b-c-d-e-f-g ledlerini istediğim şekilde kontrol edemiyorum, Kullandığım .asm kodunda bir problem olduğunu düşünmüyorum çünkü aynı kodla fiziksel olarak istediğim sonucu PIC16F877A üzerinden aldım. Yardımcı olabilirseniz çok sevinirim. Ne olur ne olmaz diye kodu da aşağıya bırakıyorum.

LIST P=16F877A
INCLUDE <P16F877A.INC>
__CONFIG _CP_OFF &_HS_OSC &_LVP_OFF &_WDT_OFF &_PWRTE_OFF

COUNT1 EQU 20H
COUNT2 EQU 21H
COUNT3 EQU 22H
TEMP EQU 23H
BIRLER EQU 24H
ONLAR EQU 25H
YUZLER EQU 26H
BINLER EQU 27H
TEMP1 EQU 28H
TEMP2 EQU 29H
TEMP3 EQU 2AH
TEMP4 EQU 2BH

;-------RESET VECTOR-------

ORG 0
GOTO START

;------- INTERRUPT VECTOR--------

ORG 4
GOTO START

;-----MACRO------

BANK0 MACRO
BCF STATUS,5 ;BANK0 AKTİF
BCF STATUS,6 ;
ENDM
BANK1 MACRO
BSF STATUS,5 ;BANK1 AKTİF
BCF STATUS,6 ;
ENDM
BANK2 MACRO
BCF STATUS,5 ;BANK2 AKTİF
BSF STATUS,6 ;
ENDM
BANK3 MACRO
BSF STATUS,5 ;BANK3 AKTİF
BSF STATUS,6 ;
ENDM

;-------ALT PROGRAM------

START
BANK1
CLRF TRISD
CLRF TRISB
BANK0
CLRF PORTD
CLRF PORTB
MOVLW .0
MOVWF BIRLER
MOVLW .0
MOVWF ONLAR
MOVLW .0
MOVWF YUZLER
MOVLW .0
MOVWF BINLER

LOOP MOVLW .10
MOVWF TEMP1
L1 MOVLW .10
MOVWF TEMP2
L2 MOVLW .10
MOVWF TEMP3
L3 MOVLW .10
MOVWF TEMP4
L4 CALL DISPLAY
INCF BIRLER,F
DECFSZ TEMP4,F
GOTO L4
CLRF BIRLER
INCF ONLAR,F
DECFSZ TEMP3,F
GOTO L3
CLRF ONLAR
INCF YUZLER
DECFSZ TEMP2,F
GOTO L2
CLRF YUZLER
INCF BINLER,F
DECFSZ BINLER,F
GOTO L1
CLRF BINLER
GOTO LOOP

;--------ALT PROGRAM-------

DISPLAY
MOVLW.166
MOVWF TEMP
DISPLAY1
MOVF BIRLER,W
MOVWF PORTD
MOVLW B'00001000'
MOVWF PORTB
CALL BEKLE
MOVF ONLAR,W
MOVWF PORTD
MOVLW B'00000100'
MOVWF PORTB
CALL BEKLE
MOVF YUZLER,W
MOVWF PORTD
MOVLW B'00000010'
MOVWF PORTB
CALL BEKLE
MOVF BINLER,W
MOVWF PORTD
MOVLW B'000000010'
MOVWF PORTB
CALL BEKLE
DECFSZ TEMP,F
RETURN

BEKLE
MOVLW .1
MOVWF COUNT1
LOOP1 MOVLW .50
MOVWF COUNT2
LOOP2 MOVLW .50
MOVWF COUNT3
LOOP3 DECFSZ COUNT3,F
GOTO LOOP3
DECFSZ COUNT2,F
GOTO LOOP2
DECFSZ COUNT1,F
GOTO LOOP1

RETURN

END
 

Ekli dosyalar

  • Ekran görüntüsü 2026-07-16 182423.webp
    Ekran görüntüsü 2026-07-16 182423.webp
    106.2 KB · Görüntüleme: 7
  • Ekran görüntüsü 2026-07-16 182456.webp
    Ekran görüntüsü 2026-07-16 182456.webp
    75.4 KB · Görüntüleme: 7
  • görsel_2026-07-16_182808768.webp
    görsel_2026-07-16_182808768.webp
    9.4 KB · Görüntüleme: 7
Simülasyondaki yedi parçalı göstergelerin ayarındaki hızı değiştirin. Muhtemelen değeri epeyce küçültürseniz tam sayıları görebilirsiniz. Ya da bekle fonksiyonundaki değerlerle oynayınız.

Ek:
Simülasyon dosyasını da paylaşın, denemek isteyenler olabilir.
 
Son düzenleme:
Hocam öncelikle cevabınız için teşekkür ederim. Dediğiniz gibi göstergenin tetiklenme hızını 0.05 ms civarına çektiğimde ufak farklılıklar oluyor fakat yine istediğim çıktıyı alamıyorum, ayrıca digit 4 yani birler basamağında hiç çıktı alamıyorum hiç bir ledi yanmıyor. Simülasyon dosyasını da ek kısmına bıraktım.
 

Ekli dosyalar

Asemblerden hiç anlamıyorum. Ancak display fonksiyonun son bölümünde hata var.
Ayrıca sayı artırma hızı ile tarama hızı farklı olmalı.

Kod:
CALL BEKLE
 MOVF BINLER,W
 MOVWF PORTD
MOVLW B'000000010' -->  MOVLW B'00000001' bu şekilde düzeltmelisiniz.
 MOVWF PORTB
 CALL BEKLE
 DECFSZ TEMP,F
 RETURN
 

Forum istatistikleri

Konular
133,384
Mesajlar
971,020
Kullanıcılar
459,237
Son üye
ilhnn

Yeni konular

Geri
Üst