2009年11月21日

74HC595 シフトレジスタ

PIC16F886とシフトレジスタ74HC595を使ってバイナリカウンタを作ってみました。シフトレジスタを使うことでマイコンから3本の信号線だけで無限にIOを拡張できるというのはかなり強力な武器になります。もっともシフトレジスタは数十ナノ秒単位でしか動かないので限界はありますが・・・。8PINなどのPICを使う際には重宝しそうです。

ただ、ひとつ問題があるとすれば値段が高いことです。下手をしなくてもPICの方が安かったりします。どこかで安く売ってないかなぁ。

回路図

ソースコード

LIST P=PIC16F886
INCLUDE P16F886.INC
__CONFIG _CONFIG1, _CP_OFF & _CPD_OFF & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF & _INTOSCIO

DELAY1_COUNT	EQU	20H 
SHIFT_COUNT	EQU	21H 
LED_DATA	EQU	22H
COUNT		EQU	23H


org 000h
goto INITIALIZE

INITIALIZE
	banksel	OSCCON
	movlw	B'01101100'
	movwf	OSCCON
	banksel PORTA
	clrf	PORTA
	banksel	ANSEL
	clrf	ANSEL
	banksel	TRISA
	movlw	0h
	movwf	TRISA
	banksel	OPTION_REG
	bcf	OPTION_REG,T0CS
	bcf	OPTION_REG,PSA
	banksel	PORTA		
	call	DELAY1
	call	LED_CLEAR

	clrf	LED_DATA0
	clrf	COUNT

MAIN_LOOP
	bcf	STATUS,Z
	incf	COUNT,0
	btfsc	STATUS,Z
	movlw	0h
	movwf	COUNT
	movwf	LED_DATA0


	movlw	D'8'	;8回繰り返すようにシフト数のカウント値をセット
	movwf	SHIFT_COUNT
	COUNT_8
		bcf	PORTA, 0	;LED_DATA0の0ビット目の値が1ならば、PORTA,0を1にする
		btfsc	LED_DATA0, 0	;0ならば、PORTA,0を0にする
		bsf	PORTA, 0

		bcf	STATUS,C
		rrf	LED_DATA0, 1	;右シフト

		bcf	PORTA,2		;シフトレジスタを1クロック進める
		bsf	PORTA,2
		bcf	PORTA,2
		
		decfsz	SHIFT_COUNT, 1
		goto	COUNT_8

	bsf	PORTA,1		;ラッチレジスタを1クロック進める
	bcf	PORTA,1
	bsf	PORTA,1

	call	DELAY1
	goto	MAIN_LOOP

DELAY1
	movlw	0007h
	movwf	DELAY1_COUNT
REP2
	movlw	0000h
	bcf	INTCON,T0IF
	movwf	TMR0
REP1
	btfss	INTCON,T0IF
	goto	REP1
	decfsz	DELAY1_COUNT,F
	goto	REP2
	return

LED_CLEAR
	movlw B'0000100'
	movwf PORTA
	movlw B'0000000'
	movwf PORTA	
	movlw B'0000100'
	movwf PORTA
	movlw B'0000000'
	movwf PORTA	
	movlw B'0000100'
	movwf PORTA
	movlw B'0000000'
	movwf PORTA	
	movlw B'0000100'
	movwf PORTA
	movlw B'0000000'
	movwf PORTA	
	movlw B'0000100'
	movwf PORTA
	movlw B'0000000'
	movwf PORTA	
	movlw B'0000100'
	movwf PORTA
	movlw B'0000000'
	movwf PORTA	
	movlw B'0000100'
	movwf PORTA
	movlw B'0000000'
	movwf PORTA	
	movlw B'0000100'
	movwf PORTA
	movlw B'0000000'
	movwf PORTA	
	return
END