; ; 実験5 7セグメント表示テストプログラム ; ; CONFIG1 __CONFIG _CONFIG1, _FOSC_XT & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CCPMX_RB0 & _CP_OFF ; CONFIG2 __CONFIG _CONFIG2, _FCMEN_ON & _IESO_ON list p=16F87 #include ORG 0x000 ; リセットベクタを 0番地に指定 BSF STATUS,RP0 ; STATUSのビットPR0をセット(BANK 1) CLRF TRISA ; Aポートを全て出力に設定 CLRF TRISB ; Bポートを全て出力に設定 BCF STATUS,RP0 ; STATUSのビットPR0をセット(BANK 0) COUNT1 EQU 0x20 COUNT2 EQU 0x21 PAT0 EQU B'00111111' ; '0'の点灯パターン定義 PAT1 EQU B'00000110' ; '1'の点灯パターン定義 PAT2 EQU B'01011011' ; '2'の点灯パターン定義 PAT3 EQU B'01001111' ; '3'の点灯パターン定義 PAT4 EQU B'01100110' ; '4'の点灯パターン定義 PAT5 EQU B'01101101' ; '5'の点灯パターン定義 PAT6 EQU B'01111101' ; '6'の点灯パターン定義 PAT7 EQU B'00100111' ; '7'の点灯パターン定義 PAT8 EQU B'01111111' ; '8'の点灯パターン定義 PAT9 EQU B'01101111' ; '9'の点灯パターン定義 PATA EQU B'01110111' ; 'A'の点灯パターン定義 PATB EQU B'01111100' ; 'B'の点灯パターン定義 PATC EQU B'00111001' ; 'C'の点灯パターン定義 PATD EQU B'01011110' ; 'D'の点灯パターン定義 PATE EQU B'01111001' ; 'E'の点灯パターン定義 PATF EQU B'01110001' ; 'F'の点灯パターン定義 LOOP0 MOVLW PAT0 ; Wレジスタに'0'の表示パターンを転送 MOVWF PORTB ; Wレジスタの値をBポートに転送 MOVLW B'00001' ; WレジスタにB'00001'を転送 MOVWF PORTA ; Wレジスタの値をAポートに転送 CALL WAIT ; MOVLW PAT1 ; Wレジスタに'1'の表示パターンを転送 MOVWF PORTB ; Wレジスタの値をBポートに転送 MOVLW B'00010' ; WレジスタにB'00010'を転送 MOVWF PORTA ; Wレジスタの値をAポートに転送 CALL WAIT ; MOVLW PAT2 ; Wレジスタに'2'の表示パターンを転送 MOVWF PORTB ; Wレジスタの値をBポートに転送 MOVLW B'00100' ; WレジスタにB'00100'を転送 MOVWF PORTA ; Wレジスタの値をAポートに転送 CALL WAIT ; MOVLW PAT3 ; Wレジスタに'3'の表示パターンを転送 MOVWF PORTB ; Wレジスタの値をBポートに転送 MOVLW B'01000' ; WレジスタにB'01000'を転送 MOVWF PORTA ; Wレジスタの値をAポートに転送 CALL WAIT ; GOTO LOOP0 ; ラベルLOOP0へジャンプ ; 無駄時間待ち処理 WAIT WAIT MOVLW 0xFF ; Wレジスタに0xFFを転送(スキャン時間調整) MOVWF COUNT1 ; COUNT1にWレジスタの内容を転送 LOOP1 CALL WAIT1 ; WAIT1をサブルーチンコール DECFSZ COUNT1,F ; COUNT1を減算してCOUNT1に格納 GOTO LOOP1 ; COUNT1が0でなければ繰り返す RETURN ; COUNT1が0になったら戻る。 WAIT1 MOVLW 0x10 ; Wレジスタに0x10を転送(スキャン時間調整) MOVWF COUNT2 ; COUNT2にWレジスタの内容を転送 LOOP2 NOP ; 1命令サイクル消費 DECFSZ COUNT2,F ; COUNT2を減算してCOUNT2に格納 GOTO LOOP2 ; COUNT2が0でなければ繰り返す RETURN ; COUNT2が0になったら戻る。 END