;*********************************************************************** ; CPLD Freqency Counter Display Controller ; CPLD Pin Assign ; 12-14 :dgtslct0-3 Digit Select RC0-2 ; 22 :busy Wait until count end RA5 ; 5 :counter input ; 7 :master clock 12.8MHz ; 20 :1sec/0.1sec select(fixed to 1sec) ; 6 :input ; 4 :gated output ; 28-25 :bcdout0-3 BCD output of counter RA0-3 ; 39 :start trigger RB0 ;*********************************************************************** LIST P=PIC16F873 INCLUDE "P16F873.INC" ;**************************** ; Define Constant or Work ;**************************** DIGIT12 EQU 021H ;Dispaly Data 1,2桁目 DIGIT34 EQU 022H ;Display Data 3,4桁目 DIGIT56 EQU 023H ;Dispaly Data 5,6桁目 DIGIT78 EQU 024H ;Dispaly Data 7,8桁目 CNT1 EQU 025H ;Timer Counter for CLOCK CNT2 EQU 026H ;Timer Counter for 10usec CNT3 EQU 027H ;Timer Counter for 5msec COLUM EQU 028H ;Display Digit Position TEMP EQU 029H ;Tempolary Save Area BLANK EQU 02AH ;BLANK flag ORG 0 ;******************************** ; Main Routine ;******************************** MAIN MOVLW 088H ;display initial all 8 MOVWF DIGIT12 MOVWF DIGIT34 MOVWF DIGIT56 MOVWF DIGIT78 ;**** PORT A & B Initialize Routine  ********** CLRF ADCON0 ;STOP A/D CONV BSF STATUS,RP0 ;Page1へ MOVLW 07H MOVWF ADCON1 ;SET TO ALL DIGITAL MOVLW 0FFH MOVWF TRISA ;Port Aはすべて入力 CLRF TRISB ;Port B all output CLRF TRISC ;PORT Cはすべて出力 BCF STATUS,RP0 ;Page 0に戻る ;********* メインルーチン  ************* MAINLP BSF PORTB,0 ;start counter NOP BCF PORTB,0 ;**** display DSPLP MOVLW 1 MOVWF BLANK MOVLW 080H ;7,8桁データ MOVWF COLUM MOVF DIGIT78,W ;7,8桁取り出し CALL DISP ;表示 ; MOVLW 020H ;5,6桁データ MOVWF COLUM MOVF DIGIT56,W ;5,6桁取り出し CALL DISP ; MOVLW 08H ;3,4桁データ MOVWF COLUM MOVF DIGIT34,W ;3,4桁目取り出し CALL DISP ;表示 ; MOVLW 02H ;2桁データ MOVWF COLUM MOVF DIGIT12,W ;1,2桁目取り出し CALL DISP ;表示 ;*** CHECK CUNT END AND READ DATA **** BTFSS PORTA,5 ;busy bit GOTO DSPLP CALL GETDATA GOTO MAINLP ;Loop ;**************************************************************** ;***************************************** ; Get BCD Data Subroutine ; ;***************************************** GETDATA CLRF PORTB ;all clear display ; MOVLW 7 MOVWF PORTC ;select digit8 NOP MOVF PORTA,W ;get digit8 ANDLW 0FH MOVWF DIGIT78 ;save SWAPF DIGIT78,F ;shift to upper DECF PORTC ; NOP MOVF PORTA,W ;get digit7 ANDLW 0FH IORWF DIGIT78,F ;save digit7,8 ; DECF PORTC NOP MOVF PORTA,W ;get digit6 ANDLW 0FH MOVWF DIGIT56 SWAPF DIGIT56,F DECF PORTC NOP MOVF PORTA,W ;get digit5 ANDLW 0FH IORWF DIGIT56,F ; DECF PORTC NOP MOVF PORTA,W ;get digit4 ANDLW 0FH MOVWF DIGIT34 SWAPF DIGIT34,F DECF PORTC NOP MOVF PORTA,W ;get digit3 ANDLW 0FH IORWF DIGIT34,F ; DECF PORTC NOP MOVF PORTA,W ;get digit2 ANDLW 0FH MOVWF DIGIT12 SWAPF DIGIT12,F DECF PORTC NOP MOVF PORTA,W ;get digit1 ANDLW 0FH IORWF DIGIT12,F RETURN ;***************************************** ; 表示出力サブルーチン 1桁当たり約3msec ; 入力は2桁のBCDコード ; PORTC:桁制御 ; PORTB:セグメント制御 ;***************************************** DISP MOVWF TEMP ;表示データ保存 SWAPF TEMP,W ;上位下位入れ替え ANDLW 0FH ;上位取り出し CALL GET_7SEG ;セグメントデータに変換 ANDLW 0FEH ;bit 0 clear MOVWF PORTB ;ポートBへ出力 MOVF COLUM,W ;桁位置取り出し MOVWF PORTC ;桁出力 BCF STATUS,C ;Carry reset RRF COLUM,F ;次の桁へシフト CALL TIME2M ;Wait 2msec CLRF PORTC ;桁表示クリア MOVF TEMP,W ;下位取り出し ANDLW 0FH ; CALL GET_7SEG ;セグメントへ変換 ANDLW 0FEH ;bit 0 clear MOVWF PORTB ;出力 MOVF COLUM,W ;桁制御 MOVWF PORTC CALL TIME2M ;Wait 2msec CLRF PORTC ;桁クリア RETURN ;************************************************* ; BCDからセグメントへの変換 ; 0ビット目は未使用 ; ブランクチェックをしてブランクに変換する ;************************************************* GET_7SEG BTFSS BLANK,0 ;BLANKフラグのチェック GOTO NOTBLNK ;数字表示へ ANDLW 0FH ;0でないか? BTFSC STATUS,Z ;0 check RETLW 0 ;まだ0ならブランクを強制セット BCF BLANK,0 ;0でなければBLANKフラグリセット NOTBLNK ANDLW 0FH ;下位のみ取り出し ADDWF PCL,F ;Add to PC reg RETLW B'11111100' ;Code 0 RETLW B'01100000' ;Code 1 RETLW B'11011010' ;Code 2 RETLW B'11110010' ;Code 3 RETLW B'01100110' ;Code 4 RETLW B'10110110' ;Code 5 RETLW B'00111110' ;Code 6 RETLW B'11100000' ;Code 7 RETLW B'11111110' ;Code 8 RETLW B'11100110' ;Code 9 RETLW B'00000000' ;Code A RETLW B'00000000' ;Code B RETLW B'00000000' ;Code C RETLW B'00000000' ;Code D RETLW B'00000000' ;Code E RETLW B'00000000' ;Code F ;************************************** ; Timer Routine at clock=12.8MHz ; TIME10 :10usec ; TIME100 :100usec ; TIME2M :2msec ;************************************** ;***** 100usec timer subroutine TIME100 MOVLW 0AH MOVWF CNT1 TM_LP1 CALL TIME10 ;23+2 DECFSZ CNT1,F ;2+31*10-1=311 GOTO TM_LP1 RETURN ;313*0.3125usec=98usec ;****** 10usec timer subroutine ***** TIME10 MOVLW 7H ; MOVWF CNT2 ; TIM_LP2 NOP DECFSZ CNT2,F ;2+4x7-1=29 GOTO TIM_LP2 RETURN ;29+2=31 ;***** 2msec subroutine ***** TIME2M MOVLW 014H ;About 2msec MOVWF CNT3 ; TIM_LP3 CALL TIME100 ;313+2 DECFSZ CNT3,F ;2+318*20-1=6361 GOTO TIM_LP3 RETURN ;6363*0.3125=1.99msec END