PIC16F84電子遊戯(8)
最終更新日:2001年1月20日
99分タイマー(1ページ)へ (2ページ)へ (3ページ)へ (4ページ)

99分タイマーの全ソースリスト公開
99分タイマーの全ソースリストです。
今まで説明した内容の集大成です。皆さんでお好みに改造してもらって結構です。
;**********************************************************************
;    Filename:	    timer.asm                                       *
;    Date:          2001/1/12                                        *
;    File Version:                                                    *
;**********************************************************************
	list      p=16F84             ; list directive to define processor
	#include <p16F84.inc>         ; processor specific variable definitions
	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;***** VARIABLE DEFINITIONS
w_temp        EQU     0x0C        ; variable used for context saving 
status_temp   EQU     0x0D        ; variable used for context saving
count_data	EQU	0x10		;1sec keisoku count ram
sec1_data	EQU	0x11		;1sec LED data ram
sec10_data	EQU	0x12		;10sec LED data ram
min1_data	EQU	0x13		;1min LED data ram
min10_data	EQU	0x14		;10min LED data ram
wait_data	EQU	0x15		;wait data ram
start_stop	EQU	0x16		;start/stop ram
					;start_stop,0  timer start/stop flg
					;start_stop,1  buzzer flg
key_data	EQU	0x17		;key data ram
					;key_data,2  start/stop key
					;key_data,3  up1 key
					;key_data,4  up10 key
					;key_data,5  up1,up10 key
key_input	EQU	0x18		;key input ram
					;key_input,2  start/stop key
					;key_input,3  up1 key
					;key_input,4  up10 key
tm0_setdata	EQU	63h		;255-156=99=63H  156*128=19.968msec
cnt_setdata	EQU	32h		;19.968*50=0.9984sec
;**********************************************************************
		ORG     0x000             ; processor reset vector
  		goto    main              ; go to beginning of program
;----------------------------------------------------------------------------------
		ORG     0x004             ; interrupt vector location
		movwf   w_temp            ; save off current W register contents
		movf	STATUS,w          ; move status register into W register
		movwf	status_temp       ; save off contents of STATUS register
		;---------------------------------	
		bcf	INTCON,T0IF
		movlw	tm0_setdata
		movwf	TMR0
		decfsz	count_data,1
		goto	next_int
time_up		movlw	cnt_setdata		
		movwf	count_data
		;--------------------------------		
		btfss	start_stop,0	;start/stop check
		goto	next_int
		call	zero_check
		btfsc	start_stop,1	;buzzer check
		goto	next_int
		movlw	01h
		subwf	sec1_data,1
		btfsc	STATUS,0
		goto	next_int
		movlw	09h
		movwf	sec1_data
		
		movlw	01h
		subwf	sec10_data,1
		btfsc	STATUS,0
		goto	next_int
		movlw	05h
		movwf	sec10_data
		movlw	01h
		subwf	min1_data,1
		btfsc	STATUS,0
		goto	next_int
		movlw	09h
		movwf	min1_data
		movlw	01h
		subwf	min10_data,1
		btfsc	STATUS,0
		goto	next_int
		movlw	09h
		movwf	min10_data
next_int
		nop
		;----------------------------------
		movf    status_temp,w     ; retrieve copy of STATUS register
		movwf	STATUS            ; restore pre-isr STATUS register contents
		swapf   w_temp,f
		swapf   w_temp,w          ; restore pre-isr W register contents
		retfie                    ; return from interrupt
;---------------------------------------------------------------------------------------
main
		call	port_set
		movlw	00h		;port initial set
		movwf	PORTA
		movlw	0f0h
		movwf	PORTB
		call	timer0_set
		movlw	00h		;start/stop <= stop
					;buzzer flg off
		movwf	start_stop
		movlw	0ffh		;key data,key input clear
		movwf	key_data
		movwf	key_input
		movlw	cnt_setdata
		movwf	count_data
		call	sec_clear
		call	min_clear
main_loop
;-------------------------------------- key scan 1
		movlw	0ffh		;key input clear
		movwf	key_input
		btfss	PORTA,2		;start/stop key check
		bcf	key_input,2	;start/stop key input ari		
		btfss	PORTA,3		;up1 key check
		bcf	key_input,3	;up1 key input ari
		btfss	PORTA,4		;up10 key check
		bcf	key_input,4	;up10 key input ari
;--------------------------------------- led7_disp
		movf	sec1_data,0
		iorlw	0f0h
		movwf	PORTB
		bcf	PORTB,4
		call	wait_1
		bsf	PORTB,4
		movf	sec10_data,0
		iorlw	0f0h
		movwf	PORTB
		bcf	PORTB,5
		call	wait_1
		bsf	PORTB,5		
		movf	min1_data,0
		iorlw	0f0h
		movwf	PORTB
		bcf	PORTB,6
		call	wait_1
		bsf	PORTB,6
		movf	min10_data,0
		iorlw	0f0h
		movwf	PORTB
		bcf	PORTB,7
		call	wait_1
		bsf	PORTB,7
;------------------------------------- key scan 2
stsp_check
		btfss	PORTA,2		;start/stop key check
		goto	stsp_next
		bsf	key_data,2	;start/stop key off
		goto	up1_check
stsp_next
		btfsc	key_input,2	;start/stop key input check
		goto	up1_check
		btfss	key_data,2	;start/stop key on check
		goto	up1_check
		bcf	key_data,2	;start/stop key on
		btfss	start_stop,0	;start/stop check
		goto	stsp_next_2
		bcf	start_stop,0	;start/stop <=stop
		nop
		bcf	start_stop,1	;buzzer flg off
		goto	up1_check
stsp_next_2
		bsf	start_stop,0	;start/stop <=start		
;-------------------------------------
up1_check
		btfss	PORTA,3		;up1 key check
		goto	up1_next
		bsf	key_data,3	;up1 key off
		goto	up10_check
up1_next
		btfsc	key_input,3	;up1 key input check
		goto	up10_check
		btfss	key_data,3	;up1 key on check
		goto	up10_check
		bcf	key_data,3	;up1 key on
		btfsc	start_stop,0	;start/stop check
		goto	up10_check
		call	sec_clear	;min1_data up
		incf	min1_data,1
		movlw	0ah
		subwf	min1_data,0
		btfss	STATUS,0
		goto	up10_check
		movlw	00h
		movwf	min1_data
;--------------------------------------
up10_check
		btfss	PORTA,4		;up10 key check
		goto	up10_next
		bsf	key_data,4	;up10 key off
		goto	up110_check
up10_next
		btfsc	key_input,4	;up10 key input check
		goto	up110_check
		btfss	key_data,4	;up10 key on check
		goto	up110_check
		bcf	key_data,4	;up10 key on
		btfsc	start_stop,0	;start/stop check
		goto	up110_check
		call	sec_clear	;min10_data up
		incf	min10_data,1
		movlw	0ah
		subwf	min10_data,0
		btfss	STATUS,0
		goto	up110_check
		movlw	00h
		movwf	min10_data
;---------------------------------------
up110_check
		btfsc	key_data,3	;up1 key on check
		goto	up110_next
		btfsc	key_data,4	;up10 key on check
		goto	up110_next
		btfss	key_data,5	;up1up10 key on check
		goto	next_key
		bcf	key_data,5	;up1up10 key on
		btfsc	start_stop,0	;start/stop check
		goto	next_key
		call	min_clear
		goto	next_key
up110_next
		bsf	key_data,5	;up1up10 key off
;---------------------------------------
next_key
;---------------------------------------
buzzer
		btfss	start_stop,1	;buzzer flg check
		goto	buzzer_2
		bsf	PORTA,0		;buzzer on
		goto	buzzer_3
buzzer_2	
		bcf	PORTA,0
buzzer_3
;---------------------------------------
		goto	main_loop
;-------------------------------------------------------------------------------
wait_1		
		movlw	0ffh
		movwf	wait_data
wait_2
		decfsz	wait_data,1
		goto	wait_2
		return
;-------------------------------------------------------------------------------
port_set				;RA0,RA1(OUT)
					;RA2,RA3,RA4(IN)
					;RB0,RB1,RB2,RB3,RB4,RB5,RB6,RB7(OUT)
		bsf	STATUS,RP0
		clrf	TRISA
		bsf	TRISA,3
		nop
		bsf	TRISA,4
		nop
		bsf	TRISA,2	
		clrf	TRISB
		bcf	STATUS,RP0
		return
;-------------------------------------------------------------------------------
timer0_set
		bsf	STATUS,RP0
		movlw	086h		;(1)PORTB NOT PULLUP
					;(0)INTEDG
					;(0)TOCS
					;(0)TOSE
					;(0)PSA
					;(110)1/128
		movwf	OPTION_REG
		bcf	STATUS,RP0
		
		movlw	tm0_setdata
		movwf	TMR0
		bsf	INTCON,T0IE
		bsf	INTCON,GIE
		return
;------------------------------------------------------------------------------
sec_clear
		movlw	00h
		movwf	sec1_data
		movwf	sec10_data
		return
;------------------------------------------------------------------------------
min_clear
		movlw	00h
		movwf	min1_data
		movwf	min10_data
		return
;------------------------------------------------------------------------------
zero_check
		movf	sec1_data,1
		btfss	STATUS,2	;Z check
		return
		movf	sec10_data,1
		btfss	STATUS,2	;Z check
		return
		movf	min1_data,1
		btfss	STATUS,2	;Z check
		return
		movf	min10_data,1
		btfss	STATUS,2	;Z check
		return
		btfss	start_stop,0	;start/stop check
		return
		bsf	start_stop,1	;buzzer flg on
		return
;-----------------------------------------------------------------------------
		END                     ; directive 'end of program'
99分タイマーの全HEXコード
HEXコードです。メモ帳などのテキストエディタにコピー&ペーストしてファイルすればPICに書き込めるデータに出来ます。
:020000003128A5
:080008008C0003088D000B11B0
:1000100063308100900B2B2832309000161C2B2867
:10002000C82096182B280130910203182B2809307C
:1000300091000130920203182B2805309200013004
:10004000930203182B2809309300013094020318FF
:100050002B280930940000000D0883008C0E0C0E34
:100060000900AD2000308500F0308600B720003058
:100070009600FF309700980032309000C020C420D6
:10008000FF309800051D1811851D9811051E1812C6
:100090001108F03886000612A82006161208F0385B
:1000A00086008612A82086161308F03886000613EC
:1000B000A82006171408F03886008613A820861793
:1000C000051D64281715702818197028171D702829
:1000D0001711161C6F2816100000961070281614A1
:1000E000851D74289715832898198328971D8328C0
:1000F000971116188328C020930A0A301302031C94
:10010000832800309300051E872817169628181A92
:100110009628171E9628171216189628C020940A9B
:100120000A301402031C9628003094009719A12865
:10013000171AA128971EA22897121618A228C420C1
:10014000A2289716961CA6280514A7280510402853
:10015000FF309500950BAA280800831685018515A8
:10016000000005160000051586018312080083169D
:10017000863081008312633081008B168B17080054
:1001800000309100920008000030930094000800B5
:100190009108031D08009208031D08009308031D21
:1001A00008009408031D0800161C08009614080097
:02400E00F13F80
:00000001FF
(timer.hex)
99分タイマーの各処理概要
ソースリストの赤の部分が割り込み処理、青の部分がメイン処理です。
後半の黒の部分が各種サブルーチンです。
割り込み処理
STATUSレジスタ退避
1秒カウンタ処理
スタート・ストップ処理
タイムアップ処理
1秒減算処理
STATUSレジスタ復帰
メイン処理
初期設定
キースキャン前処理
7セグメント表示処理
スタート・ストップキー処理
+1キー処理

+10キー処理

+1・+10キー同時処理
ブザー処理
99分タイマーの操作方法
まず電源SWを入れると「00:00」と表示します。
「+1」のキーを押すと1分ごとに数字がアップします。
「+10」キーを押すと10分ごとに数字がアップします。
「+1」と「+10」キーを駆使しながら希望のタイマー値に合わせましょう。
「+1」と「+10」を同時に押せば「00:00」に戻すことが出来ます。
設定後「スタート・ストップ」キーを押せばタイマースタートです。
減算カウント中は「+1」「+10」のキーは効きません。
タイムアップすればアラーム音が鳴ります。
アラーム音は「スタート・ストップ」キーで止めることが出来ます。
以上で「99分タイマー」は大完成です。
ソフトさえ変えれば、どんな仕様にも好みに変化させることが出来ます。
皆さんもトライしてみてください。この辺がハードだけで作る電子工作より良いところですね。
さあ、次の製作へトライ!!
今後も「PIC16F84電子遊戯」をよろしくお願いいたします。

不明点などあればメールお願いいたします。nonchansoft@nifty.com

Copyright(c)2000-2001 nonchansoft