16f84a pclath öğrenmek istiyorum

Başlatan mustafaaxu, 20 Nisan 2009, 18:34:23

elektromer

Merhaba Arkadaşlar,

Konu PCLATH ile başlayıp, sonrasında proje çözümlemesine doğru gitmiş görünüyor...

Hazır PCLATH'ın dumanı tüterken, 22.Ekim.2204'te hazırladığım bir bilgi dökümanını sizinle paylaşayım.

PCLATH.pdf Rapidshare.com'da.....

Ayrıca,

PCLATH.pdf 4Shared.com'da.....

Dilerim işinize yarar...

Saygılarımla....
Her şey gönlünüzce olsun..

camby

Bu da Aynı devrenin 74595 ile yapılmış hali , B portu bu şekilde tamamen boşta:

;Buton ile 4'lü 7 Segment LED'li 0-9999 Sayıcı 07.08.2009
;2 Adet 74hc595 ile Port çoklama yapılmıştır
;1.BUTONA BASILDIĞINDA PROGRAM ÇALIŞMAYA BAŞLAR 
;7 Segment LED ortak KATOT(-) uçludur.
;Kristal tipi HS olduğundan 4-20MHz osilatör seçilebilir
		LIST 		P=16F84A    	
		include 	"P16F84A.inc"
		__CONFIG _WDT_OFF & _HS_OSC & _PWRTE_ON & _CP_OFF		
		ORG 		0x00			
		GOTO 		PRG

;=========Kaydediciler=========	
DONGU1	 	EQU 0C			
DONGU2 		EQU 0D
dtekrar		EQU 0E	
onlar       	EQU 10
yuzler     	EQU 11
binler     	EQU 12
birler		EQU 13
sayac0     	EQU 14   
sayac1     	EQU 15
sayici0		EQU 16
sayici1		EQU 17

;=========Display Tarama Gecikmesi=====

GECIKME		
		movlw 		.100
		movwf 		DONGU1
B000		
		movlw 		.10
		movwf 		DONGU2
B011		
		decfsz 		DONGU2,F
		GOTO 		B011
		decfsz 		DONGU1,F
		GOTO 		B000
		RETURN

;==========2byte binary 'den 4 basamak decimal'e dönüşüm===========

SAYI_CEVIR      		
		movf		sayici0,w	;sayici0 ve sayici1 , 10'luk sisteme çevirilmek üzere sayac0 ve sayac1'e yazılır.
		movwf		sayac0
		movf		sayici1,w
		movwf		sayac1	
		clrf            onlar           ;Onlar basamağı sayacı sıfırlanıyor
                clrf            yuzler          ;Yuzler basamağı sayacı sıfırlanıyor
                clrf            binler          ;Binler basamağı sayacı sıfırlanıyor

BINLER_HESAPLA
                movlw           b'11101000'     ;1000'in küçük byte'ı W'ye yüklendi
                subwf           sayac0,F        ;W, sayacın küçük byte'ından çıkarıldı
                btfsc           STATUS,C        ;Sonuç eksili mi?
                goto            $+5             ;Değilse büyük byte işlenecek
                movf            sayac1,F        ;Eksili ise sayac1 test için kendi üzerine yazılıyor
                btfsc           STATUS,Z        ;sayac1 0 mıymış? (büyük byte da mı kurtarmadı?)
                goto            BINLER_CIK_0    ;Demek ki döngü bitmis, (1000'in küçüğü) geri eklenecek
                decf            sayac1,F        ;sayac1 1 azaltılıyor
                movlw           b'00000011'     ;1000'in büyük byte'ı W'ye yüklendi
                subwf           sayac1,F        ;W, sayacın büyük byte'ından çıkarıldı
                btfss           STATUS,C        ;Sonuç eksili mi?
                goto            BINLER_CIK_1    ;Evet ise döngü bitmiş, sayaca 1000 eklenecek
                incf            binler,F        ;Binler sayacı 1 arttırılıyor
                goto            BINLER_HESAPLA  ;Döngüye devam ediliyor
BINLER_CIK_1
                movlw           b'11101000'     ;1000'in küçük byte'ı W'ye yüklendi
                addwf           sayac0,F        ;Sayacın küçük byte'ı eski haline getiriliyor
                btfsc           STATUS,C        ;Taşma var mı?
                incf            sayac1,F        ;Taşma varsa sayac1 1 arttırılacak
                movlw           b'00000011'     ;1000'in büyük byte'ı W'ye yüklendi
                addwf           sayac1,F        ;Sayacın büyük byte'ı eski haline getiriliyor
                goto            YUZLER_HESAPLA  ;Sonraki adıma geçiliyor
BINLER_CIK_0
                movlw           b'11101000'     ;1000'in küçük byte'ı W'ye yüklendi
                addwf           sayac0,F        ;Sayacın küçük byte'ı eski haline getiriliyor

YUZLER_HESAPLA
                movlw           d'100'          ;100 W'ye yüklendi
                subwf           sayac0,F        ;W, sayacın küçük byte'ından çıkarıldı
                btfsc           STATUS,C        ;Sonuç eksili mi?
                goto            $+5             ;Değilse yüzler sayacı artar
                movf            sayac1,F        ;Eksili ise sayac1 test için kendi üzerine yazılıyor
                btfsc           STATUS,Z        ;sayac1 0 mıymış? (büyük byte da mı kurtarmadı?)
                goto            YUZLER_CIK_0    ;Demek ki döngü bitmis, 100 geri eklenecek
                decf            sayac1,F        ;sayac1 1 azaltılıyor
                incf            yuzler,F        ;Yüzler sayacı 1 arttırılıyor
                goto            YUZLER_HESAPLA  ;Döngüye devam ediliyor
YUZLER_CIK_0
                movlw           d'100'          ;100 W'ye yüklendi
                addwf           sayac0,F        ;Sayacın küçük byte'ı eski haline getiriliyor

ONLAR_HESAPLA
                movlw           d'10'           ;10 W'ye yüklendi
                subwf           sayac0,F        ;W, sayacın küçük byte'ından çıkarıldı
                btfss           STATUS,C        ;Sonuç eksili mi?
                goto            ONLAR_CIK_0     ;Demek ki döngü bitmis, 10 geri eklenecek
                incf            onlar,F         ;Onlar sayacı 1 arttırılıyor
                goto            ONLAR_HESAPLA   ;Döngüye devam ediliyor
ONLAR_CIK_0
                movlw           d'10'           ;10 W'ye yüklendi
                addwf           sayac0,F        ;Sayacın küçük byte'ı eski haline getiriliyor

                movf            sayac0,0        ;Kalan değer W'ye alındı
                movwf           birler          ;Birler sayacı ayarlandı
                clrf            sayac0          ;Sonraki işlemler için sayac0 sıfırlanıyor 
		RETURN

;==========Gösterilecek Sayının binary karşılığı ORTAK KATOT=======

TABLO	
		addwf		PCL,1
		DT 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F
		return

;==========7 Segment TARAMA===============

DISPLEY_SEC_YAZ
		bcf   		PORTA, 0   ;( DISPLAY 0)
   		bsf   		PORTA, 1   
   		bsf   		PORTA, 2   
 		bsf   		PORTA, 3           

  	 	movf   		binler, W
   		CALL   		TABLO
   		movwf  		PORTB      ;binleri port b ye gönder
   		CALL   		GECIKME    ;displey gecikme süresi
   
   		bsf   		PORTA, 0   
   		bcf   		PORTA, 1   ;( DISPLAY 1)
   		bsf   		PORTA, 2   
   		bsf   		PORTA, 3           

   		movf   		yuzler, W
   		CALL   		TABLO
   		movwf   	PORTB      ;yüzleri port b ye gönder
   		CALL    	GECIKME    ;displey gecikme süresi
       
  		bsf   		PORTA, 0   
   		bsf   		PORTA, 1   
   		bcf   		PORTA, 2   ;( DİSPLAY 2)
   		bsf   		PORTA, 3

   		movf   		onlar, W
   		CALL   		TABLO
   		movwf   	PORTB      ;onları port b ye gönder
  		CALL    	GECIKME    ;displey gecikme süresi
       
 		bsf   		PORTA, 0   
   		bsf   		PORTA, 1   ;( DİSPLAY 3)
   		bsf   		PORTA, 2   
   		BCF   		PORTA, 3

   		movf   		birler, W
   		CALL   		TABLO
   		movwf   	PORTB      ;birleri port b ye gönder
   		CALL    	GECIKME    ;displey gecikme süresi
           
		DECFSZ   	dtekrar, F   	;sayac 0 olana kadar  ekranı göster
   		GOTO   		DISPLEY_SEC_YAZ   ;sayac 00 olana kadar GÖSTER
   		
		bsf   		PORTA, 0   
   		bsf   		PORTA, 1   ;DİSP TEMİZLE
   		bsf   		PORTA, 2   
   		bsf   		PORTA, 3  
		RETURN

;==========KONFİGÜRASYON===========

PRG		
		bsf 		STATUS,5	;Bank1'e geç	
		movlw 		b'00000000'
		movwf		TRISB		;B portunu çıkış olarak ata
		movlw  		b'11110000'	;RA4 giriş,diğerleri çıkş
		movwf 		TRISA		
		bcf 		STATUS,5	;Bank0'a geç
		movlw		b'00001111'	;Display'ler kapalı
		movwf		PORTA
		movlw		b'00000000'	
		movwf		PORTB 

;==========ANA PROGRAM=============

KONTROL		
		btfss		PORTA,4		;RA0 1 ise 1 satır atla ;Butona Basıldı mı?
		GOTO  		KONTROL

SIFIRLA		
		clrf		sayici0
		clrf		sayici1

SAYICI						;0-9999 arası sürekli olarak sayan program
   		incf 		sayici0, F     ;sayici0 ve sayici1 'den oluşan 2byte'lik sayıcı
    		btfsc 		STATUS,Z       ;sayici0 alcak değerlikli,sayici1 yüksek değerlikli
    		incf		sayici1,F      
    				
		movlw		3		;7 Segment tekrarlama sayısı
		movwf		dtekrar

		CALL		SAYI_CEVIR	;16bitlik binary sayıyı 10'luk bileşenine ayırır

		CALL		DISPLEY_SEC_YAZ	;4 basamaklı sayıyı 7segmentte gösterir

		movlw		b'00100111'	;sayici 9999 oldu mu?
		subwf		sayici1,w   
		btfss           STATUS,Z	;sonuc 0 mı,0'sa 1 satır atla
  		GOTO 		SAYICI  
		movlw		b'00001111'
		subwf		sayici0,w
		btfss		STATUS,Z	;sonuc 0'mı ,0'sa 1 satır atla
		GOTO		SAYICI
		GOTO		SIFIRLA       
		END