7-Segments LEDを使うのに必要!
数字をLED 7セグメントDATAにする必要があります。方法は色々あるのですがPICでは[PCL]に加算する方法が使われています。LEDには「カソードコモンとアノードコモンがあり」どちらでもプログラムの変更で使えます。手元の物はカソードコモンの3桁表示の物です。
[0]なら[3fh]のDATAが必要で、この変換を[PCLの加算]方式で取り出します。WにDATAを入れサブルーチンをコールして変換させWに入って戻って来ます。このDATAをLEDに送ると私たちは[0]と見る事が出来ます。このように0-9の数字を変換するループが必要になります。
7セグメントDATAに変換するプログラム
BCD to 7segments LED data BCD_LEDD andlw 0x0f ;MASK addwf PCL,F retlw 0x3f ;'0' Common Cathode retlw 0x06 ;'1' retlw 0x5b ;'2' retlw 0x4f ;'3' retlw 0x66 ;'4' retlw 0x6d ;'5' retlw 0x7d ;'6' retlw 0x07 ;'7' retlw 0x7f ;'8' retlw 0x6f ;'9'
バイナリDATAをBCDに変換する必要があります。
これはパソコンで使うDATA(バイナリ)を私たちが使っている10進数にするための物です、ここでは16bitの物を使いました(他24/32Bitにするプログラムを用意しておくと便利)。このプログラムを使うには「使っているレジスタ」を登録しておかないと作動しません。
7セグメントDATA バイナリDATAをBCDに変換 ;2007/9/28 BY M.Kikuchi ;----- 16Bit Binary to BCD ----- ; Max 65535 ;BYTE0,1 to DIGIT12,34,5 ;TEMP:TE1:TE2 BITOBCD BCF STATUS,C ;Carry reset MOVLW 010H ;16Bit siftcount MOVWF TE2 ;set CLRF DIGIT12 ;BCD data clear CLRF DIGIT34 CLRF DIGIT56 BLOOP RLF BYTE0,F ;shift BYTE to digit RLF BYTE1,F RLF DIGIT12,F RLF DIGIT34,F RLF DIGIT56,F DECFSZ TE2,F ;End ? GOTO ADJST ;BCD RETURN ;----- BCD ----- ADJST MOVF DIGIT12,W ;DIGIT12 adjust to BCD CALL ADJBCD MOVWF DIGIT12 MOVF DIGIT34,W ;DIGIT34 adjust to BCD CALL ADJBCD MOVWF DIGIT34 MOVF DIGIT56,W ;DIGIT56 adjust to BCD CALL ADJBCD MOVWF DIGIT56 GOTO BLOOP ;----- 1deg BCD tune ----- ADJBCD MOVWF TE1 ;save MOVLW 3 ;W+3 ADDWF TE1,W MOVWF TEMP BTFSC TEMP,3 ;Test W+3>7 MOVWF TE1 ;>7 then W+3 else W MOVLW 030H ;W+30 ADDWF TE1,W MOVWF TEMP BTFSC TEMP,7 ;Test W+30>7* MOVWF TE1 ;>70 then W+30 else W MOVF TE1,W RETURN ;PIC 16F88 ;2007/8/20 BY M.Kikuchi ;9/29 5]16bit data to LED data & Interrupt SW DATA=123 ;----------------------------------------- LIST P=PIC16F88 INCLUDE " P16F88.INC" __CONFIG 0x2007,0x3f50 __CONFIG 0x2008,0x3ffc ;----------------------------------------- LED0 equ 0x04 ;A4 Digit0 LED1 equ 0x06 ;A6 Digit1 LED2 equ 0x07 ;A7 Digit2 TEMP EQU 20H ;tempolary work TE1 EQU 21H ;tempolary work TE2 EQU 22H ;tempolary work ICUT equ 0x32 ;counter BACKF equ 0x33 LEDD0 equ 0x34 ;LED DATA LEDD1 equ 0x35 LEDD2 equ 0x36 BYTE0 EQU 0x37 ;Bynary data 0 BYTE1 EQU 0x38 ;Bynary data 1 DIGIT12 EQU 0x39 ;BCD1,2 digit DIGIT34 EQU 0x3a ;BCD3.4 digit DIGIT56 EQU 0x3b ;BCD5 digit ;----------------------------------------- org 0 goto begin ;------------------------------------------ org 4 ;Interrupt 3LED ;2007/9/29 movf STATUS,W movwf BACKF ;keep incf ICUT,F movf ICUT,W sublw 0x03 btfss STATUS,Z goto INT2 clrf ICUT bsf PORTA,LED1 ;off movf LEDD2,W movwf PORTB bcf PORTA,LED2 ;on goto INTEND INT2 movf ICUT,W sublw 0x02 btfss STATUS,Z ; goto INT3 bsf PORTA,LED0 ;off movf LEDD1,W movwf PORTB bcf PORTA,LED1 ;on goto INTEND INT3 bsf PORTA,LED2 ;off movf LEDD0,W movwf PORTB bcf PORTA,LED0 ;on INTEND movf BACKF,W movfw STATUS bcf PIR1,TMR2IF ;clear flag/0ch retfie ;------------------------------------------ begin call INITA clrf ICUT ;data example movlw D'123' ;Decimal data=123 movwf BYTE0 ; clrf BYTE1 call BITOBCD ;change DATA movf DIGIT34,W call BCD_LEDD movwf LEDD2 ;LED 100 swapf DIGIT12,W call BCD_LEDD movwf LEDD1 ;LED 10 movf DIGIT12,W call BCD_LEDD movwf LEDD0 ;LED 1 ;----------------------------------------- movlw 0x07 ;Post=1/1 ON Presacle=1/16 ;1Mhz/16/256=4mSec*3 movwf T2CON bsf INTCON,GIE ;Interupt on bsf INTCON,PEIE ; B2 goto $-0 ;LOOP ;----------------------------------------- ; INITIALIZING PORTA INITA BANKSEL PORTA ; select bank of PORTA CLRF PORTA ; Initialize PORTA by ; clearing output data latches BANKSEL ANSEL ; Select Bank of ANSEL MOVLW 0x00 ; Configure all pins MOVWF ANSEL ; as digital inputs(PIC16F88 DEVICES ONLY) MOVWF TRISB ; Set RB<7:0> as output MOVLW B'00101111' ;0=output 1=Input MOVWF TRISA ; Set RA<7:0> as outputs movlw 0x60 ;INTRC=4MHz movwf OSCCON ;set bsf PIE1,TMR2IE ; BANKSEL PORTB ; clrf PORTB ;off return
[Step 5]LEDに"123"の数字を出すプログラム
Timer2を使ってLED3桁を順に表示しています。数字はサンプルとして固定していますがBYTE0,1に書き込めばLEDに表示される基本プログラムです。
これに他のプログラムを追加して色々と表示をさせることが出来ます、まだここまでしか動いていないのですが、今後は「A/D変換と連動させて表示させたい」と思っています。プログラムはメインで[123]を変換してレジスタに格納し、後はループを回っているだけ。
表示は割り込みで実行している、勝手に作動しレジスタを読み出して表示する方式です。2007/OCT/1
もどる [MAIN MENU]