JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

紅葉と雪

2024-11-20 12:18:01 | 夢の森から
 このところ真冬並みの寒い日が続いています。
 
 こちら喜多方市熱塩加納町は、里の紅葉がピークを迎えました。

 昨日は、ぐっと冷え込み近くの山まで真っ白になりました。


 この季節ならではの紅葉と雪のコラボレーションです。

 間もなく里にも雪が降ってきそうです。

 車はだいぶ前にスタッドレスタイヤに交換しましたし、シャックの雪囲いも完了しました。残すは庭の雪囲いです。今週中には終わらせましょう。っと。

11月21日追記

 今日は朝から晴れましたので、庭のイヌツゲの雪囲いをしました。


 年々イヌツゲが大きくなってきて、雪囲いの棒が短く感じるようになりました。

MPLABアセンブラ PIC16F1827 EUSARTテストその2

2024-11-17 19:21:15 | MPLAB アセンブラ
 前の記事では、PIC16F1827のEUSARTの送信をテストしました。
 今回は、文字の受信テストとその文字でLEDを点灯、消灯してみます。

 回路図です。今回もICSPでテストしますが、5Vは、FT-234から供給します。この理由は後でトラブルシューティングで説明します。



 入出力設定、EUSARTの設定は、前の記事(PIC6F1827 EUSARTテストその1)と同じです。

 プログラムです。
 TeraTermから1文字受信し、文字が"1"なら"LED ON"と送信し、LEDを点灯します。文字が"0"なら"LED OFF"と送信し、LEDを消灯します。

---------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PIC16F1827 EUSART TEST
; 2024.11.17
; JH7UBC Keiji Hata
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
              
              LIST      P=PIC16F1827
              INCLUDE           P16F1827.INC
              
              __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
     __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF
              
              ERRORLEVEL    -302
              
              CBLOCK             020h
              TEMP
              ENDC

SETUP
;クロック設定
              BANKSEL           OSCCON
              MOVLW              b'01101000'         ;PLLなし、4MHz,Fosc
              MOVWF              OSCCON
;入出力設定
              BANKSEL           ANSELA
              CLRF     ANSELA                            ;AN0-AN4使用しない
              CLRF     ANSELB                            ;AN5-AN11使用しない
              BANKSEL           TRISA
              CLRF     TRISA                 ;PORTAは全て出力(RA5は入力)
              MOVLW              b'000000010'       ;RB1は入力、他は出力
              MOVWF              TRISB
;USART設定
;RX,TX PIN 設定
              BANKSEL           APFCON0
              BCF                     APFCON0,7        ;RXDSEL=0 RX=RB1
              BCF                     APFCON1,0        ;RXCKSEL=0 TX=RB2     
              BANKSEL           TXSTA
              MOVLW              b'00100100'
              MOVWF              TXSTA                ;非同期モード、高速通信モードBRGH=1
;             BANKSEL           RCSTA
              MOVLW              090h
              MOVWF              RCSTA                ;受信可、非同期モード
;             BANKSEL           BAUDCON
              BCF                     BAUDCON,3      ;BRG16=0 BRG 8bit
              MOVLW              019h                    ;019h=25
              MOVWF              SPBRGL                            ;Fosc=4MHz,Baud Rate=9600bps

;PORTA,PORTBクリア
              BANKSEL           LATA
              CLRF     LATA
              CLRF     LATB

MAIN
              CALL     GETCHR
              MOVWF              TEMP                  ;受信した文字をTEMPに格納
              XORLW 031h
              BTFSS   STATUS,Z           ;受信した文字が"1"ならスキップ
              GOTO   NEXT    
              CALL     MSG1
              CALL     LED_ON
              GOTO   MAIN
NEXT
              MOVFW              TEMP
              XORLW 030h
              BTFSS   STATUS,Z           ;受信した文字が"0"ならスキップ
              GOTO   MAIN
              CALL     MSG2
              CALL     LED_OFF
              GOTO   MAIN
              
LED_ON
              BANKSEL           LATA
              BSF                      LATA,1
              RETURN
              
LED_OFF
              BANKSEL LATA
              BCF                     LATA,1
              RETURN

;1文字送信          
SENDCHR
              BANKSEL           TXSTA
              BTFSS   TXSTA,TRMT     ;送信可能かチェック(1:可 0:禁止)
              GOTO   $-1
              MOVWF              TXREG
              RETURN
              
;1文字受信
GETCHR
              BANKSEL           PIR1
              BTFSS   PIR1,RCIF           ;RCIF=1ならスキップ
              GOTO   $-1
              BANKSEL           RCREG
              MOVFW              RCREG
              RETURN

MSG1
              MOVLW              "L"
              CALL     SENDCHR
              MOVLW              "E"
              CALL     SENDCHR
              MOVLW              "D"
              CALL     SENDCHR
              MOVLW              " "
              CALL     SENDCHR
              MOVLW              "O"
              CALL     SENDCHR
              MOVLW              "N"
              CALL     SENDCHR
              MOVLW              0Dh
              CALL     SENDCHR
              MOVLW              0Ah
              CALL     SENDCHR
              RETURN
              
MSG2
              MOVLW              "L"
              CALL     SENDCHR
              MOVLW              "E"
              CALL     SENDCHR
              MOVLW              "D"
              CALL     SENDCHR
              MOVLW              " "
              CALL     SENDCHR
              MOVLW              "O"
              CALL     SENDCHR
              MOVLW              "F"
              CALL     SENDCHR
              MOVLW              "F"
              CALL     SENDCHR
              MOVLW              0Dh
              CALL     SENDCHR
              MOVLW              0Ah
              CALL     SENDCHR
              RETURN

              END
--------------------------------------------------- 

 ブレッドボードです。


TeraTermの画面です。

 トラブルシューティング
 最初、Vdd(5V)をPICKit3から供給していたのですが、TeraTermがFT-234のあるCOMポートを認識しなくなるトラブルがありました。そこで、PICKit3からの電源供給をやめ、VddをFT-234モジュールから供給するようにしたら問題が解決しました。

MPLABアセンブラ PIC16F1827 EUSARTテストその1

2024-11-15 20:33:28 | MPLAB アセンブラ
 MPLAB IDE v9.82, MPASM v5.51, PICKit3の環境で、PIC16F1827のEUSARTのテストをします。まず、送信テストをします。

 回路図です。今回もICSPでテストをします。
 PIC16F1827から送信した信号をシリアルUSB変換モジュールFT-234を通してパソコンに接続し、通信ソフトTeraTermで受信します。BaudRateは、9600bpsとします。



 PIC16F1827は、APFCON0とAPFCON1の設定で、各種機能のピン割り当てを変更することができます。
 今回は、APFCON0のbit7 RXDTSEL=0(RX/DT=RB1)、APFCON1のbit0 TXCKSEL=0(TX/CK=RB2)としました。



 通信プロトコルは、非同期、8bitとします。
  TXSTAは、TXEN=1,BRGH=1とします。(他のビットはデフォルト)

 RCSTAは、SPEN=1,CREN=1とします。(他のビットはデフォルト)

 PIC16F1827では、より広範囲なクロック、通信速度に対応するためにSPBRGレジスタが16bitに拡張され、SPBRGHとSPBRGLの2つになりました。8bitにするか16bitにするかは、BAUDCONレジスタのbit3 BRG16で設定します。今回は、8bitで使用しますので、BRG16=0とします。



 BaudRateを計算する式は、次の表のようにSYNC=0(非同期),BRG16=0(SPBRG 8bit),BRGH=1(高速モード)の時は、Fosc{16(n+1)}です。
 Fosc=4MHz=4000000Hz,BaudRate=9600bpsの時、SPBRGの値は、25となります。(SPBRGL=25)


 この値は、説明書にも掲載されています。誤差は、0.16%です。



 "Hello World!"の後に、数値を0から255までカウントアップしながら、1秒ごとに送信するプログラムを作ってみました。

------------------------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PIC16F1827 EUSART TEST
; 2024.11.15
; JH7UBC Keiji Hata
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
              
              LIST      P=PIC16F1827
              INCLUDE           P16F1827.INC
              
              __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
     __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF
              
              ERRORLEVEL    -302
              
              CBLOCK             020h
              CNT1ms
              CNT250ms
              COUNTER
              BYTE0
              DIGIT12
              DIGIT34
              SHIFT
              WORK1
              TEMP
              ENDC

SETUP
;クロック設定
              BANKSEL           OSCCON
              MOVLW              b'01101000'         ;PLLなし、4MHz,Fosc
              MOVWF              OSCCON
;入出力設定
              BANKSEL           ANSELA
              CLRF     ANSELA                            ;AN0-AN4使用しない
              CLRF     ANSELB                            ;AN5-AN11使用しない
              BANKSEL           TRISA
              CLRF     TRISA                 ;PORTAは全て出力(RA5は入力)
              MOVLW              b'00000010'       ;RB1は入力、他は出力
              MOVWF              TRISB
;USART設定
;RX,TX PIN 設定
              BANKSEL           APFCON0
              BCF                     APFCON0,7        ;RXDTSEL=0 RX=RB1
              BCF                     APFCON1,0        ;TXCKSEL=0 TX=RB2     
              BANKSEL           TXSTA
              MOVLW              b'00100100'
              MOVWF              TXSTA                ;非同期モード、高速通信モードBRGH=1
;             BANKSEL           RCSTA
              MOVLW              090h
              MOVWF              RCSTA                ;受信可、非同期モード
;             BANKSEL           BAUDCON
              BCF                     BAUDCON,3      ;BRG16=0 BRG 8bit
              MOVLW              019h                    ;019h=25
              MOVWF              SPBRGL                            ;Fosc=4MHz,Baud Rate=9600bps

              CLRF     COUNTER                        ;COUNTERクリア
                            
MAIN
              MOVLW              "H"
              CALL     SENDCHR
              MOVLW              "e"
              CALL     SENDCHR
              MOVLW              "l"
              CALL     SENDCHR
              MOVLW              "l"
              CALL     SENDCHR
              MOVLW              "o"
              CALL     SENDCHR
              MOVLW              " "
              CALL     SENDCHR
              MOVLW              "W"
              CALL     SENDCHR
              MOVLW              "o"
              CALL     SENDCHR
              MOVLW              "r"
              CALL     SENDCHR
              MOVLW              "l"
              CALL     SENDCHR
              MOVLW              "d"
              CALL     SENDCHR
              MOVLW              "!"
              CALL     SENDCHR
              MOVLW              " "
              CALL     SENDCHR

              MOVFW              COUNTER
              MOVWF              BYTE0
              CALL     CONV_BCD        ;COUNTERの値(バイナリ)をBCDに変換しDIGIT34,DIGIT12に格納
              MOVFW              DIGIT34
              ANDLW 0Fh                                    ;DIGIT34の下位4bitを取り出す
              IORLW  30h                                    ;ASCIIコードに変換
              CALL     SENDCHR
              MOVFW              DIGIT12
              MOVWF              WORK1
              MOVWF              TEMP
              SWAPF  TEMP,W
              ANDLW 0Fh                                    ;DIGIT12の上位4bitを取り出す
              IORLW  30h                                    ;ASCIIコードに変換
              CALL     SENDCHR
              MOVFW              WORK1
              ANDLW 0Fh                                    ;DIGIT12の下位4bitを取り出す。
              IORLW  30h                                    ;ASCIIコードに変換
              CALL     SENDCHR
              MOVLW              0Dh                                   ;改行コード
              CALL     SENDCHR
              MOVLW              0Ah                                    ;NLコード
              CALL     SENDCHR
              
              INCF      COUNTER                        ;COUNTER+1

              CALL     LOOP250ms
              CALL     LOOP250ms
              CALL     LOOP250ms
              CALL     LOOP250ms
              GOTO   MAIN

;1文字送信          
SENDCHR
              BANKSEL           TXSTA
              BTFSS   TXSTA,TRMT     ;送信可能かチェック(1:可 0:禁止)
              GOTO   $-1
              MOVWF              TXREG
              RETURN

;--------------------------------------------
; バイナリからBCDへの変換
;--------------------------------------------
CONV_BCD
            BCF              STATUS,C          ;キャリーをクリア
            MOVLW        08h                     ;8ビットカウンタ
            MOVWF       SHIFT                 ;SHIFT=8 
            CLRF           DIGIT12              ;BCDデータクリア
            CLRF           DIGIT34
LOOP
            RLF              BYTE0,F             ;shift  BYTE to DIGIT
            RLF              DIGIT12,F
            RLF              DIGIT34,F
            DECFSZ      SHIFT,F              ;end check
            GOTO          ADJST                 ;adjust to BCD
            RETURN
ADJST
            MOVF          DIGIT12,W         ;DIGIT12 adjust TO BCD
            CALL            ADJBCD
            MOVWF       DIGIT12
            MOVF           DIGIT34,W         ;DIGIT34 adjust to BCD
            CALL             ADJBCD
            MOVWF        DIGIT34
            GOTO            LOOP

;****   Each digit adjust to BCD  ****
ADJBCD
            MOVWF         WORK1               ;save
            MOVLW          3                          ;W+3
            ADDWF          WORK1,W
            MOVWF          TEMP
            BTFSC            TEMP,3               ;Test W+3>7
            MOVWF          WORK1               ;>7 then W+3 else W
            MOVLW           030h                    ;W+30
             ADDWF          WORK1,W
            MOVWF          TEMP    
            BTFSC            TEMP,7               ;Test W+30>7*
            MOVWF          WORK1               ;>70 then W+30 else W
            MOVF              WORK1,W
            RETURN
                            
LOOP250ms
              MOVLW              0FAh      ;0FAh=250
              MOVWF              CNT250ms
LOOP2
              CALL     LOOP1ms
              DECFSZ              CNT250ms
              GOTO   LOOP2
              RETURN             
LOOP1ms
              MOVLW              0F9h      ;0F9h=249
              MOVWF              CNT1ms
LOOP1
              NOP
              DECFSZ              CNT1ms,F
              GOTO   LOOP1
              RETURN             

              END
------------------------------------------------------------------

ブレッドボードです。


 PIC16F1827から送信された文字が、TeraTermに表示されました。
 数値は、0から255ですが、ゼロ消しの処理をしていませんので、0が表示されます。



MPL AB アセンブラ PIC16F1827 LED点滅

2024-11-12 20:30:18 | MPLAB アセンブラ
 PICの品種を8bitPICの定番的存在のPIC16F1827に変えて、アセンブラの勉強を進めていきます。
 環境は、MPLAB IDE v9.82, MPASM v5.51, PICKit3と同じです。

 PIC16F1シリーズは、PIC16Fシリーズに比べ、機能が大幅に拡大され、強化されています。

 PIC16F1827のスペックは
 Program Memory       4K word
 SRAM       384 byte
 EEPROM     256byte
 I/O        16
 ADC(12bit)      12
 CapSense     12
 Comperator      2
 Timer(8/16bit)    4/1
 EUSART      1
 MSSP        2
 ECCP(Full Bridge)   1
 ECCP(Half Bridge)  1
 CCP         2
 となり、SRLatch機能が加わりました。
 クロックは、31KHzから32MHzと広範囲で動作します。

 まず、最初に恒例のLチカ(LED点滅)をやってみましょう。

 回路図です。ICSPでRB3に接続したLEDを点滅させてみます。

 

 プログラムです。クロックは、内蔵の4MHzとしました。
 PIC16F1827のCONFIGレジスタは、CONFIG1とCONFIG2があり、それぞれ設定します。
 SFRのバンクは拡大されていますので、BANKSELでで指定します。
 出力はoutput latchのLATxレジスタにセットします。

----------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PIC16F1827 LED BLINK
; 2024.11.12
; JH7UBC Keiji Hata
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

              LIST      P=PIC16F1827
              INCLUDE           P16F1827.INC
              
              __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
     __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF

              CBLOCK             020h
              CNT1ms
              CNT250ms
              ENDC

SETUP
              BANKSEL           OSCCON
              MOVLW              b'01101000'         ;PLLなし、4MHz,Fosc
              MOVWF              OSCCON
              BANKSEL           ANSELA
              CLRF     ANSELA                            ;AN0-AN4使用しない
              CLRF     ANSELB                            ;AN5-AN11使用しない
              BANKSEL           TRISA
              CLRF     TRISA   ;PORTAは全て出力(RA5は入力)
              CLRF     TRISB   ;PORTBは全て出力
              BANKSEL           LATA
              CLRF     LATA    ;PORTAクリア
              CLRF     LATB    ;PORTBクリア
              
MAIN
              BANKSEL           LATB
              BSF                      LATB,3
              CALL     LOOP250ms
              CALL     LOOP250ms
              BCF                     LATB,3
              CALL     LOOP250ms
              CALL     LOOP250ms
              GOTO   MAIN

LOOP250ms
              MOVLW              0FAh      ;0FAh=250
              MOVWF              CNT250ms
LOOP2
              CALL     LOOP1ms
              DECFSZ              CNT250ms
              GOTO   LOOP2
              RETURN             
              
LOOP1ms
              MOVLW              0F9h      ;0F9h=249
              MOVWF              CNT1ms
LOOP1
              NOP
              DECFSZ              CNT1ms,F
              GOTO   LOOP1
              RETURN
             
              END
----------------------------------------------------

 ブレッドボードです。


 アセンブルの後、PICKit3でプログラムをPICに書き込みましたが、なかなかPICの新種を確認しませんでした。USBを何度か抜き差ししてようやく認識しました。MPLABとPICKit3は、何とも相性が悪いです。

 参考までに、MPLAB X + XC8 + MCCでプログラミングするとMCCで各種設定をしますので、ソースリストが次のように、非常に簡単になります。
--------------------------------------------------------
#include "mcc_generated_files/system/system.h"

int main(void)
{
     SYSTEM_Initialize();

    while(1)
    {
         LATB3 = 1;
     __delay_ms(500);
         LATB3 = 0;
     __delay_ms(500);
     }    
}
--------------------------------------------------------

 各種設定が、ブラックボックスになってしまうのですが、プログラム開発はアセンブラとは比較にならないほど速くなりますね。

 ただ、アセンブラでのプログラミングは、クイズを解くような面白さがあります。マイコン遊びのじいさんには、良い頭の体操です。(笑)

11月13日追記
 推測なのですが、MPLAB IDEには、PIC16F1827用のファームウェアがなかったのかも知れません。MPLAB X IDEでは、すんなり書き込みができました。その時にファームウェアがダウンロードされ、その後、MPLABで書き込みをしたらPIC16F1827を認識して、書き込みができのではないかと思いました。

MPLABアセンブラ PIC16F648A 7セグメントLED表示テスト

2024-11-10 18:47:43 | MPLAB アセンブラ
 MPLAB IDE v8.92 MPASM v5.51 PICKit3の環境で、PIC16F648Aで7セグメントLEDの表示テストをやってみます。

 PICが開発された時代、表示器の主流はLEDでした。特に数字を表示するには7セグメントが用いられました。(PIC16F648AにはI2C機能は搭載されていません)

 今回は、カソードコモンの3桁7セグメントLEDをを使い、ダイナミック点灯表示します。

 回路図です。a~gセグメントは、RB0~RB6に接続します。カソード1Y~3YはRA0~RA2に接続します。今回DPは接続していません。カソードをON/OFFするのは、デジタルトランジスタDTC114です。電流制限抵抗は、1KΩと少し大きくして輝度を抑えています。


 プログラムです。数値020h=128を表示します。ダイナミック点灯の間隔は、ちらつきが目立たない程度で5ms間隔としました。
 クロックは内蔵の4MHzです。
----------------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PIC16F648A 7seg LED TEST
; 2024.11.10
; JH7UBC Keiji Hata
;;;;;;;;;;;;;;;;;;;;;;;;;;;;

              LIST      P=PIC16F648A
              INCLUDE           P16F648A.INC

              __CONFIG _INTOSC_OSC_NOCLKOUT & _CP_OFF & _CPD_OFF & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _MCLRE_OFF
              ERRORLEVEL    -302
              
;レジスタ
              CBLOCK             020h
              CNT_1ms
              CNT_5ms
              SHIFT
              BYTE0
              DIGIT12
              DIGIT34
              WORK1
              TEMP
              ENDC

;入出力設定           
              BANKSEL           TRISA
              CLRF     TRISA                 ;PORTAはすべて出力、ただし、RA5は入力
              CLRF     TRISB                 ;PORTBはすべて出力
              BANKSEL           CMCON
              MOVLW              b'00000111'
              MOVWF              CMCON                            ;コンパレータOFF
              
;データセットとBCD変換
              MOVLW              080h
              MOVWF              BYTE0
              CALL     CONV_BCD

;データ表示          
MAIN
              BANKSEL           PORTB
              MOVFW              DIGIT34
              ANDLW 0Fh
              CALL     BCD2LED
              MOVWF              PORTB
              MOVLW              b'00000001'
              MOVWF              PORTA
              CALL     LOOP5mS
              MOVFW              DIGIT12
              MOVWF              WORK1
              MOVWF              TEMP
              SWAPF  TEMP,W
              ANDLW 0Fh
              CALL     BCD2LED
              MOVWF              PORTB
              MOVLW              b'00000010'
              MOVWF              PORTA
              CALL     LOOP5mS
              MOVFW              WORK1
              ANDLW 0Fh
              CALL     BCD2LED
              MOVWF              PORTB
              MOVLW              b'00000100'
              MOVWF              PORTA
              CALL     LOOP5mS           
              GOTO   MAIN    
              
;5ms待つルーチン
LOOP5mS
              MOVLW              05h                      ;05h=5
              MOVWF              CNT_5ms
LOOP2
              CALL     LOOP1mS
              DECFSZ              CNT_5ms
              GOTO   LOOP2
              RETURN

;1ms待つルーチン
LOOP1mS
              MOVLW              0F9h                    ;0F9h=249
              MOVWF              CNT_1ms
LOOP1
              NOP
              DECFSZ              CNT_1ms,F
              GOTO   LOOP1
              RETURN             

;--------------------------------------------
; バイナリからBCDへの変換
;--------------------------------------------
CONV_BCD
              BCF                     STATUS,C          ;キャリーをクリア
              MOVLW               08h                     ;8ビットカウンタ
              MOVWF               SHIFT                 ;SHIFT=8 
              CLRF                   DIGIT12              ;BCDデータクリア
              CLRF                   DIGIT34
LOOP
              RLF                     BYTE0,F              ;shift  BYTE to DIGIT
              RLF                     DIGIT12,F
              RLF                     DIGIT34,F
              DECFSZ              SHIFT,F              ;end check
              GOTO                 ADJST                 ;adjust to BCD
              RETURN
ADJST
              MOVF                 DIGIT12,W         ;DIGIT12 adjust TO BCD
              CALL                   ADJBCD
              MOVWF              DIGIT12
              MOVF                 DIGIT34,W         ;DIGIT34 adjust to BCD
              CALL                   ADJBCD
              MOVWF              DIGIT34
              GOTO                 LOOP

;****   Each digit adjust to BCD  ****
ADJBCD
               MOVWF             WORK1               ;save
               MOVLW              3                          ;W+3
               ADDWF              WORK1,W
               MOVWF             TEMP
               BTFSC               TEMP,3               ;Test W+3>7
               MOVWF             WORK1               ;>7 then W+3 else W
               MOVLW             030h                    ;W+30
                ADDWF              WORK1,W
                MOVWF             TEMP    
               BTFSC                 TEMP,7               ;Test W+30>7*
               MOVWF               WORK1               ;>70 then W+30 else W
               MOVF                 WORK1,W
                RETURN
                            
BCD2LED
              ADDWF PCL,F

              RETLW 03Fh      ;0
              RETLW 006h      ;1
              RETLW 05Bh      ;2
              RETLW 04Fh      ;3
              RETLW 066h      ;4
              RETLW 06Dh     ;5
              RETLW 07Dh     ;6
              RETLW 007h      ;7
              RETLW 07Fh      ;8
              RETLW 06Fh      ;9
              RETLW 040h      ;a
              RETLW 040h      ;b
              RETLW 040h      ;c
              RETLW 040h      ;d
              RETLW 040h      ;e
              RETLW 040h      ;f

              END

----------------------------------------------------------

 データの数値はバイナリでBYTE0に保存します。
 このデータをBCDに変換してDIGIT12,DIGIT34に格納します。
 DIGIT12の下位4ビット、DIGIT34の上位4ビット、DIGIT34の下位4ビットの順に表示を繰り返します。
 数値データに対応したLED用のデータ取得は、BCD2LEDルーチンです。 
 PICでは、配列データから任意のデータを取得するには、このサブルーチンのようにWレジスタにデータをセットしてプログラムカウンタにWレジスタの値を加えたアドレスのデータをWレジスタにセットしてリターンするという方法がとられます。 

 ブレッドボードです。データ080h=128が表示されました。