You are on page 1of 3

LIST P=16f877, c=100, n=55, st= OFF ; pilih tipe prosesor

cblock 0x20
biner
ratus
puluh
satuan
tmrlinit
ledsts
pola
digled
bufled:6
endc
;*
include "p16f877.inc" ; sertakan file penetapan nama-nama register
;*
org 0x000
goto start ; awal program,
nop ; langkahi vektor
;*
org 0x004
timer: ;**** timer0 overflow service routine ***********
bcf INTCON,T0IF
; movf tmrlinit,w
; movwf TMR0
rrf pola,w
btfss STATUS,C
movlw b'11011111' ;digit 4
movwf pola ;
movwf PORTA ; nyalakan ke PortA
incf FSR,f
movf INDF, w ;
movwf PORTB ; kirim ke PortB
decfszdigled,f
goto initcnt
; retfie
movlw bufled
movwf FSR
decf FSR,f
movlw d'6' ;6 digit
movwf digled

initcnt: ; ulang
movf tmrlinit,w
movwf TMR0 ; ini mereset prescaler
bsf STATUS,RP0
movlw B'00000011'
movwf OPTION_REG
bcf STATUS,RP0
retfie
start: ; beginning of main program
bcf STATUS,RP1 ;
bcf STATUS,RP0 ;select bank0
clrf PORTA ;buat semua Port_A rendah
bsf STATUS,RP0 ;select bank1
movlw B'00000110' ;setel Port_A sebagai digital I/O
movwf ADCON1 ;saat power-on reset port_A analog inputs
clrf TRISA ;buat semua Port_A output
;
movlw B'00000000' ; buat semua Port_B output
movwf TRISB ;
bcf STATUS,RP0 ; select bank0
movlw 0x4E ; harga awal Timer0 256-178= 78= 4Eh
movwf tmrlinit ; simpan di memori
movwf TMR0 ; dan isikan ke buffer Timer0
bsf STATUS,RP0 ; select bank 1
movlw B'00000011' ; prescale 1:16 (b3=0, timer0),
movwf OPTION_REG ; intnal inst cy ck (5)
bcf STATUS,RP0 ; select bank 0
movlw B'10100000' ; enable Timer0 int, clear flag
movwf INTCON ; mask all other int's
isibuf:
movlw bufled
movwf FSR ; arahkan index ke awal data tampilan
movlw d'5'
addwf FSR ;arahkan index ke akhir data tampilan
movlw d'6'
movwf digled ; tetapkan pencacah= 6
isibuf0: ; MENGISI BUFFER
movf digled,w ;digit 6
call svn_seg ; digit #
movwf INDF
decf FSR,f
decfszdigled,f
goto isibuf0
; decf FSR,f ; mundur 1 lokasi

; tampilkan data dalam buffer


movlw b'11011111' ; nyalakan digit 1 (MSD)
movwf pola ;
movwf PORTA ; kirim ke PortA
;
movlw bufled
movwf FSR
movf INDF, w
movwf PORTB ; kirim ke PortB
movlw d'3' ; 3 digit lagi
movwf digled ; digit #

goto $
BINkeBCD clrf puluh ; nolkan cacahan loop
movf biner,w ; bawa byte biner ke W
LOOP1 incf puluh,f
addlw -d'10' ; kurangkan 10 kepada W
btfsc STATUS,C ; IF borrow (=Not Carry) THEN exit loop
goto LOOP1
decf puluh,f
addlw d'10' ; tambahkan 10 kepada sisa (restoring)
movwf satuan ; simpan sisa sebagai satuan
;
movf puluh,w ; bawa hasil bagi sblmnya ke W
clrf ratus
LOOP2 incf ratus,f ; catat pengurangan satu ratusan
addlw -d'10' ; kurangkan 10
btfsc STATUS,C ; IF borrow THEN exit loop
goto LOOP2 ; ELSE ulangi pengurangan
decf ratus,f
addlw d'10' ; tambahkan lagi 10 (restore)
movwf puluh ; sisa pemvagian merupakan puluhan
return
;
svn_seg addwf PCL,f ; Tambahkan N ke PCL membrikan PC + N
retlw b'11000000' ; kode 0
retlw b'11111001' ; kode 1
retlw b'10100100' ; kode 2
retlw b'10110000' ; kode 3
retlw b'10011001' ; kode 4
retlw b'10010010' ; kode 5
retlw b'10000010' ; kode 6
retlw b'11111000' ; kode 7
retlw b'10000000' ; kode 8
retlw b'10010000' ; kode 9
;..... ...... ; Next routine

end

You might also like