PIC 34:7-Segments LED の実験@


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

inserted by FC2 system