; gs25 マクロ ver 1.0 ; written by Naoshi SAKAMOTO sakamoto@c.dendai.ac.jp ; 第 5 回終了時 ; ;初期化 ; list p=16f628a #include p16f628a.inc variable env env = _BOREN_OFF env &= _CP_OFF env &= _DATA_CP_OFF env &= _PWRTE_OFF env &= _WDT_OFF env &= _LVP_OFF env &= _MCLRE_OFF env &= _INTOSC_OSC_NOCLKOUT __config env cblock 0x20 endc nolist enable_PB macro banksel TRISB clrf TRISB banksel PORTB clrf PORTB endm enable_PAPB macro movlw 0x07 movwf CMCON banksel TRISA movlw b'0010000' movwf TRISA clrf TRISB banksel PORTA clrf PORTA clrf PORTB endm ; ; sw RA5 のスイッチが押された時サブルーチンを呼ぶマクロ ; sw_init macro cblock sw_prev endc clrf sw_prev endm sw_prg macro func sw_main btfsc PORTA,5 goto sw_on sw_off clrf sw_prev goto sw_main sw_on movf sw_prev,1 btfss STATUS,Z goto sw_main movlw d'1' movwf sw_prev call func goto sw_main endm ; ; ビジーウェイト(初期化時に時定数を与える) ; bwait_init macro _time #define bwait_time _time cblock bwait_v0,bwait_v1,bwait_v2 endc endm bwait_prg macro bwait movlw bwait_time movwf bwait_v0 bwait0 clrf bwait_v1 bwait1 clrf bwait_v2 bwait2 nop decfsz bwait_v2,1 goto bwait2 decfsz bwait_v1,1 goto bwait1 decfsz bwait_v0,1 goto bwait0 return endm ; ; counter カウンタを増やし(inccount)、値を表示する(dispcount) ; counter_prg にカウンタの上限値を与える(通常は pat_end-pat_start) ; 要 getpat ; counter_init macro cblock counter bout endc clrf counter call dispcounter endm counter_prg macro limit inccounter incf counter,1 movlw limit subwf counter,0 btfsc STATUS,Z clrf counter dispcounter movf counter,0 call getpat movwf bout ; 出力パターン仮置き movlw b'00000001' ; マスク andwf PORTB,0 iorwf bout,0 movwf PORTB return endm ; ; getpat W レジスタの値に応じた値を W レジスタに返す関数マクロ ; pat_end - pat_start が要素数になる。 ; getpat_num_prg は 連続ビットパターン ; getpat_num_prg は 7 セグメント LED の表示パターン ; getpat_bit_prg macro getpat addwf PCL,1 pat_start retlw b'00000000' retlw b'00000001' retlw b'00000011' retlw b'00000111' retlw b'00001111' retlw b'00011111' retlw b'00111111' retlw b'01111111' retlw b'11111111' pat_end endm getpat_num_prg macro getpat addwf PCL,1 pat_start retlw b'11111011' ; 0 このパターンは配線によって変わります retlw b'10000010' ; 1 retlw b'11011101' ; 2 retlw b'11001110' ; 3 retlw b'10100111' ; 4 retlw b'01101110' ; 5 retlw b'01111111' ; 6 retlw b'11100010' ; 7 retlw b'11111111' ; 8 retlw b'11101110' ; 9 retlw b'11110111' ; A retlw b'00111110' ; b retlw b'01111001' ; C retlw b'10011110' ; d retlw b'01111101' ; E retlw b'01110100' ; F pat_end endm ; ; timer0 TIME0 割り込みの設定、取り扱い ; timer0_init macro psmode cblock savew savest endc clrwdt banksel OPTION_REG movlw psmode movwf OPTION_REG banksel INTCON bsf INTCON,T0IE bcf INTCON,T0IF bsf INTCON,GIE endm timer0_prg macro func timer0 movwf savew movf STATUS,0 movwf savest btfss INTCON,T0IF goto nottimer0 bcf INTCON,T0IF call func nottimer0 movf savest,0 movwf STATUS movf savew,0 retfie endm ; ; postscaler 呼び出しを間引く ; postscaler_init macro rate #define post_rate rate cblock post_count endc movlw post_rate movwf post_count endm postscaler_prg macro func postscaler decfsz post_count,1 return movlw post_rate movwf post_count call func return endm ; ; duty 呼び出されると二つのサブルーチンを特定の割合で交互に呼び出す ; duty_init macro cblock duty_ratio,duty_period,duty_counter endc endm duty_prg macro func_off, func_on duty movf duty_counter,0 subwf duty_ratio,0 btfsc STATUS,C goto duty_on call func_off goto duty_end duty_on call func_on duty_end decfsz duty_counter,1 return movf duty_period,0 movwf duty_counter return endm set_rate_by_counter_prg macro set_rate_by_counter movf counter,0 call getduty movwf duty_ratio return endm getduty_prg macro getduty addwf PCL,1 startduty ; retlw d'128' retlw d'64' retlw d'32' retlw d'16' retlw d'8' retlw d'4' retlw d'2' retlw d'1' endduty endm porta_init macro cblock patterna endc movlw b'11111111' movwf patterna endm porta_prg macro porta_on movf patterna,0 movwf PORTA return porta_off clrf PORTA return endm list