;p16f84 ; PROM(1K): 000h-3ffh ; RAM(68): 0ch-4fh ; EERAM(64): 00h-3fh ;*** start of macro definition *** mult2 macro fr bcf STATUS,C rlf fr,F endm mult4 macro fr bcf STATUS,C rlf fr,F bcf STATUS,C rlf fr,F endm mult5 macro fr movf fr,W bcf STATUS,C rlf fr,F bcf STATUS,C rlf fr,F addwf fr,F endm mult6 macro fr bcf STATUS,C rlf fr,F movf fr,W rlf fr,F addwf fr,F endm mult8 macro fr bcf STATUS,C rlf fr,F bcf STATUS,C rlf fr,F bcf STATUS,C rlf fr,F endm mult9 macro fr movf fr,W bcf STATUS,C rlf fr,F bcf STATUS,C rlf fr,F bcf STATUS,C rlf fr,F addwf fr,F endm mult10 macro fr bcf STATUS,C rlf fr,F movf fr,W bcf STATUS,C rlf fr,F bcf STATUS,C rlf fr,F addwf fr,F endm clrf6 macro fr0,fr1,fr2,fr3,fr4,fr5 clrf fr5 clrf fr4 clrf fr3 clrf fr2 clrf fr1 clrf fr0 endm clrf4 macro fr0,fr1,fr2,fr3 clrf fr3 clrf fr2 clrf fr1 clrf fr0 endm clrf3 macro fr0,fr1,fr2 clrf fr2 clrf fr1 clrf fr0 endm clrf2 macro fr0,fr1 clrf fr1 clrf fr0 endm mvi macro fr,val if val==0 clrf fr else movlw val movwf fr endif endm mvi2 macro fr_h,fr_l, val_h,val_l if val_h==0 clrf fr_h else movlw val_h movwf fr_h endif if val_l==0 clrf fr_l else movlw val_l movwf fr_l endif endm mov macro frd,frs movf frs,W movwf frd endm mov2 macro frd_h,frd_l, frs_h,frs_l movf frs_h,W movwf frd_h movf frs_l,W movwf frd_l endm rlf2 macro fr_h,fr_l bcf STATUS,C rlf fr_l,F rlf fr_h,F endm rrf2 macro fr_h,fr_l bcf STATUS,C rrf fr_h,F rrf fr_l,F endm rlf4 macro fr3,fr2,fr1,fr0 bcf STATUS,C rlf fr0,F rlf fr1,F rlf fr2,F rlf fr3,F endm wbs macro fr,bit local loop loop btfsc fr,bit goto loop endm wbc macro fr,bit local loop loop btfss fr,bit goto loop endm rbs macro fr,bit btfsc fr,bit return endm rbc macro fr,bit btfss fr,bit return endm rnc macro btfsc STATUS,C return endm rc macro btfss STATUS,C return endm rnz macro btfss STATUS,Z return endm rz macro btfsc STATUS,Z return endm rne macro fr,val movf fr,W sublw val btfsc STATUS,Z return endm re macro fr,val movf fr,W sublw val btfss STATUS,Z return endm rgt macro fr,val movf fr,W sublw val ;W=val-fr btfss STATUS,C return ;(val-fr)<0 endm rge macro fr,val movlw val subwf fr,W ;W=fr-val btfsc STATUS,C return ;(fr-val)>=0 endm rlt macro fr,val movlw val subwf fr,W ;W=fr-val btfss STATUS,C return ;(fr-val)<0 endm rltf macro fr1,fr2 movf fr2,W subwf fr1,W ;W=fr1-fr2 btfss STATUS,C return ;(fr1-fr2)<0 endm rle macro fr,val movf fr,W sublw val ;W=val-fr btfsc STATUS,C return ;(val-fr)>=0 endm cbs macro fr,bit,adr btfsc fr,bit call adr endm cbc macro fr,bit,adr btfss fr,bit call adr endm cnc macro adr btfss STATUS,C call adr endm cc macro adr btfsc STATUS,C call adr endm cnz macro adr btfss STATUS,Z call adr endm cz macro adr btfsc STATUS,Z call adr endm cne macro fr,val,adr movf fr,W sublw val ;W=val-fr btfss STATUS,Z call adr ;(val-fr)!=0 endm ce macro fr,val,adr movf fr,W sublw val btfsc STATUS,Z call adr endm cge macro fr,val,adr movlw val subwf fr,W ;W=fr-val btfsc STATUS,C call adr ;(fr-val)>=0 endm cgt macro fr,val,adr movf fr,W sublw val ;W=val-fr btfss STATUS,C call adr ;(val-fr)<0 endm jbs macro fr,bit,adr btfsc fr,bit goto adr endm jbc macro fr,bit,adr btfss fr,bit goto adr endm jnc macro adr btfss STATUS,C goto adr endm jc macro adr btfsc STATUS,C goto adr endm jnz macro adr btfss STATUS,Z goto adr endm jz macro adr btfsc STATUS,Z goto adr endm jne macro fr,val,adr movf fr,W sublw val ;W=val-fr btfss STATUS,Z goto adr ;(val-fr)!=0 endm xore macro fr1,val1,fr2,val2 local adr1 movf fr1,W sublw val1 ;W=val1-fr1 btfss STATUS,Z goto adr1 ;(val1-fr1)!=0 movlw val2 xorwf fr2,F ;if(fr1==val1) fr2 .= val2 adr1 endm sne macro fr,val movf fr,W sublw val ;W=val-fr btfsc STATUS,Z endm bsfne macro fr1,val1,fr2,b2 movf fr1,W sublw val1 ;W=val1-fr1 btfss STATUS,Z bsf fr2,b2 endm bcfne macro fr1,val1,fr2,b2 movf fr1,W sublw val1 ;W=val1-fr1 btfss STATUS,Z bcf fr2,b2 endm je macro fr,val,adr movf fr,W sublw val btfsc STATUS,Z goto adr endm se macro fr,val movf fr,W sublw val btfss STATUS,Z endm bsfe macro fr1,val1,fr2,b2 movf fr1,W sublw val1 btfsc STATUS,Z bsf fr2,b2 endm bcfe macro fr1,val1,fr2,b2 movf fr1,W sublw val1 btfsc STATUS,Z bcf fr2,b2 endm jle macro fr,val,adr movf fr,W sublw val ;W=val-fr btfsc STATUS,C goto adr ;(val-fr)>=0 endm jlt macro fr,val,adr movlw val subwf fr,W ;W=fr-val btfss STATUS,C goto adr ;(fr-val)<0 endm jltf macro fr1,fr2,adr movf fr2,W subwf fr1,W ;W=fr1-fr2 btfss STATUS,C goto adr ;(fr1-fr2)<0 endm bsle macro fr1,fr2,fr3,b local adr1,adr2 movf fr1,W subwf fr2,W ;W=fr2-fr1 btfsc STATUS,C goto adr1 ;(fr2-fr1)>=0 bcf fr3,b ;else goto adr2 adr1 bsf fr3,b adr2 endm bslt macro fr1,fr2,fr3,b local adr1,adr2 movf fr2,W subwf fr1,W ;W=fr1-fr2 btfss STATUS,C goto adr1 ;(fr1-fr2)<0 bcf fr3,b ;else goto adr2 adr1 bsf fr3,b adr2 endm jge macro fr,val,adr movlw val subwf fr,W ;W=fr-val btfsc STATUS,C goto adr ;(fr-val)>=0 endm jgt macro fr,val,adr movf fr,W sublw val ;W=val-fr btfss STATUS,C goto adr ;(val-fr)<0 endm djnz macro fr,adr decfsz fr,F goto adr endm decfnz macro fr movf fr,F btfss STATUS,Z decf fr,F ;if(fr>0) fr-- endm set_tris macro a,b,op bsf STATUS,RP0 mvi TRISA,a mvi TRISB,b mvi OPTION_REG,op bcf STATUS,RP0 endm set_trisa macro io bsf STATUS,RP0 mvi TRISA,io bcf STATUS,RP0 endm set_trisb macro io bsf STATUS,RP0 mvi TRISB,io bcf STATUS,RP0 endm set_option macro op bsf STATUS,RP0 mvi OPTION_REG,op bcf STATUS,RP0 endm retlw2 macro c0,c1 retlw c0 retlw c1 endm retlw3 macro c0,c1,c2 retlw c0 retlw c1 retlw c2 endm retlw4 macro c0,c1,c2,c3 retlw c0 retlw c1 retlw c2 retlw c3 endm retlw5 macro c0,c1,c2,c3,c4 retlw c0 retlw c1 retlw c2 retlw c3 retlw c4 endm retlw6 macro c0,c1,c2,c3,c4,c5 retlw c0 retlw c1 retlw c2 retlw c3 retlw c4 retlw c5 endm retlw7 macro c0,c1,c2,c3,c4,c5,c6 retlw c0 retlw c1 retlw c2 retlw c3 retlw c4 retlw c5 retlw c6 endm retlw8 macro c0,c1,c2,c3,c4,c5,c6,c7 retlw c0 retlw c1 retlw c2 retlw c3 retlw c4 retlw c5 retlw c6 retlw c7 endm retlw9 macro c0,c1,c2,c3,c4,c5,c6,c7,c8 retlw c0 retlw c1 retlw c2 retlw c3 retlw c4 retlw c5 retlw c6 retlw c7 retlw c8 endm retlw10 macro c0,c1,c2,c3,c4,c5,c6,c7,c8,c9 retlw c0 retlw c1 retlw c2 retlw c3 retlw c4 retlw c5 retlw c6 retlw c7 retlw c8 retlw c9 endm retlw11 macro c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10 retlw c0 retlw c1 retlw c2 retlw c3 retlw c4 retlw c5 retlw c6 retlw c7 retlw c8 retlw c9 retlw c10 endm retlw12 macro c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11 retlw c0 retlw c1 retlw c2 retlw c3 retlw c4 retlw c5 retlw c6 retlw c7 retlw c8 retlw c9 retlw c10 retlw c11 endm retlw13 macro c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12 retlw c0 retlw c1 retlw c2 retlw c3 retlw c4 retlw c5 retlw c6 retlw c7 retlw c8 retlw c9 retlw c10 retlw c11 retlw c12 endm retlw16 macro c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15 retlw c0 retlw c1 retlw c2 retlw c3 retlw c4 retlw c5 retlw c6 retlw c7 retlw c8 retlw c9 retlw c10 retlw c11 retlw c12 retlw c13 retlw c14 retlw c15 endm ;*** end of macro definition *** ;timer and beep routine cblock _t_cnt1,_t_cnt2,_t_cnt3,bzzcntr endc t_8us ;(5+3*5)*0.4=20*0.4=8us movlw 5 goto t_10us+1 t_9us ;(4+3*6)*0.4=22*0.4=8.8us nop movlw 6 movwf _t_cnt1 _t_9us1 decfsz _t_cnt1,F goto _t_9us1 return t_10us ;(3+3*7)*0.4=24*0.4=9.6us movlw 7 movwf _t_cnt1 _t_10us1 decfsz _t_cnt1,F goto _t_10us1 return t_11us ;(3+3*8)*0.4=27*0.4=10.8us movlw 8 movwf _t_cnt1 _t_11us1 decfsz _t_cnt1,F goto _t_11us1 return t_50us ;(5+3*40)*0.4=125*0.4=50us goto $+1 movlw 40 movwf _t_cnt1 _t_50us1 decfsz _t_cnt1,F goto _t_50us1 return t_100us ;(3+3*82)*0.4=249*0.4=99.6us movlw 82 movwf _t_cnt1 _t_100us1 decfsz _t_cnt1,F goto _t_100us1 return t_500us ;(4+5*249)*0.4=1249*0.4=499.6us nop movlw 249 movwf _t_cnt1 _t_500us1 nop nop decfsz _t_cnt1,F goto _t_500us1 return t_1ms ;(3+29*86)*0.4=2497*0.4=0.9988ms movlw 86 movwf _t_cnt2 _t_1ms1 call t_10us decfsz _t_cnt2,F goto _t_1ms1 return t_5ms ;(3+255*49)*0.4=12498*0.4=4.9992ms movlw 49 _t_5ms0 movwf _t_cnt2 _t_5ms1 nop call t_100us decfsz _t_cnt2,F goto _t_5ms1 return t_10ms ;(3+255*98)*0.4=24993*0.4=9.9972ms movlw 98 goto _t_5ms0 t_20ms ;(3+255*196)*0.4=49983*0.4=19.9932ms movlw 196 goto _t_5ms0 t_50ms ;(3+2502*50)*0.4=125103*0.4=50.0412ms movlw 50 _t_50ms0 movwf _t_cnt3 _t_50ms1 call t_1ms ;2497+2 decfsz _t_cnt3,F goto _t_50ms1 return t_100ms ;(3+2502*100)*0.4=250203*0.4=100.0812ms movlw 100 goto _t_50ms0 t_200ms ;(3+2502*200)*0.4=500403*0.4=200.1612ms movlw 200 goto _t_50ms0 t_500ms ;(3+12503*100)*0.4=1250303*0.4=500.1212ms movlw 50 _t_500ms0 movwf _t_cnt3 _t_500ms1 call t_10ms ;24993+2 decfsz _t_cnt3,F goto _t_500ms1 return t_1s ;(3+24998*100)*0.4=2499803*0.4=0.9999212s movlw 100 goto _t_500ms0 beepx movlw 250 goto beep0 beep movlw 100 beep0 movwf bzzcntr beep1 movlw BZZ xorwf BZZport,F ;alternate BZZ call t_500us djnz bzzcntr,beep1 return