LIST P=16F628A, R=DEC INCLUDE __CONFIG _PWRTE_ON & _WDT_OFF & _MCLRE_OFF & _BODEN_OFF & _LVP_OFF & _XT_OSC W_save equ 20h ; zaloha pri preruseni Sta_sav equ 21h ; zaloha pri preruseni PCL_sav equ 22h ; zaloha pri preruseni FSR_sav equ 23h ; zaloha pri preruseni jednotky equ 24h desiatky equ 25h test equ 26h stovky equ 27h tisicky equ 28h desattisicky equ 29h cislo equ 30h TMP1 equ 31h TMP0 equ 32h TMP2 equ 33h PC equ 02h hodnota equ .244 #DEFINE A1 PORTA,0 #DEFINE A2 PORTA,1 #DEFINE A3 PORTA,2 #DEFINE A4 PORTA,3 #DEFINE A5 PORTB,0 ; ;----------------------------------------------------------------------------------------------- org 00h goto INIT ;************************************************************************** ;----------------------------------------------------------------------- ;---------------------------------------------------------------------- org 04h ; ulozeni hlavnich registru movwf W_save ; W movf STATUS,W clrf STATUS ; Banka 0 movwf Sta_sav ; STATUS movf PCLATH,w movwf PCL_sav ; PCLATH movf FSR,w movwf FSR_sav ; FSR GOTO PRERUS ;-------------------------------------------- INIT MOVLW B'00000111' ; typ komparatoru (off) MOVWF CMCON BSF STATUS,RP0 ; nastaveni In / Out MOVLW B'00000000' MOVWF TRISA MOVLW B'00000000' MOVWF TRISB MOVLW B'00000011';delička 32/B'00000011'/ MOVWF OPTION_REG BCF STATUS,RP0 MOVLW B'10100000' ; povoleni preruseni pouze od TMR0 MOVWF INTCON MOVLW hodnota MOVWF cislo ;-------------------------------------------------------------- MOVLW .0 MOVWF jednotky MOVLW .0 MOVWF desiatky MOVLW .0 MOVWF stovky MOVLW .0 MOVWF tisicky MOVLW .8 MOVWF desattisicky BSF test,0;príznak pre dekrementovanie desiatok a jednotiek MOVLW .0 MOVWF PORTA MOVWF PORTB ;-------------------------------------------------------------- main call zob1 call zob10 call zob100 call zob1000 call zob10000 goto $-5 ;************************************************************************** ;----------------------------------------------------------------------- ;---------------------------------------------------------------------- PRERUS BTFSC INTCON,2;test či bolo prerušenie od TMR0 GOTO PRER0 ; od TMR0 GOTO PRERKON ; nezname = nic-vrati sa naspäť vykon.prgm. PRER0 BCF INTCON,2 ; smazat priznak a vykonávať prerušenie. DECF cislo,1 BTFSC STATUS,Z;ak je nula skáč goto vypočeta ;odtialto sa skáče na obsluhu prerušenia. konec GOTO PRERKON;choď na ukončenie prerušenia PRERKON MOVLW B'10100000' ; povoleni zpet pozadovanych preruseni MOVWF INTCON clrf STATUS ; Banka 0 obnoveni ulozenych registru movf FSR_sav,w ; FSR movwf FSR movf PCL_sav,w ; PCLATH movwf PCLATH movf Sta_sav,w ; Status movwf STATUS swapf W_save,f ; W swapf W_save,w retfie ;-------------------------------------------- vypočeta MOVLW .191 ;197 DEC MOVWF TMP2 DECFSZ TMP2,F GOTO $-1 clrf TMR0 nop goto vypočet ;-------------------------------------------- ;-------------------------------------------- ;-------------------------------------------- ;-------------------------------------------- dec_tis_set_sto_des_jedn decf tisicky,1 call set_sto call set_des call set_jedn bsf test,0 goto konec ;----------------------------------------------------------------- dec_desattisicky_setall movf desattisicky,W;kontrola či sú desattisicky na nule sublw .0 btfsc STATUS,Z goto konec decf desattisicky,1 call set_tisic call set_sto call set_des call set_jedn bsf test,0 goto konec ;dec_tis_set_sto_des_jedn ;--------------------------------------------------------- kontr_nul_stoviek movf jednotky,W;kontrola či sú jednotky na nule sublw .0 btfss STATUS,Z goto jump2 movf desiatky,W;kontrola či sú desiatky na nule sublw .0 btfss STATUS,Z goto jump2 movf stovky,W;kontrola či sú stovky na nule sublw .0 btfss STATUS,Z goto jump2 goto dec_tis_set_sto_des_jedn ;--------------------------------------------------------- kontr_nul_tisicok movf jednotky,W;kontrola či sú jednotky na nule sublw .0 btfss STATUS,Z goto jump1 movf desiatky,W;kontrola či sú desiatky na nule sublw .0 btfss STATUS,Z goto jump1 movf stovky,W;kontrola či sú stovky na nule sublw .0 btfss STATUS,Z goto jump1 movf tisicky,W sublw .0 btfss STATUS,Z goto jump1 goto dec_desattisicky_setall ;--------------------------------------------------------- dec_stovky decf stovky,1 call set_jedn call set_des bsf test,0 goto konec ;--------------------------------------------------------- set_des movlw .5 movwf desiatky return ;---------------------------------------------------------- set_sto movlw .9 movwf stovky return ;------------------------------------------------------ set_tisic movlw .5 movwf tisicky return ;---------------------------------------------------- set_jedn movlw .9 movwf jednotky return ;---------------------------------------------------------------- decr_des_set_jedn decf desiatky,1 call set_jedn bsf test,0 goto konec ;************************************************************************************************ decr_jedn decf jednotky,1 btfsc STATUS,Z;otestuje či sú jednotky v nule bcf test,0;choď na dec.dec return ;***************************************vypocet /////////////// vypočet movlw hodnota movwf cislo goto kontr_nul_tisicok jump1 goto kontr_nul_stoviek jump2 movf jednotky,W;kontrola či sú jednotky na nule sublw .0 btfss STATUS,Z goto $+6;1-9 nie sú movf desiatky,W;kontrola či sú desiatky na nule sublw .0 btfss STATUS,Z goto $+2 ;nie sú goto dec_stovky ;sú btfss test,0;pokiaľ nie je nula skáče goto decr_des_set_jedn btfsc test,0;otestuje či se test,0 v nule call decr_jedn goto PRERKON ;************************************************************************************************ ;----------------------------podprogramy-------------------------------------------- wait MOVLW .5 MOVWF TMP1 MOVLW .5 MOVWF TMP0 DECFSZ TMP0,F GOTO $-1 DECFSZ TMP1,F GOTO $-3 RETURN ;------------------------------------------------------------------------ zob1 movf jednotky,0;načítaj obsah reg.jednotky do WREG call zobraz bsf A1 call wait bcf A1 return ;--------------------------------------------------------------- zob10 movf desiatky,0 call zobraz bsf A2;zapni spol.anódy č.2 call wait bcf A2;vypni A2 return ;----------------------------------------------------------------- zob100 movf stovky,0 call zobraz bsf A3 call wait bcf A3 return ;---------------------------------------------------------------- zob1000 movf tisicky,0 call zobraz bsf A4 call wait bcf A4 return ;----------------------------------------------------------------- zob10000 movf desattisicky,0 call zobraz bsf A5 call wait bcf A5 return ;************************************************************* koduj addwf PC,f ;preskoc W instrukciu retlw B'10000000' ;vystupy pre nulu retlw B'11110010' ;vystupy pre jednicku retlw B'01001000' ;vystupy pre dvojku retlw B'01100000' ;vystupy pre trojku retlw B'00110010' ;vystupy pre stvorku retlw B'00100100' ;vystupy pre petku retlw B'00000100' ;vystupy pre sestku retlw B'11110000' ;vystupy pre sedmicku retlw B'00000000' ;vystupy pre osmicku retlw B'00110000' ;vystupy pre deviatku retlw B'11111111' ;zhasnuty displej retlw B'11111111' ;zhasnuty displej retlw B'11111111' ;zhasnuty displej retlw B'11111111' ;zhasnuty displej retlw B'11111111' ;zhasnuty displej retlw B'11111111' ;zhasnuty displej ;************************************************************* zobraz andlw 0fh ;zamaskuj horne styri bity zaciatok zobrazovania call koduj movwf PORTB ;nastav vystupy portu A return ;************************************************************************** ;----------------------------------------------------------------------- ;---------------------------------------------------------------------- END