12 LED Wheel
;
;PIC12F629
;*************************************
list p=12f629
radix dec
include "p12f629.inc"
;__CONFIG
;_MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT ;Internal osc.
__config b'0000000111010100'
;*********General Purpose Registers***************
cblock 20h
key_flag
key_delay_time
add1
add2
wait_flag
buzz_flag
buzz_time_count
time_count1
time_count2
random_data
random_data_buff
random_stop_flag
out_time_data_buff
out_data_buff
run_count
run_count_1
led_on_count
time_1ms_data_reg1
delay_1ms_flag
temp1
temp2
endc
;***********I/O FUNCTION SET ****************
#define SET_SW GPIO,03
#define BUZZ GPIO,02
;*************TIME DATA SET ******************
#define BUZZ_TIME_DATA .5 ;determines shortness of the beep
#define KEY_LONG_PAUSE_TIME .20
#define key_delay_time_DATA .39 ;no difference when changed
;*********** PROGRAM START *************
ORG 000
goto MAIN
;****************************************************
IO_directing
movf add1,0
addwf PCL,1
NOP
retlw B'00111000' ;LED1
retlw B'00111000' ;LED2
retlw B'00101010' ;LED3
retlw B'00101010' ;LED4
retlw B'00011010' ;LED5
retlw B'00011010' ;LED6
retlw B'00101001' ;LED7
retlw B'00101001' ;LED8
retlw B'00001011' ;LED9
retlw B'00001011' ;LED10
retlw B'00011001' ;LED11
retlw B'00011001' ;LED12
LED_OUT_DATA
movf add1,0
addwf PCL,1
NOP
retlw B'00000110' ;LED1 ON
retlw B'00000101' ;LED2 ON
retlw B'00010100' ;LED3 ON
retlw B'00000101' ;LED4 ON
retlw B'00100100' ;LED5 ON
retlw B'00000101' ;LED6 ON
retlw B'00010100' ;LED7 ON
retlw B'00000110' ;LED8 ON
retlw B'00100100' ;LED9 ON
retlw B'00010100' ;LED10 ON
retlw B'00100100' ;LED11 ON
retlw B'00000110' ;LED12 ON
LED_ON_TIME_DATA
;these values increase the LED ON-time and make the
"wheel" slower and slower. However the beep is the
same length.
movf add2,0
addwf PCL,1
NOP
dt .6,.6,.6,.6,.6,.6,.6,.6,.6,.6,.6,.6
dt .7,.7,.7,.7,.7,.7,.7,.7,.7,.7,.7,.7
dt .8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8
dt .10,.10,.10,.10,.10,.10,.10,.10,.10,.10,.10,.10
dt .11,.11,.12,.12,.12,.13,.13,.13,.14,.14,.15,.16
dt .17,.19,.21,.23,.25,.27,.29,.30,.31,.32,.33,.34
;*********************************************
MAIN
NOP
movlw B'00111111' ;make all pins input
tris GPIO
clrf GPIO ;make all pins LOW One LED will illuminate
clrf key_flag
clrf add1
clrf add2
movlw .12
movwf add1
movwf random_data
movwf led_on_count
;goto KEYSCAN
bsf wait_flag,0
bsf random_stop_flag,0
bsf buzz_flag,0
bsf buzz_flag,1
bsf delay_1ms_flag,0
;**********KEYSCAN*********************
KEYSCAN
btfss key_flag,0
goto K1
btfss SET_SW ;skip if button not pressed
goto $+3
clrf key_flag
goto OUTPUT1
btfsc key_flag,3
goto OUTPUT1
movf add2,0
xorlw KEY_LONG_PAUSE_TIME
btfss STATUS,Z
goto OUTPUT1
clrf add2
bsf key_flag,3
goto OUTPUT1 ;
K1 btfsc SET_SW ;skip if button pressed
goto OUTPUT1
btfsc key_flag,1
goto $+4
bsf key_flag,1
movlw key_delay_time_DATA
movwf key_delay_time
K2
btfss delay_1ms_flag,0
goto OUTPUT1
decfsz key_delay_time,1
goto OUTPUT1
btfss SET_SW ;skip if button not pressed
goto K3
clrf key_flag
goto OUTPUT1
K3 bsf key_flag,0
bsf key_flag,2
clrf random_data
clrf add2
clrf run_count
clrf run_count_1
bcf random_stop_flag,0
bcf wait_flag,0
movf led_on_count,0
xorlw .12
btfss STATUS,Z
goto $+4
movlw 1
movwf led_on_count
goto $+2
incf led_on_count,1
;********LED SCAN OUTPUT**************
OUTPUT1
btfss delay_1ms_flag,0
goto tim_1
;****led stop random data generator***
incf random_data_buff,1
movf random_data_buff,0
xorlw .13
btfss STATUS,Z
goto $+3
movlw 1
movwf random_data_buff
;****LED SCAN DISPLAY*****************
movlw 0FFH
movwf GPIO
call IO_directing
tris GPIO
movlw 0FFH
movwf GPIO
call LED_OUT_DATA
movwf out_data_buff
movf add1,0
xorwf led_on_count,0
btfsc STATUS,Z
goto OUT2
btfss buzz_flag,1
goto $+4
movlw B'00000100' ;this is buzzer output pin
movwf GPIO
goto $+3
movlw B'00000000' ;turn ON buzzer
movwf GPIO
goto OUT3
OUT2 movf out_data_buff,0
movwf GPIO
btfsc buzz_flag,1
goto OUT3
bcf out_data_buff,2H
movf out_data_buff,0
movwf GPIO
OUT3 btfsc buzz_flag,0
goto $+4
bsf buzz_flag,0
movlw BUZZ_TIME_DATA
movwf buzz_time_count
btfsc random_stop_flag,0
goto $+2
goto $+.10
movf add1,0
xorwf random_data,0
btfss STATUS,Z
goto $+.6
movf led_on_count,0
xorwf random_data,0
btfss STATUS,Z
goto $+2
bsf wait_flag,0
bcf delay_1ms_flag,0
;************1ms TIMER *************************
tim_1 movlw 01h
movwf temp2
nop
decfsz temp1,f
goto $-2
decfsz temp2,f
goto $-4
bsf delay_1ms_flag,0
;****************************************************
incf run_count_1,1
incf add1,1
movlw .12 ;counts the 12 LEDs
subwf add1,0
btfsc STATUS,Z
goto $+5
btfss STATUS,C
goto $+3
movlw 1
movwf add1
movlw 8 ;speed of circling
xorwf run_count_1,0
btfss STATUS,Z
goto KEYSCAN
clrf run_count_1
;**********BUZZ OFF ***************************
btfsc buzz_flag,1
goto $+6
decfsz buzz_time_count,1
goto $+4
bsf BUZZ ;make pin2 HIGH = turn off buzzer
bsf buzz_flag,1
clrf buzz_time_count
btfsc wait_flag,0
goto KEYSCAN
incf run_count,1
call LED_ON_TIME_DATA
xorwf run_count,0
btfss STATUS,Z
goto KEYSCAN
clrf run_count
clrf buzz_flag
incf add2,1
movf led_on_count,0
xorlw .12 ;counts the 12 LEDs
btfss STATUS,Z
goto $+4
movlw 1
movwf led_on_count
goto $+2
incf led_on_count,1
btfsc random_stop_flag,0
goto KEYSCAN
btfss key_flag,2H
goto $+7
movf add2,0
xorlw .10 ;no effect
btfss STATUS,Z
goto KEYSCAN
clrf add2
goto KEYSCAN
movf add2,0
xorlw .60 ;max number of cycles cannot be .65
btfss STATUS,Z
goto $+4
movf random_data_buff,0
movwf random_data
bsf random_stop_flag,0
goto KEYSCAN
END |