Asm karakteri nasıl sayıya çeviririz

Başlatan furkan055, 07 Kasım 2016, 16:13:21

furkan055

Öncelikle merhaba  2 3 haftadır asm ile uğraşıyorum ama gelişimim aşırı yavaş basit bir sıcaklık ve saat uygulamasını lcdye yazmam söylendi ama sıcaklıgı analog alır dijitale çevirip lcdye atarken harf olarak atıyorum yardımlarınıza ihtiyacım var şekildeki gibidir sistem ve kodları



LIST P=16F877A;kullanılcak pic adresimizi tanımladık
INCLUDE "P16F877A.INC";adresleri otomatik tanımlamak için pic kütüphanemizi girdik
RS EQU RB0;lcd mizin rs bacagını rb0 pinine attık
RW EQU RB1;lcdmizin rw pinini picin rb1 pinine tanımladık 
E  EQU RB2;lcd mizin enable izin ucunu picimizin rb2 bacagına attık
SAYAC EQU h'20';sayaç için genel amaçlı registarlardan hexa desimel 20. adresine tanımladık


ORG 0X00;programın hangi adresinden başlıyaccgını ayarladık 
MOVLW B'00100000';timer sayıcısını aktif yaptık 
MOVWF INTCON;timer ile kesme oluşturuyoruz , istediğimiz kadar saydıktan sonra kesme oluşturuyoruz
CLRF PORTA;CLRF PORTA ;port a yı temizledik 
CLRF PORTD;CLRF PORTB ; port d yi temizledik
MOVLW B'01000001';yukardaki değeri adcon 0 a yerleştiriliyo
MOVWF ADCON0;analog dijital yetkilendirme pini açık ad çevirici clock frekansı 1/8 , ad çevirme olarak kanal 0 aktif
BSF STATUS,RP0;bank 1 e geçtik 
MOVLW B'10000111';7.pin 1 olması pull up görevi görüyo değişişmi algılıyo hesabı
MOVWF OPTION_REG;111 oldugundan 255 e kadar saycak kesme 255 de oluşcak anlamında
MOVLW B'00000000';adcon 1 yazıcısına yüklüyoruz bu değeri
MOVWF ADCON1;sayının yüksek bitleri  adreshye aktarılıyo son 2  bit adresl ye aktarılıyo an0dan an7 ye kadar analog yapıldı
MOVLW B'00000001';tris a nın ilk pini giriş ddiğerleri çıkış olarak ayarlandı
MOVWF TRISA
CLRF TRISD;bankd 1 deki d pinini çıkış yaptık
CLRF TRISB;b pinini çıkış yaptık
BCF STATUS,RP0;bank0 a geçtik portlarda işlem yaptıgımız için
CLRF PORTD;d portunu temizledik 0 gönderdik
CLRF PORTB;b portunu temizledik 0 gönderdik 




BASLA           ; Sonsuz döngü başlığı
MOVLW 0x38      ;  LCD 2*16 satır ve 5X7 çözünürlüğünde ayarlama komutu.
CALL LCDAYAR;  bu komutu gönderiyoruz.
CALL GECIKME      ;  lcd komutu işlemesi için zaman tanıyoruz.
MOVLW 0x0E      ;  LCD ekranını ve cursoru açma komutu
CALL LCDAYAR;  LCD ye komutu gönderiyoruz
CALL GECIKME      ;  LCD ye komutu işlemesi için zaman tanıyoruz.
MOVLW 0x01      ;  LCD ekranı temizleme komutu 
CALL LCDAYAR;  LCD ye komutu gönderiyoruz
CALL GECIKME      ;  LCD ye komutu işlemesi için zaman tanıyoruz.
MOVLW 0x80;imleci başlangıça aldırdık
CALL LCDAYAR;  LCD ye komutu gönderiyoruz
CALL GECIKME      ;  LCD ye komutu işlemesi için zaman tanıyoruz.  
MOVLW 's'
CALL LCDYAZMA
CALL GECIKME	
MOVLW 0x69
CALL LCDYAZMA
CALL GECIKME
MOVLW 'c'
CALL LCDYAZMA
CALL GECIKME  ; 		BUNDAN SONRASI ZATEN EKRANA YAZDIRMA HARFİ YAZDIRIYORUZ 
MOVLW 'a'
CALL LCDYAZMA
CALL GECIKME
MOVLW 'k'
CALL LCDYAZMA
CALL GECIKME
MOVLW 'l'
CALL LCDYAZMA
CALL GECIKME
MOVLW  0x69 ;0x69 zaten hex yapıda önüne birde hex koyamazsın
CALL LCDYAZMA
CALL GECIKME
MOVLW 'k'
CALL LCDYAZMA
CALL GECIKME


BASLA2
BTFSS INTCON,T0IF;kesme oluşunca t0ıf 1 oluyo eğer 1 se bu işlem analog goto atlanır 
GOTO BASLA2;sayıcının sayımı bitmediyse bitmesini bekle 
BCF INTCON,T0IF;tekrardan kesme yapabilmek için 0 ladık t0ıf i 
BSF ADCON0,GO;analog dijital dönüşme başlat
DON
BTFSS PIR1,ADIF ;analog dijital ddönüşüm yapıldıysa burası 1 dir 
GOTO DON;analog dijital dönüşüm ypaılmadıysa yapılmasını beklenir 
MOVF ADRESH,W;adresh registarına aktarılan deger w registrıyla alınır
CALL LCDYAZMA
CALL GECIKME;daha sonra port b ye dijital değer atanır 


Goto BASLA;  Programı en başa dönderiyoruz.




LCDAYAR;lcd ayar yaparken rw=0 olması lazım lcd ye yolluyoruz çünkü rs=0 olmalı komut registerina çalıştıgımız için e=1 yapılmalıkı üst dalgada veri iletilsin
MOVWF PORTD;üstteki ayarları yaptıktan sonra d pininden yollucaklarımız zaten lcd ayarını yaptırır
BCF PORTB,RS;lcd ayarı yapılırken rs pini 0 verilir komut registiri çalşsın diye
BCF PORTB,RW;forwrite yani lcdye biz gönderiyoruz okuma yapsaydık 
BSF PORTB,E;amaç izin ucunu high low yapılarak veri gönderimi salansın
CALL GECIKME;hıgh low hızı karışmasın diye gecikme koyduk
BCF PORTB,E;low yaptık veri iletimi bitsin diye 450 ns gecikme kymak şart
RETURN
LCDYAZMA;lcd yazı göndermek için bu fonksyonu çagırcaz  
MOVWF PORTD;Harfdir vs cart curt bunu w registerından alıp portdye yolladık
BSF PORTB,RS;RS biti yazı yazmak için veri registerını aktif ettik
BCF PORTB,RW;lcd nin rw biti for write için 0 olmalı 
BSF PORTB,E;Enable pinini aktif edelimki yazı gitsin 
CALL GECIKME;450 Nslik aşagıdaki fonksyonu çagırıyoruz karışmasın diye yazılanlar
BCF PORTB,E;PORT B NİN ENABLE ucunu tekrardan low yapıyoruz 
GECIKME
MOVLW h'FF';255 Sayısını w registerına yükledik 
MOVWF SAYAC;255 sayıısnı sayaça yükledik
TEKRAR;255x4 saykıllık gecikme 
NOP;AMAÇ 1 SAYKILLIK ZAMAN KAZANDIRMA F/4 1/F/4=1 Koda ne kadar zaman geçicegi
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ SAYAC,F;255 değerini 1 azaltıyo 0 gelincec goto komutunu atlar
GOTO TEKRAR;TEKRARDAN TEKRARA GEÇTİ SAYAÇ 0 ANINDA BU KOMUT ATLANIR
RETURN

END


magic_gun


asağıda ,,


;==================================  
;h_byte l_byte ;;; call_b2 bcd 

;R0  low nible 10000's
;R1  high nible  1000's  low nible 100's
;R2  high nible    10's  low nible   1's
;==================================


B2_BCD  
	bcf     status,c           ; CARRY bit reset
	movlw   .16
	movwf   count_16
	clrf    R0
	clrf    R1
	clrf    R2
loop16  rlf     l_byte, F
	rlf     h_byte, F
	rlf     R2, F
	rlf     R1, F
	rlf     R0, F
;
	decfsz  count_16, F
	goto    adjDEC
	RETLW   0
;
adjDEC  movlw   R2
	movwf   FSR
	call    adjBCD
;
	movlw   R1
	movwf   FSR
	call    adjBCD
;
	movlw   R0
	movwf   FSR
	call    adjBCD
;
	goto    loop16
;
adjBCD  movlw   3
	addwf   0,W
	movwf   temp
	btfsc   temp,3          ; result > 7 ?
	movwf   0
	movlw   30
	addwf   0,W
	movwf   temp
	btfsc   temp,7          ; result > 7 ?
	movwf   0               ; most sig. digit
	RETLW   0


adj_lcd

liv_adj_low
	

	movf line_in,w
	movwf l_byte
	call B2_BCD
	movf R1,w
	andlw 0x0F
	addlw .48
	movwf line_iv100
	movf R2,w
	movwf temp
	swapf temp,1
	movlw 0x0F
	andwf R2,1
	andwf temp,1
	movf R2,w
	addlw .48
	movwf line_iv1 
	movf temp,w
	addlw .48
	movwf line_iv10

hayal etmeden basaramazsınız www.atariturkiye.com

furkan055

@magic_gun Hocam biraz daha açıklayıcı yazabilirmisiniz  zahmet olmazsa pek anlıyamadımda

RaMu

Başta bu iş kafa karıştırıcı gelebilir ama
aslında çok basit.
Zaten işin zor kısmını bitirmişsin, lcd çalışıyor.

Diyelimki elinde 0xFE sayısı var,
bu sayının onluk tabanda karşılığı 254
bunu lcd de göstermek istiyorsan lcd ye data olarak
0x32, 0x35, 0x34
(LCD de göstermek istediğin karakterin ASCII karşılığını gönderiyorsun,
deneme olarak lcd ye 'a' göndermek yerine, 0x41 veya .65 gönderebilirsin,
üçüde aynı şeyin farklı gösterimi)
göndermen lazım,
lcd ye 3 tane karakter gönderiyorsun, 3 farklı byte,
ama senin asıl değerin mcu da 0xFE olarak tek byte da duruyor,
şimdi bu 1 byte 0xFE değerini 3 tane mcu değişkeninde
0x02, 0x05, 0x04
haline getirmen lazım,
işte bunuda @magic_gun hocamın verdiği yöntemlerle yapabilirsin,
anlatım için "hex den BCD ye dönüştürme" konularına bakabilirsin.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html