PIC16F88にてアナログ入力の油温をLEDアレイ(10素子バー)にて表示させました。
ポイントは
①ダイナミック点灯にてポートの負荷電流をおさえること。
②各バーの輝度を合わせること。
③測定間隔は1sec程度とする。

 

LED点灯中にアナログデータの変換割込みがくると、そのバーだけ明るくなりすぎたので、表示ポートON時は割込み不使用にしました。

 

 

LISTP=PIC16F88
#INCLUDE P16F88.INC
__CONFIG _CONFIG1 , _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO
__CONFIG _CONFIG2 , _IESO_OFF & _FCMEN_OFF
 
;** macro **
MOVLFMACROL,FILE
MOVLWL
MOVWFFILE
ENDM
MOVFFMACROSRC,DST
MOVFSRC,W
MOVWFDST
ENDM
;**** Register 20H~7FH **
CNT1EQU20H;タイマー
CNT2EQU21H;タイマー
CNT3EQU22H;タイマー
CNT4EQU23H;タイマー
CNT5EQU24H;タイマー
OI_HEXEQU25H
BA_HEXEQU26H
FU_HEXEQU27H
N_FUELEQU28H
N_OILEQU29H
N_BATTEQU2AH
HYOUJIEQU2BH
TEMPEQU2CH
NTEMPEQU2DH
HYODNEQU2EH
HYOUPEQU2FH
NPORTEQU30H
WTEMPEQU31H
STEMPEQU32H
PCLATH_TEMPEQU33H
INTCUTEQU34H
INTCUT2EQU35H
;*** Bank1 A0h-EFh(80Bytes) *
ORG0;reset
GOTOPORT_INI
ORG4
GOTOINTRPT
INTRPT
MOVWFWTEMP
SWAPFSTATUS,W
CLRFSTATUS;先にバンク0
MOVWFSTEMP;
MOVFPCLATH,W
MOVWFPCLATH_TEMP
CLRFPCLATH
BTFSSINTCON,TMR0IF
GOTOPOPRTN
BCFINTCON,TMR0IF;TMR0 割り込みフラグリセット
;---FUEL LEVEL 入力電圧
      DECFSZINTCUT2
GOTOPOPRTN
;*****電圧測定 16進数データ取得 *
BTFSSINTCUT,0
GOTOPOPRTN
FUELADS
MOVLWB'10010001';RA2データ蓄積
MOVWFADCON0
CALLT10uS
CALLT10uS;蓄積待ち
BSFADCON0,GO;A/D変換開始
BTFSCADCON0,2
GOTO $-1
MOVFFADRESH,FU_HEX;16進データを保存
RLFINTCUT,F
;--OIL_TEMP 入力電圧------
BTFSSINTCUT,1
GOTOPOPRTN
TEMPADS
MOVLWB'10011001';RA3データ蓄積
MOVWFADCON0
CALLT10uS
CALLT10uS;蓄積待ち
BSFADCON0,GO;A/D変換開始
BTFSCADCON0,2
GOTO $-1
MOVFFADRESH,OI_HEX;16進データを保存
RLFINTCUT,F
;---BaTT 入力電圧-------
BTFSSINTCUT,2
GOTOPOPRTN
BATTADS
MOVLWB'10100001';RA4データ蓄積
MOVWFADCON0
CALLT10uS
CALLT10uS;蓄積待ち
BSFADCON0,GO;A/D変換開始
BTFSCADCON0,2
GOTO $-1
MOVFFADRESH,BA_HEX;16進データを保存
MOVLFB'00000001',INTCUT
MOVLFD'10',INTCUT2
POPRTN
SWAPFSTEMP,W
MOVWFSTATUS
SWAPFWTEMP,F
SWAPFWTEMP,W
RETFIE
;HHHH メインループはじめ HHH
PORT_INI;入出力モード初期設定
clrwdt
BSF STATUS,RP0 ;Bank1に切替え
MOVLWB'00011100';ANSEL アナログOFFの設定
;RA2,3,4 アナログセット
MOVWF ANSEL ;設定(TRISAより先に)
 
MOVLWB'00111100';PORT Aの設定 RA2,3,4,5
MOVWF TRISA ;設定
MOVLWB'00000000';PORT Bの設定
MOVWF TRISB ;PORTBの設定
MOVLWB'10000111';*UPエッジ、分周比()
;OPTION_REG 1:128
MOVWFOPTION_REG;
CLRFPIE1
CLRFPIE2
MOVLWB'01101110';OSCILLATOR CONTROL
MOVWFOSCCON;Primary Oscllator
MOVLWB'01000000';Vref+=VDD Vref=Vss ADFM "1"
MOVWFADCON1;A/Dコンバータ1設定

BCF STATUS,RP0 ;Bank0に戻す
MOVLWB'00000000'
MOVWFT1CON;TMR1不使用
CLRFPIR1
CLRFPIR2
MOVLFB'10100000',INTCON
;*** メインプログラム ******
BSFPORTA,0
BSFPORTA,1
MAINLOOP
MOVFFU_HEX,W
CALLHEX10
MOVWFN_FUEL
MOVFOI_HEX,W
CALLHEX10
MOVWFN_OIL
MOVFBA_HEX,W
CALLHEX10
MOVWFN_BATT
;*** LEDアレイCOM選択 ****
;---- COM1 ON
BCFPORTA,0
BSFPORTA,1
MOVFN_FUEL,W
CALLLEDHYO
BSFPORTA,0
BSFPORTA,1
;---- COM2 ON
BSFPORTA,0
BCFPORTA,1
BTFSSPORTA,5
GOTOCOM2_BA
MOVFN_OIL,W
GOTOCOM2_JP
COM2_BAMOVFN_BATT,W
COM2_JPCALLLEDHYO
BSFPORTA,0
BSFPORTA,1
GOTOMAINLOOP
;***16進数データを10段階にする***
HEX10MOVWFTEMP
clrfNTEMP
AAHMOVLWD'25'
SUBWFTEMP;f-W
BTFSSSTATUS,C;cは正なら1
GOTO$+3
INCFNTEMP,F
GOTOAAH
MOVFNTEMP,W
RETURN
;***表示制御(ダイナミック点灯)***
HYOJI
BCFINTCON,TMR0IE;割り込み中止
BTFSCHYOUP,1
BSFPORTA,7
CALLT1ms
BCFPORTA,7
BTFSCHYOUP,0
BSFPORTA,6
CALLT1ms
BCFPORTA,6
BTFSCHYODN,7
BSFPORTB,7
CALLT1ms
BCFPORTB,7
BTFSCHYODN,6
BSFPORTB,6
CALLT1ms
BCFPORTB,6
BTFSCHYODN,5
BSFPORTB,5
CALLT1ms
BCFPORTB,5
BTFSCHYODN,4
BSFPORTB,4
CALLT1ms
BCFPORTB,4
BTFSCHYODN,3
BSFPORTB,3
CALLT1ms
BCFPORTB,3
BTFSCHYODN,2
BSFPORTB,2
CALLT1ms
BCFPORTB,2
BTFSCHYODN,1
BSFPORTB,1
CALLT1ms
BCFPORTB,1
BTFSCHYODN,0
BSFPORTB,0
CALLT1ms
BCFPORTB,0
BSFINTCON,TMR0IE;割り込み復帰
RETURN
;10段階数値を10ヶのLEDで表示
LEDHYO
MOVWFTEMP
CLRFHYODN
CLRFHYOUP
MOVFTEMP,W
BTFSCSTATUS,Z
GOTORETEND
HYOBBBSFSTATUS,C
RLFHYODN,F;左シフト
BTFSCSTATUS,C
RLFHYOUP,F;左シフト
DECFSZTEMP,F
GOTOHYOBB
 
RETENDCALLHYOJI
RETURN
;---- タイマー ----
T10uS;1クロックサイクル1/4MHz*4=1usec
MOVLWH'02'
MOVWFCNT1
DECFSZCNT1,F;2+(1+2)*2-1=7
GOTO$-1
GOTO$+1;7+2=9
RETURN;(9+1)=10usec
T1ms
MOVLWd'199'
MOVWFCNT1
goto$+1
DECFSZCNT1,F;2+(1+2+2)*199-1=996
GOTO$-2
goto$+1;996+2=998
nop;998+1
RETURN;(999+1)=1msec
END