Ayaküstü asm öğrenmem lazım

Başlatan baran123, 27 Aralık 2014, 21:10:45

baran123

Son sene mikroişlemciler dersi görüyoruz tabi ben C ile çalışıyordum asm gelince haliyle patladık.Hocaya diyorum son senem zaten ben C seviyorum asm ye bulaştırmayın hiç, diyor "yok yok sen asm de öğren hepsini yaparsın" :D. Çok yabancı geliyor şimdi bana nerede yazacam bu kodları, fonksiyon nasıl olur vs hiç bir şey bilmiyorum.Konuyu bilmediğim içinde kaynak arayamıyorum nereden başlamam lazım ? Bir led blink ,delay, bide segment kodu görsem çözerim, var mı elinizde örnek proje ? İyi çalışmalar.

t2

#1
www.ayaküstü-asm.com


;blink_led.asm

list P = 16F877A
include P16F877A.inc


STATUS EQU 0x03
PORTB EQU 0x06
TRISB EQU 0x86
PORTD EQU 0x08
TRISD EQU 0x88

CBLOCK 0x20
		Kount120us ;Delay count (number of instr cycles for Delay)
		Kount100us
		Kount1ms
		Kount10ms
		Kount1s
		Kount10s
		Kount1m
ENDC


org 0x0000 ;line 1
		goto START ;line 2 ($0000)
org 0x05
START
......



www.pic-asm-kolay-ayaküstü-ders.com

t2

inandın değil mi? ve tıklayıp baktın  :)

baran123



MrDarK

Asm sanattır sanat :)

Lise hocamın kitabını öneririm. Nursel Ak 16f84 asm programla :) 10 liraydı sanırım.
Picproje Eğitim Gönüllüleri ~ MrDarK

Kabil ATICI

Aslında birkaç tane İsis örnekler klasöründe örnek olacak.

;**********************************************************************
;                                                                     *
;   This file is a basic code template for assembly code generation   *
;   on the PIC16F84A. This file contains the basic code               *
;   building blocks to build upon.                                    *
;                                                                     *
;   Refer to the MPASM User's Guide for additional information on     *
;   features of the assembler (Document DS33014).                     *
;                                                                     *
;   Refer to the respective PIC data sheet for additional             *
;   information on the instruction set.                               *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Filename:        xxx.asm                                         *
;    Date:                                                            *
;    File Version:                                                    *
;                                                                     *
;    Author:                                                          *
;    Company:                                                         *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Files required: P16F84A.INC                                      *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes:                                                           *
;                                                                     *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************


    list      p=16F84A             ; list directive to define processor
    #include <p16F84a.inc>         ; processor specific variable definitions

    __CONFIG    _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC

; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.

;***** VARIABLE DEFINITIONS
SAYAC1        EQU     0x0C        ; variable used for context saving 
SAYAC2      EQU     0x0D        ; variable used for context saving
SAYAC3      EQU     0x0E        ; variable used for context saving

;**********************************************************************
RESET_VECTOR      CODE    0x0000  ; processor reset vector
        goto    start             ; go to beginning of program


;MAIN_PROGRAM    CODE

start:
        CLRF	PORTA
        CLRF	PORTB		

        BSF 	STATUS,5
        MOVLW	b'00000000'	;MOVLW	0x00
        MOVWF	TRISA		;PORTA Tüm pinler çıkış oldu
        MOVLW	b'00000000'	;MOVLW	0x00
        MOVWF	TRISB		;PORTB Tüm pinler çıkış oldu
        BCF	STATUS,5
; remaining code goes here
DONGU
        MOVLW	b'00000010'		; MOVLW	b'00000010'
        MOVWF	PORTA		;1 nolu pine 5 Volt gönderdik
      CALL    GECIKME
        MOVLW	b'00001000'		; MOVLW	b'00001000'
        MOVWF	PORTB		;1 nolu pine 5 Volt gönderdik
        CALL  	GECIKME
        MOVLW	b'00010000'		; MOVLW	b'00010000'
        MOVWF	PORTB		;1 nolu pine 5 Volt gönderdik
       CALL  	GECIKME
        MOVLW	b'00000000'
        MOVWF	PORTA
        MOVLW	b'00000000'
        MOVWF	PORTB
        CALL 	GECIKME
        GOTO 	DONGU
        
GECIKME					;alt program başlangıcı
        MOVLW 	D'5'
        MOVWF 	SAYAC3
KALIP
        MOVLW 	D'255'
 		MOVWF 	SAYAC2
KALIP1
        MOVLW 	D'255'
        MOVWF	SAYAC1
KALIP2
        DECFSZ 	SAYAC1,F
        GOTO	KALIP2
        DECFSZ 	SAYAC2,F
        GOTO	KALIP1
        DECFSZ 	SAYAC3,F
        GOTO	KALIP
        RETURN
            END

        goto $

        END                       ; directive 'end of program'


galiba birisi sormuştu.
LED'ler RA1,RB3 ve RB4
açıklamaları fazla dikkate alma.

LIST P=16F877A
#INCLUDE <P16F877A.INC>
;ERRORLEVEL 0, -302 
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _XT_OSC & _LVP_ON & _CPD_OFF

;BANKSEL PORTD
 LCD_PORT Equ PORTD
 LCD_TRIS Equ TRISD
LCD_CON_PORT Equ PORTB
LCD_CON_TRIS Equ TRISB
 LCD_RS Equ 0x02 ;LCD handshake lines
LCD_RW Equ 0x01
 LCD_E Equ 0x00
 INT_VAR     UDATA_SHR      
w_temp      RES     1       ; variable used for context saving 
status_temp RES     1       ; variable used for context saving
pclath_temp RES	    1       ; variable used for context saving

; example of using Uninitialized Data Section
TEMP_VAR    UDATA           ; explicit address specified is not required
temp_count  RES     1       ; temporary variable (example)

; example of using Overlayed Uninitialized Data Section
; in this example both variables are assigned the same GPR location by linker
G_DATA      UDATA_OVR       ; explicit address can be specified
flag        RES 2           ; temporary variable (shared locations - G_DATA)

G_DATA      UDATA_OVR   
countTK       RES 2           ; temporary variable (shared locations - G_DATA)
 CBLOCK 0x20
 count ; Counter used when switch pressed has stopped
 count1 ; 160us Counter variable
 counta ; variables for delay timers
 countb ; variables for delay timers
 LCDTemp ; 4 bit for LCD
LCD_veri ;okuma tamponu
 ENDC ;
 
ORG 0x000 ; 
 GOTO Init ;
INT_VECTOR      CODE    0x0004 ; interrupt vector location
GOTO INT_GIT
ORG 0X005
 
; Initialize the PIC and the LCD
Init ;

 movlw 0x07 ; Turn comparators off and
 movwf CMCON ; enable pins for I/O functions
BANKSEL LCD_TRIS
 movlw b'00000000' ; 
 movwf LCD_TRIS ; 
 movlw b'00000000' ; 
 movwf LCD_CON_TRIS ; Change PortB I/O
movwf TRISC

BANKSEL LCD_PORT
CLRF LCD_PORT
;CLRF LCD_CON_PORT
bcf LCD_CON_PORT, LCD_RW ; 
 bsf LCD_CON_PORT, LCD_E ; 

 call LCDInit ; Initialize the LCD Display 
;*****************************
;ana program
;********************************
; Main program...

Message 
 call LCD_L1 ;move to 2nd row, first column
 clrf count 
BASLA
 movf count, w ; put counter value in W
 call Text ; get a character from the text table
 xorlw 0x00 ; is it a zero?
 btfsc STATUS, Z
 goto NextMessage ; display next message if finished
 ;BCF LCD_PORT,0
 call LCD_Char
 incf count, f
 goto BASLA
 
NextMessage 
 call LCD_L2 ;move to 2nd row, first column
 clrf count ;set counter register to zero
 
Message2 
 movf count, w ;put counter value in W
 call Text2 ;get a character from the text table
 xorlw 0x00 ;is it a zero?
 btfsc STATUS, Z
 goto EndMessage
 call LCD_Char
 incf count, f
 goto Message2

EndMessage 
 ;-----------------------------------
;call yaz2_satir

movlw 0xC3 ; ddram adresi
call LCDIns ;
call LCD_Char_oku	;ddram oku
movf LCD_veri,w		;portc'ye gönder
movwf PORTC
Stop
 goto Stop ;endless loop
 
yaz2_satir:
;LCD 1. satır DDRAM okuyup 2. satıra yazma
;1. satırın ddram adresini ata
movlw 0x83 ; move to 1nd row, first column
lcall LCDIns ;
lcall LCD_Char_oku	;ddram oku
movlw 0xc7 ; move to 1nd row, first column
lcall LCDIns ;
movf LCD_veri,w
call LCD_Char	;karakteri yaz

movlw 0x84 ; move to 1nd row, first column
call LCDIns ;
call LCD_Char_oku	;ddram oku
movlw 0xc8 ; move to 1nd row, first column
call LCDIns ;
movf LCD_veri,w
call LCD_Char	;karakteri yaz
return

; LCD BETİKLERİ VE ALT BETİKLARI
LCDInit ; 4 Bit BAŞLAMA BETİĞİ...

 call Del05 ; Wait 15 msecs
 call Del05 ;
 call Del05 ;
 movlw 0x038 ; Send the Reset Instruction
call LCDIns
 call Del05 ; Delay 5ms
 movlw 0x038 ; Send the Reset Instruction
call LCDIns
 call D160us ; Delay of 160us
 movlw 0x038 ; Send the Reset Instruction
call LCDIns
 call D160us ; Delay of 160us
 movlw 0x0C ; Set Interface Length
 call LCDIns ;
movlw 0x38 ; Turn Off Display
call LCDIns ; 
 movlw 0x01 ; Clear Display RAM
 call LCDIns ;
 call LCD_Clr ; Clear the LCD
 return ;
 
LCDIns ; Send the Instruction to the LCD
  movwf LCD_PORT ;
bcf LCD_CON_PORT, LCD_RW 
 bcf LCD_CON_PORT, LCD_RS ;
 call Pulse_e ;
;meşgul kontrol
	movlw 0xff		
	movwf LCD_TRIS	;lcd portunu giriş olarak oku
	movlw 0xff
	movwf LCD_PORT
	bcf LCD_CON_PORT, LCD_RS ;
	bsf LCD_CON_PORT, LCD_RW ;	;LCD veri okuma ataması yap
ctest
 	call Pulse_e ;
	nop
	nop
	nop
	nop
	nop
	nop
	;pd7 1 meşgul, 0 tamam
	btfsc LCD_PORT,7
	goto ctest
	bcf LCD_CON_PORT, LCD_RW ;
	movlw 0x00		
	movwf LCD_TRIS	;lcd portunu giriş olarak oku
	bcf LCD_CON_PORT, LCD_RW ;	;LCD veri okuma ataması yap
 nop ;
 return ;
 

LCD_Char_oku ; LCD ddram oku
	movlw 0xff		
	movwf LCD_TRIS	;lcd portunu giriş olarak oku
	movlw 0xff
	movwf LCD_PORT
	bsf LCD_CON_PORT, LCD_RS ;
	bsf LCD_CON_PORT, LCD_RW ;	;LCD veri okuma ataması yap
 	call Pulse_e ;
;	movf ;burada port LCD_veri ram adresinie atılacak.
	movf LCD_PORT,w
	movwf LCD_veri	;okunan ddram bilgisini tampona koy
	movlw 0x00		
	movwf LCD_TRIS	;lcd portunu giriş olarak oku
	bcf LCD_CON_PORT, LCD_RW ;	;LCD veri okuma ataması yap
	nop
	nop
	nop
	nop
 call Del05
 return ;

LCD_CharD
 addlw 0x30 ; add 0x30 to convert to ASCII
LCD_Char ; Send the Character to the LCD
 movwf LCD_PORT ;
 bsf LCD_CON_PORT, LCD_RS ;
 call Pulse_e ;
;meşgul kontrol
	movlw 0xff		
	movwf LCD_TRIS	;lcd portunu giriş olarak oku
	movlw 0xff
	movwf LCD_PORT
	bcf LCD_CON_PORT, LCD_RS ;
	bsf LCD_CON_PORT, LCD_RW ;	;LCD veri okuma ataması yap
mtest
 	call Pulse_e ;
	nop
	nop
	nop
	nop
	nop
	nop
	;1 meşgul, 0 tamam
	btfsc LCD_PORT,7
	goto mtest
	bcf LCD_CON_PORT, LCD_RW ;
	movlw 0x00		
	movwf LCD_TRIS	;lcd portunu giriş olarak oku
	bcf LCD_CON_PORT, LCD_RW ;	;LCD veri okuma ataması yap
 nop ;
 return ;
 
 LCD_L1: movlw 0x80 ; move to 1nd row, first column
 call LCDIns ;
 retlw 0x00 ;

LCD_L2: movlw 0xc0 ; move to 2nd row, first column
 call LCDIns ;
 retlw 0x00 ;
 
LCD_Clr movlw 0x01 ; Clear display
 call LCDIns ;
 retlw 0x00 ;
 
Pulse_e ;
 bcf LCD_CON_PORT, LCD_E ; LCD Enable pulse to write data from PORTB
 nop ; into LCD module.
 nop
nop
nop
 bsf LCD_CON_PORT, LCD_E ; 
 nop ;
 nop
nop
nop
 retlw 0x00 ;
 
 
; Delay routines...
D160us 
 clrf count1 ; 
 bsf count1, 5 ; Delay 160 usecs
 bsf count1, 4 ;
 decfsz count1, f ;
 goto $ - 1 ;
 return ;
 
Del255 movlw 0xff ; delay 255 mS
 goto d0 ;
Del200 movlw d'200' ; delay 200mS
 goto d0 ;
Del100 movlw d'100' ; delay 100mS
 goto d0 ;
Del50 movlw d'50' ; delay 50mS
 goto d0 ;
Del20 movlw d'20' ; delay 20mS
 goto d0 ;
Del05 movlw 0x05 ; delay 5.000 ms (4 MHz clock)
 goto d0 ;
Del01 movlw 0x01 ; delay 1.000 ms (4 MHz clock)
d0 movwf count1 ;
d1 movlw 0xC7 ; delay 1mS
 movwf counta ;
 movlw 0x01 ;
 movwf countb ;
Del_0 decfsz counta,f ;
 goto $+2 ;
 decfsz countb,f ;
 goto Del_0 ;
 decfsz count1,f ;
 goto d1 ;
 retlw 0x00 ;
 
HEX_Table 
 addwf PCL, f
 retlw 0x30
 retlw 0x31
 retlw 0x32
 retlw 0x33
 retlw 0x34
 retlw 0x35
 retlw 0x36
 retlw 0x37
 retlw 0x38
 retlw 0x39
 retlw 0x41
 retlw 0x42
 retlw 0x43
 retlw 0x44
 retlw 0x45
 retlw 0x46
 
Text ;LCD ekran 1. satırda yazılacak olan
 addwf PCL, f
 retlw ' '
 retlw ' '
 retlw ' '
 retlw 'E'
 retlw '9'
 retlw '3'
 retlw '4'
 retlw ' '
 retlw ' '
 retlw ' '
 retlw ' '
 retlw ' '
 retlw 0x00
 
Text2 ;lcd ekran 2. satırda yazılacak olan
 addwf PCL, f
 retlw ' '
 retlw ' '
 retlw ' '
 retlw '9'
 retlw '0'
 retlw ' '
 retlw ' '
 retlw ' '
 retlw ' '
 retlw ' '
 retlw ' '
 retlw ' '
 retlw ' '
 retlw 0x00

    movwf   w_temp          ; save off current W register contents
    movf    STATUS,w        ; move status register into W register
    movwf   status_temp     ; save off contents of STATUS register
    movf    PCLATH,w        ; move pclath register into w register
    movwf   pclath_temp     ; save off contents of PCLATH register

; isr code can go here or be located as a call subroutine elsewhere
INT_GIT
    movf    pclath_temp,w   ; retrieve copy of PCLATH register
    movwf   PCLATH          ; restore pre-isr PCLATH register contents
    movf    status_temp,w   ; retrieve copy of STATUS register
    movwf   STATUS          ; restore pre-isr STATUS register contents
    swapf   w_temp,f
    swapf   w_temp,w        ; restore pre-isr W register contents
    retfie                  ; return from interrupt
 end


Buda LCD için ama
led ekran için
HEX_Table 
 addwf PCL, f
 retlw 0x30  ;0 için
 retlw 0x31   ;1 için
 retlw 0x32   ;2 için
 retlw 0x33
 retlw 0x34
 retlw 0x35
 retlw 0x36
 retlw 0x37
 retlw 0x38
 retlw 0x39  ;9 için

buralara C'deki gibi LED ekranın şekillerini oluşturacak değerler yazılıyor... Tablodan tek değer için C'deki gibi alınıp LED ekrana gönderiliyor.
Sadece if yerin farklı bir yaklaşım kullanılıyor.
Her şeye W registerini koşturuyorsun.
ambar7

helloworld

#7
http://www.kontrolkalemi.com/forum/attachments/picasm_tuerk_e-pdf.9360/
bunu tavsiye ederim.

mesaj birleştirme:: 27 Aralık 2014, 23:04:23

bu arada aynı şeyi paylaşıyorz.ben de son sınıfım ve C yi seviyorm.fakat hoca asm daha zor.C ile yaparsam herkes geçer diyor.mantık bu dostum.


baran123

Yarar hocam çok teşekkürler herkese :)

RaMu

#10
Büyük ihtiml mplab ide yi kullanacaksınız dersde,
hocanın ders notlarına çalışabilirsin,
yapacağınız işler gayet basit olacaktır,
c de yaptıklarını asm de hemen yaparım diye bekleme,
led yakar söndürürsünüz, lcd voltmetre frekansmetre yaparsanız anca işte.


Üstte ccsc altta asm karşılığı, birkaç örnek;
(ccsc nin c asm list kısmınada bakabilirsin)
#FUSES NOPROTECT,NOWDT,XT,PUT,NOBROWNOUT,NODEBUG,NOLVP
=
__CONFIG _CP_OFF&_WDT_OFF&_XT_OSC &_PWRTE_ON&_BODEN_OFF&_DEBUG_OFF &_LVP_OFF



set_tris_b(0x00);
=
banksel  trisb
movlw   0x00
movwf   trisb
banksel portb


output_high(pin_b0);
=
BSF portb,0


output_low(pin_b0);
=
BCF portb,0
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html


baran123

@RaMu, hocam çözdüm az çok ama biraz incik cincik var gibi öğrenilirim bir kaç güne

"c de yaptıklarını asm de hemen yaparım diye bekleme," derken, daha mı zor olur ASM'de ?

sadogan

list  	 	p=16F84             
	include 	p16F84.inc           
  __CONFIG _CP_OFF & _WDT_OFF  & _PWRTE_ON & _RC_OSC
	errorlevel-302
;	                    bcaegfd	;displayler 4094 böyle bağlı
;			  '76543210'
;****************************************************************************************
; HW Bit Değişkenler
;****************************************************************************************
;--------------------------------------------------------------------------
#define	EN			PORTA,2	;4094 Lach Enable Pini
#define	SD			PORTA,0 ;4094 Data	Pini
#define	SCLK		        PORTA,1	;4094 clock	Pini
#define	ADCclk			PORTB,4	;Adc0831 clock	Pini
#define	ADCDataPin		PORTB,5	;Adc0831 Data	Pini
#define	ADCcs			PORTB,3	;Adc0831 izin 	Pini
;---------------------------------------------------------------------------
;******************************************************************************************
; Data Değişkenler
;******************************************************************************************

	CBLOCK	0x20
	count		;Genel amaclı sayac
	seridata	;4094 data 
	cx			;Genel amaclı sayac
	bx			;Genel amaclı sayac
	Yuzler		;Yüzler basamagı	
	Onlar		;Onlar basamagı
	Birler		;Birler basamagı
	ADCdata	;Adc0831 data
	Temp1		;Gecici hafiza
	Temp2		;Gecici hafiza
	Flag			; Bayrak
	Isi_h		;isi yüksek degeri 
	ENDC	
	org		0	;Reset vektor	
	goto	baslangic
	ORG	0x04	;interrupt servis rutini
	goto	Timer0
baslangic
	bsf		STATUS,5	;Bank1 e gec	
	movlw	0x07		;TMR0 1/256 ya ayarlandı
	movwf	OPTION_REG	
	movlw	B'00100000' ;portb RB5 giriş 
	movwf	TRISB		;	
	clrf		TRISA		;porta çıkış
	bcf		STATUS,5	;Bank0 a geç
	clrf		TMR0		;TMR0 sayma degerini 00 seç
	movlw	b'10100000'
	movwf	INTCON	;Global int ve TMR0 int aç TMR0 ı çalıştır
	clrf		PORTB		;PortB yi sıfırla
	clrf	cx
	clrf	bx	
	movlw	0x01	;Okunacak Eeprom adresini al
	call		EeRead  ;Belirtilen adresteki datayı al
	movwf	Isi_h       ; Isı yüksek degerini yaz
	
	main
	bcf		EN			;4094 deki datayı tut
 	call		ADCOKU  	;Adc yi oku
	movf	ADCdata,0	;ısı değerini W yaz
	subwf	Isi_h,0		;Isı degerini üst limile karsılaştır
	btfss	STATUS,C	;Isı limitten Büyükmü
	goto	Set_Flag1	;Evet büyük Flag1 i set et
	bcf		Flag,1		;Isı limitten küçük Flag1 sil
	goto	Clr_Flg1		;Derece sembolünü yanık
Set_Flag1
	bsf		Flag,1		;Derece sembolünün Blink yapması için setet
Clr_Flg1
	call		BinToBCD	;Adcdatada ki binary sayıyı BCD ye cevir 
	btfss	Flag,1		;Flag1 i Blink için test et
	goto	yanik		;Blink Yaptırma
	btfss	Flag,0		;Blink yapmak için Flag0 test et
	goto	sonuk		;Sembolü söndür
	goto	yanik		;Sembolü yak
sonuk
	bsf		Flag,2
	
	goto	yaz
yanik

	bcf		Flag,2
yaz
	movf	Onlar,0	;Onlar basamagınıal
	call	digit_table	;7 segmente cevir
	call	CD4094		;Onlar basamağını 4094  yaz
	
	movf	Birler,0	;Birler basamagını al
	call	digit_table	;7 segmente cevir
	call	CD4094		;Birler basamağını 4094  yaz
	
	btfss	Flag,2
	goto	y2    
 	goto	y1
y2
	movlw	B'11101100'	;Derece sembolü al
	goto	y3
y1
	movlw	0x00	;Sombol sönuk degerini al
	
y3
	call	CD4094		;Sembolü yaz
	bsf		EN		;4094 de yazılan sayıları display e aktar
	call	wait			;Ekrandaki hızlı değişimleri engelle
	goto	main
;****************************************************************************************
CD4094
	movwf	seridata  	;4094e yazılacak satayı al
	movlw	8			;Bit sayacı değerini al
	movwf	count		;sayaca yükle
next_bit	
	bsf	SD				;4094 seridata pini setet
	rlf	 	seridata,f	;datayı sola 1 kaydır
	btfss	STATUS,C	;Yazılacak bit 1 mi
	bcf	SD				;Yazılacak bit 0
	nop					;Yazılacak bit 0 Data clock geçikmesi için 1 makina cevrimi kadar bekle
	bsf	SCLK			;4094 clock pini set et
	nop					;1 makina cevrimi kadar bekle	
	nop					;1 makina cevrimi kadar bekle
	bcf	SCLK			;4094 clock pini clr et
	decfsz	count,f		;Bit yazma işlemi bitmişmi ?	
	goto	next_bit		;Yeni Bit için git
	return				;bit tazma işlemi bitmiş Alt programdan çık
;****************************************************************************************
;***********************************************************************
digit_table
 	addwf PCL,1 
        dt 0X7E,0X12,0XBC,0XB6,0XD2,0xE6,0XEE,0X32,0XFE,0XF6,0X00
;4094 seven segmet bağlantısı
;             gfabedcDp
;			B'01111110' 0=0x7E					
;   	    B'00010010' 1=0x12
;			B'10111100' 2=0xBC	
;			B'10110110' 3=0xB6
;			B'11010010' 4=0xD2
;			B'11100110' 5=0xE6
;			B'11101110' 6=0xEE	
;			B'00110010' 7=0x32
;			B'11111110' 8=0xFE
;			B'11110110' 9=0xF6  
;************************************************************************
;digit_table 	addwf	PCL,1  						;Tablo adresini al
   	           dt 7Bh,60h,5Dh,75h,66h,37h,3Fh,70h		;display karti icin cevrim tablosu
                 dt 7fh,77h,7Eh,2Fh,1Bh,6Dh,1Fh,1Eh,00h	;display karti icin cevrim tablosu
;************************************************************************************************************************
wait						;Bekleme rutini
	decfsz	cx,f
	goto	wait
	decfsz	bx,f
	goto	wait
	return
;***************************************************************************************************************************
BinToBCD					;ADCdatadaki binary sayıyı BCD koda cevirir
	clrf	Yuzler
	clrf	Onlar
	clrf	Birler
YuzB
	movlw	.100		 	;W=100		
	subwf	ADCdata,w		;ADCdata dan W çıkar	
	btfsc	STATUS,C		;ADCdata > W mü
	goto YuzlerBasamagi 	;ADCdata > W Yüzler basamağına git
OnB							;ADCdata < W
	movlw	.10				;W=.10	
	subwf	ADCdata,w		;ADCdata dan W çıkar
	btfsc	STATUS,C		;ADCdata > W mü
	goto	OnlarBasamagi	;ADCdata > W onlar basamağına git
	movf	ADCdata,w		;ADCdata < W	
	movwf	Birler			;ADCdatayı birler basamagına yaz
	return
YuzlerBasamagi
	incf		        Yuzler,f			;Yüzler basanağını1 artır
	movwf	ADCdata		;Kalanı ADCdataya yaz
	goto	YuzB			;Cevrime devam

OnlarBasamagi
	incf	Onlar,f				;Onlar basanağını1 artır
	movwf	ADCdata		;Kalanı ADCdataya yaz	
	goto	OnB				;Cevrime devam
;***********************************************************************************************************
  

ADCOKU  
	  
	 clrf   ADCdata    	 ;Yeni data için hazırla 
	 bcf     ADCcs   		;Adc0831 ölçüm için Enable et
	 movlw  0x09       	;Bit okuma için gerekli clock sayısını al
	 movwf  count      	;count=9 8+1 8 clock data 1 clock gereksiz bit için
	 bsf    ADCclk  		;ADCclk pini set et
	 nop             			;seri data 1 ci biti için 1 makina cevrimikadar bekle
	 bcf    ADCclk		;ADCclk pini clr et

 YeniBit               			 ;ADC bit okuma lupu 
	 bsf    ADCclk   		;ADCclk pini set et
	 nop               		;yenibit için 1 makina cevrimikadar bekle
	 bcf    ADCclk		;ADCclk pini clr et
	 btfsc  ADCDataPin  ;ADCDataPin 1 mi
	 goto    SetCarry		;ADCDataPin= 1 	
	 bcf     STATUS,C	;ADCDataPin =0 Carry clr et
	 goto    RotateBits
SetCarry
	 bsf     STATUS,C 	;Caryy=1
RotateBits
	 rlf     ADCdata    ;ADCDataPin den okunan biti  ADCdata ya save et
	 decfsz  count     ;Bit sayaci 1 eksilt bit okuma bitmişmi
	 goto    YeniBit    ;Bit okuma bitmemiş
	 bsf     ADCcs    	;Bit okuma bitmiş ADC0831 i Disable et
         return			;Alt programdan çık
;******************************************************************************
; EeRead (okuma adresi "W" ile gelinir okunun data "W" ile çıkılır
;******************************************************************************            
EeRead 
	movwf	EEADR		; EEADR <= W
	bsf		STATUS,5	;Bank1 e gec
	bsf		EECON1,0	; Eepromu okumayı etkinleştir (Donanımsal olarak silinir;
	bcf	STATUS,5		;Bank0 e gec	
	movf	EEDATA,0	; W <= EEDATA
	return
;************************************************************************************************************
;*************************************************************************************************************
Timer0
	movwf	Temp1		;W save et
	movf	STATUS,0	;W<=Status
	movwf	Temp2		;Statusu save et
	bcf	INTCON,T0IF     ;TMR0 ı çalıştır	
	movlw	B'00000001'	;W=0x01	
	xorwf	Flag		;Flag sıfıncı bitinin complimentini al (Sembolu blink yapmak için)
	movf	Temp2,0		;Status bilgisini al
	movwf	STATUS		;Statusu geri yükle
	movf	Temp1,0		;W ü geri yükle		
	retfie

org	0x2100  
	DE	0xFF,0x1C	     ;Isı_h degeri 0x1C=28d 
	
	end

Acıklamaları yazılmış asm örnegi

RaMu

Alıntı yapılan: Baran Ekrem - 28 Aralık 2014, 18:54:35
@RaMu, hocam çözdüm az çok ama biraz incik cincik var gibi öğrenilirim bir kaç güne

"c de yaptıklarını asm de hemen yaparım diye bekleme," derken, daha mı zor olur ASM'de ?

Zor değil hiç olmaz hatta,
asmde usb çalıştırmak hayal gibi,
ama korkacak birşey yok
böyle uygulamaları değil öğretici uygulamaları yaparsınız.
Her yazılımcı bence asm bilmek zorundadır.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html