WAITルーチン
DELAY ;CPU time = 3 * delay_CNT + 1
movlw 0x14 ;delay_CNT = 20
movwf delay_CNT
LOOP
decfsz delay_CNT,f
goto LOOP ;delay = 61
;************************************************************
;* PIC10F200によるLED制御器
;*
;************************************************************
;
LIST
"P10F200.INC"
__CONFIG 0x08
;データ定義
R_set equ 0x10
G_set equ 0x11
B_set equ 0x12
CNT equ 0x13
R_CNT equ 0x14
Receive equ 0x15
delay_CNT equ 0x16
delay_CNT2 equ 0x17
R_LED equ 0x0
G_LED equ 0x1
B_LED equ 0x2
RXD equ 0x3
;プログラム開始
org 0
;初期設定
movwf OSCCAL
movlw b'11010000' ;T0CS = 0, PSA = 0
option
movlw b'00001000' ;GP0,1,2 OUTPUT, GP3 INPUT
tris GPIO
clrf CNT ;clear counter
clrf GPIO
clrf R_CNT
clrf Receive
movlw 0xaf ;init RGB
movwf R_set
movlw 0x7f ;init RGB
movwf G_set
movlw 0x2f ;init RGB
movwf B_set
MAIN
movf R_set,w
subwf CNT,w ;CNT - R_set < 0 carry = 0 (CNT < R_set)
btfsc STATUS,C ;if C = 1 ,skip next command
bsf GPIO,R_LED
movf G_set,w
subwf CNT,w
btfsc STATUS,C
bsf GPIO,G_LED
movf B_set,w
subwf CNT,w
btfsc STATUS,C
bsf GPIO,B_LED ;12 clock
Command_receive
;goto COUNT_OVF
btfss Receive,0 ;Command Receive = true ?
goto RXD_HI ;if Receive = 0 Check RXD
movlw 0x07 ;R_CNT > 7 ?
subwf R_CNT,w
btfss STATUS,C
goto R_set_Receive
movlw 0x0e ;R_CNT > 15 ?
subwf R_CNT,w
btfss STATUS,C
goto G_set_Receive
movlw 0x17 ;R_CNT > 23 ?
subwf R_CNT,w
btfss STATUS,C
goto B_set_Receive
clrf R_CNT ;other
bcf Receive,0
nop
nop
nop
nop
nop
nop ;nop * 6
COUNT_OVF
incfsz CNT,f ;CNT +=1, if CNT = 0 (overflow) then R,G,B = OFF
goto DELAY
RGB_OFF
clrf GPIO
DELAY ;CPU time = 3 * delay_CNT + 1
movlw 0x14 ;delay_CNT = 20
movwf delay_CNT
LOOP
decfsz delay_CNT,f
goto LOOP ;delay = 61
goto MAIN ;total CPU time = 100 clock
R_set_Receive
bcf STATUS,C ;Carry = 0
btfsc GPIO,RXD ;if RXD = 1 then Carry = 1
bsf STATUS,C
rrf R_set,f ;bit0 = Carry
;nop
incf R_CNT,f
nop
nop
nop
nop
nop
nop
nop
nop ;nop * 8
goto COUNT_OVF
G_set_Receive
bcf STATUS,C
btfsc GPIO,RXD
bsf STATUS,C
rrf G_set,1
;nop
incf R_CNT,1
nop
nop
nop
nop ;nop * 4
goto COUNT_OVF
B_set_Receive
bcf STATUS,C
btfsc GPIO,RXD
bsf STATUS,C
rrf B_set,1
;nop
incf R_CNT,1
goto COUNT_OVF
RXD_HI
btfsc GPIO,RXD ;RXD = High?
bsf Receive,0 ;if RXD = 1, Receive = 1
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop ;nop * 15
goto COUNT_OVF
org 0xff
movlw 0x32
END
最終更新:2009年07月25日 21:05