📄 led1.asm
字号:
;************************************
;ster program
;crystal:3.58MHz
chip sn8p1604a
//{{SONIX_CODE_OPTION
.Code_Option High_Clk 4M_X'tal
.Code_Option High_Clk/2 Disable
.Code_Option Security Enable
.Code_Option Int_16K_RC Always_ON
.Code_Option Rst_P0.3 Reset
.Code_Option Watch_Dog Enable
//}}SONIX_CODE_OPTION
flag1 equ 00h
flag2 equ 01h
flag3 equ 02h
second equ 03h
hour equ 04h
minute equ 05h
Dminute equ 06h
Dsecond equ 07h
sumbuffer equ 08h
sterbuffer equ 09h
fantime equ 0ah
fanbuffer equ 0bh
databuffer equ 0ch
bufferHH equ 0dh
keybuffer equ 0eh
counter equ 0fh
sterbuffer1 equ 10h
keybuffercopy equ 11h
tonetime equ 12h
bufferH equ 13h
bufferL equ 14h
address equ 15h
delaybuffer equ 16h
timer equ 17h
counter1 equ 18h
P2copy equ 19h
P1copy equ 1ah
keycounter equ 1bh
combuffer equ 1ch
accbuffer equ 1dh
pflagbuffer equ 1eh
Dminute_Dry equ 1fh
displaybuffer0 equ 20h
displaybuffer1 equ 21h
displaybuffer2 equ 22h
displaybuffer3 equ 23h
displaybuffer4 equ 24h
displaybuffer5 equ 25h
displaybuffer6 equ 26h
displaybuffer7 equ 27h
displaybuffer8 equ 28h
displaybuffer9 equ 29h
ybuffer equ 2ah
zbuffer equ 2bh
rbuffer equ 2ch
timer2 equ 2dh
P5copy equ 30h
flag4 equ 31h
flashtime equ 32h
keytime equ 33h
;***********
;BIT DEFINITION
;*****************
;************
DOOR EQU P0.0
DATA8 EQU P1.0
BUZZER EQU P1.1
KEY1 EQU P1.2
KEY2 EQU P1.3
COM0 EQU P1.4
COM1 EQU P1.5
COM2 EQU P1.6
COM3 EQU P1.7
DOT equ P2.2
LIGHT EQU P5.0 ;OUTPUT
STER EQU P5.1 ;OUTPUT
DRY EQU P5.2 ;OUTPUT
FAN EQU P5.3 ;OUTPUT
;**********
F_FAN EQU flag1.0
F_STER EQU flag1.1
F_DRY EQU flag1.2
F_FLASH1 equ flag1.3
TONE_ENABLE EQU flag1.4
F_NO_DOOR EQU flag1.5
F_NO_TONE equ flag1.6
F_STER90 EQU flag2.2
F_STER45 EQU flag2.3
F_DRY60 EQU flag2.1
F_DRY30 EQU flag2.0
F_ON_OFF EQU flag3.0
F_FLASH EQU flag3.1
F_LIGHT EQU flag3.2
F_KEY EQU flag3.3
F_FINISH EQU flag3.4
F_DISPLAY EQU flag3.5
F_DISPLAY1 EQU flag3.6
F_MINUTE EQU flag3.7
F_DISPLAY_FLASH equ flag4.0
F_DISPLAY_FLASH60 EQU flag4.6
F_DISPLAY_FLASH30 EQU flag4.7
F_DELAY EQU flag4.3
;*****************************************
KPOWER EQU keybuffer.6
KMINUTE EQU keybuffer.0
KLIGHT EQU keybuffer.7
KHOUR EQU keybuffer.1
KDRY60 EQU keybuffer.2
KSTER90 EQU keybuffer.4
KDRY30 EQU keybuffer.3
KSTER45 EQU keybuffer.5
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
org 0x00
jmp Start
org 0x08
jmp Interrupt
org 0x10
Interrupt:
b0bset FWDRST
b0mov accbuffer,a
b0mov a,PFLAG
b0mov pflagbuffer,a
b0bts1 FTC1IRQ
jmp Interruptend01
mov a,#131
mov TC1C,a
b0bts1 DOOR
jmp Testdoor01
Testdoor:
b0bset F_NO_DOOR
b0bclr STER
jmp Testdoor02
Testdoor01:
b0bclr F_NO_DOOR
b0bts0 F_STER
b0bset STER
Testdoor02:
b0mov a,keytime
cmprs a,#0
decms keytime
nop
Tone:
b0bts0 TONE_ENABLE
b0bset BUZZER
incms tonetime
nop
b0mov a,tonetime
sub a,#30 ;250ms
b0bts1 FC
jmp Notone
clr tonetime
b0bclr BUZZER
b0bclr TONE_ENABLE
Notone:
incms flashtime
nop
b0mov a,flashtime
sub a,#125 ;500ms
b0bts1 FC
jmp Timer00
clr flashtime
b0bts0 F_FLASH1
jmp Flashtime01
b0bset F_FLASH1
jmp Timer00
Flashtime01:
b0bclr F_FLASH1
Timer00:
incms timer
nop
b0mov a,timer
sub a,#125 ;500ms
b0bts1 FC
jmp Keyscan
clr timer
b0bts0 F_FLASH
jmp Timer0ok_1
b0bset F_FLASH
jmp Keyscan
Timer0ok_1:
b0bclr F_FLASH
b0bts1 F_DELAY
jmp Timer0ok_1x
decms delaybuffer
jmp Timer0ok_1x
clr flag4
b0bclr F_MINUTE
Timer0ok_1x:
incms second
nop
b0mov a,second
sub a,#60
b0bts1 FC
jmp Timer0ok_2
clr second
incms minute
nop
b0mov a,minute
sub a,#60
b0bts1 FC
jmp Timer0ok_2
clr minute
incms hour
nop
b0mov a,hour
sub a,#12
b0bts1 FC
jmp Timer0ok_2
clr hour
Timer0ok_2:
b0bts1 F_ON_OFF
jmp Keyscan
b0bts1 F_NO_DOOR
jmp Timer0ok_2a
b0bts0 F_STER
jmp Keyscan
Timer0ok_2a:
b0mov a,Dsecond
cmprs a,#0x00
jmp Timer0ok_2x
jmp Timer0ok_4
Timer0ok_2x:
decms Dsecond
nop
jmp Keyscan
Timer0ok_4:
b0mov a,fantime
cmprs a,#0xff
incms fantime
nop
mov a,#59
b0mov Dsecond,a
decms Dminute
nop
call AdjDisplay
b0mov a,Dminute
cmprs a,#0xff
jmp Timer0ok_7
Timer0ok_5:
b0bts1 F_STER
jmp Timer0ok_6
b0mov a,Dminute_Dry
b0mov Dminute,a
clr Dsecond
clr flag2
clr fantime
b0bset F_DRY60
call Clrstatus01
b0bset F_DRY
b0bset DRY
jmp Keyscan
Timer0ok_6:
b0bset F_FINISH
jmp Interruptend
Timer0ok_7:
b0bts0 F_STER
jmp Keyscan
b0mov a,fantime
sub a,#20
b0bts1 FC
jmp Timer0ok_8
b0bset FAN
b0bset F_FAN
Timer0ok_8:
b0mov a,Dminute
sub a,#30
b0bts0 FC
jmp Keyscan
clr flag2
b0bset F_DRY30
b0bset FAN
b0bset F_FAN
;\\\\\\\\\\\\
Keyscan:
b0bclr COM0
b0bclr COM1
b0bclr COM2
b0bclr COM3
b0bclr DATA8
incms combuffer
nop
b0mov a,combuffer
cmprs a,#0x01
jmp $+2
jmp C2
cmprs a,#0x02
jmp $+2
jmp C3
cmprs a,#0x03
jmp $+2
jmp C4
C1:
clr combuffer
call Adjhour
b0mov a,bufferHH
cmprs a,#0x00
jmp C1_1
b0mov a,bufferH
cmprs a,#00
jmp $+2
jmp C1_1
b0mov Y,#Segtable$M
b0mov Z,#Segtable$L
; b0mov a,bufferH
add Z,a
movc
jmp C1_2
C1_1:
mov a,#0x00
C1_2:
b0mov P2,a
b0bset COM0
b0bts1 F_ON_OFF
jmp C1_3
b0bts0 F_STER90
b0bset DATA8
C1_3:
b0bclr KMINUTE
b0bclr KSTER90
b0bts1 KEY1
b0bset KSTER90
b0bts1 KEY2
b0bset KMINUTE
jmp Interruptend
C2:
call Adjhour
b0mov a,bufferHH
cmprs a,#0x00
jmp C2_1
b0mov a,bufferL
jmp C2_2
C2_1:
b0mov a,bufferHH
C2_2:
b0mov Y,#Segtable$M
b0mov Z,#Segtable$L
add Z,a
movc
b0mov P2,a
b0bset COM1
b0bts0 F_ON_OFF
b0bts0 F_DELAY
b0bts0 F_FLASH
b0bset DOT
b0mov a,bufferHH
cmprs a,#00
b0bclr DOT
b0bts1 F_ON_OFF
jmp C2_3
b0bts0 F_STER45
b0bset DATA8
C2_3:
b0bts1 F_DISPLAY_FLASH
jmp $+7
b0bset DOT
b0bts0 F_FLASH1
b0bset DOT
b0mov a,bufferHH
cmprs a,#00
b0bclr DOT
b0bclr KPOWER
b0bclr KHOUR
b0bts1 KEY1
b0bset KPOWER
b0bts1 KEY2
b0bset KHOUR
jmp Interruptend
C3:
call Adjhour
b0mov a,bufferHH
cmprs a,#0x00
jmp C3_1
call Adjminute
C3_1:
b0mov a,bufferH
b0mov Y,#Segtable$M
b0mov Z,#Segtable$L
add Z,a
movc
b0mov P2,a
b0bset COM2
b0bts1 F_ON_OFF
jmp C3_3
b0bts0 F_DRY60
b0bset DATA8
C3_3:
b0bclr KDRY30
b0bclr KLIGHT
b0bts1 KEY1
b0bset KDry30
b0bts1 KEY2
b0bset KLIGHT
jmp Interruptend
C4:
call Adjhour
b0mov a,bufferHH
cmprs a,#0x00
jmp C4_1
call Adjminute
C4_1:
b0mov a,bufferL
b0mov Y,#Segtable$M
b0mov Z,#Segtable$L
add Z,a
movc
b0mov P2,a
b0bset COM3
b0bts1 F_ON_OFF
jmp C4_3
b0bts0 F_DRY30
b0bset DATA8
C4_3:
b0bclr KDRY60
b0bclr KSTER45
b0bts1 KEY1
b0bset KSTER45
b0bts1 KEY2
b0bset KDRY60
Readkeyend:
clr keycounter
b0mov a,keybuffer
b0mov databuffer,a
Readkeyend01:
mov a,#0x08
b0mov counter,a
Readkeyend02:
rrcm databuffer
b0bts0 FC
incms keycounter
nop
decms counter
jmp Readkeyend02
b0mov a,keycounter
cmprs a,#0x01
jmp Readkeyend06
b0mov a,keybuffer
cmprs a,keybuffercopy
jmp Readkeyend04
b0bts0 KMINUTE
jmp Readkeyend03
b0bts1 KHOUR
jmp Readkeyend06
Readkeyend03:
b0mov a,keytime
cmprs a,#0
jmp Interruptend
b0bset F_NO_TONE
mov a,#40
jmp Readkeyend05
Readkeyend04:
b0mov a,keybuffer
b0mov keybuffercopy,a
b0bclr F_NO_TONE
mov a,#100
Readkeyend05:
b0mov keytime,a
b0bset F_KEY
jmp Interruptend
Readkeyend06:
b0mov a,keybuffer
b0mov keybuffercopy,a
mov a,#100
b0mov keytime,a
b0bclr F_KEY
b0bclr F_NO_TONE
Interruptend:
b0bts1 F_DISPLAY_FLASH
jmp $+3
b0bts1 F_FLASH1
clr P2
Interruptend01:
clr INTRQ
b0xch a,pflagbuffer
b0xch a,PFLAG
b0xch a,accbuffer
reti
;*******************
Adjhour:
b0bts0 F_DISPLAY_FLASH
jmp Adjhour04
b0bts0 F_DELAY
jmp Adjhour01
b0bts0 F_STER
jmp Adjhour03
b0bts0 F_DRY
jmp Adjhour03
Adjhour01:
b0mov a,hour
cmprs a,#0x00
jmp Adjhour02
mov a,#12
jmp Tobcd
Adjhour02:
b0mov a,hour
jmp Tobcd
Adjhour03:
b0mov a,Dminute
jmp Tobcd
Adjhour04:
b0mov a,Dminute_Dry
jmp Tobcd
;**************
Adjminute:
b0bts0 F_DISPLAY_FLASH
jmp Adjminute03
b0bts0 F_DELAY
jmp Adjminute01
b0bts0 F_STER
jmp Adjminute02
b0bts0 F_DRY
jmp Adjminute02
Adjminute01:
b0mov a,minute
jmp Tobcd
Adjminute02:
b0mov a,Dsecond
jmp Tobcd
Adjminute03:
mov a,#0
;\\\\\\\\\\\\\\\\\
Tobcd:
b0mov bufferL,a
clr bufferHH
clr bufferH
Tobcd01:
b0mov a,bufferL
sub a,#10
b0bts1 FC
jmp Tobcd02
b0mov bufferL,a
incms bufferH
jmp Tobcd01
Tobcd02:
add a,#10
b0mov bufferL,a
Tobcd03:
b0mov a,bufferH
sub a,#10
b0bts1 FC
jmp Tobcd04
b0mov bufferH,a
incms bufferHH
jmp Tobcd03
Tobcd04:
add a,#10
b0mov bufferH,a
ret
;\\\\\\\\\\
;**********************
Clrstatus:
b0bclr F_ON_OFF
b0bclr F_FINISH
Clrstatus01:
clr flag1
clr fantime
b0bclr DRY
b0bclr STER
b0bclr FAN
ret
;\\\\\\\\
Sum:
mov a,#7
b0mov counter,a
clr Y
clr Z
b0mov a,@YZ
Verify01:
incms Z
add a,@YZ
decms counter
jmp Verify01
b0mov databuffer,a
ret
;*****************
Start:
clr OSCM
clr PFLAG
mov a,#11110011b
b0mov P1M,a
mov a,#11111111b
b0mov P2M,a
b0mov P5M,a
@SET_PUR 0x23
call Sum
mov a,databuffer
cmprs a,sumbuffer
jmp Verify03
mov a,#0x09
b0mov counter,a
clr Y
clr Z
Verify02:
b0mov a,@YZ
cmprs a,#0x00
jmp Verify04
incms Z
nop
decms counter
jmp Verify02
Verify03:
clr P1
clr P2
clr P5
Init:
clr Y
clr Z
Init01:
mov a,#0
b0mov @YZ,a
incms Z
mov a,#0x7f
cmprs a,Z
jmp Init01
b0bset TONE_ENABLE
jmp Init02
Verify04:
b0mov a,P1copy
b0mov P1,a
b0mov a,P2copy
b0mov P2,a
b0mov a,P5copy
b0mov P5,a
Init02:
mov a,#0xb0 ;1:32
b0mov TC1M,a
mov a,#131
b0mov TC1C,a
b0bset FTC1IEN
b0bset FGIE
clr INTRQ
Main:
b0bset FWDRST
call Sum
b0mov a,databuffer
b0mov sumbuffer,a
b0mov a,P1
b0mov P1copy,a
b0mov a,P2
b0mov P2copy,a
b0mov a,P5
b0mov P5copy,a
b0bts1 F_FINISH
jmp main00
call Clrstatus
jmp Keyactive01
main00:
b0bts1 F_KEY
jmp Main
b0bclr F_KEY
b0bts0 KPOWER
jmp Poweractive
b0bts0 KLIGHT
jmp Lightactive
b0bts0 KHOUR
jmp Houractive
b0bts0 KMINUTE
jmp Minuteactive
b0bts1 F_ON_OFF
jmp Main
b0bts0 KSTER90
jmp Ster90active
b0bts0 KSTER45
jmp Ster45active
b0bts0 KDRY30
jmp Dry30active
b0bts1 KDRY60
jmp Main
;\\\\\\\\\\\\\\\\\\\\\\\\\\\
Dry60active:
b0bts0 F_STER
jmp Dry60active02
Dry60active01:
clr flag2
b0bset F_DRY60
call Clrstatus01
mov a,#60
jmp Dry30active02
Dry60active02:
b0bts0 F_DISPLAY_FLASH60
jmp Dry60active04
b0bset F_DISPLAY_FLASH60
b0bclr F_DISPLAY_FLASH30
b0bset F_DISPLAY_FLASH
b0bclr F_MINUTE
b0mov a,Dminute_dry
sub a,#60
b0bts0 FC
jmp Dry60active03
mov a,#60
b0mov Dminute_dry,a
Dry60active03:
mov a,#10
b0mov delaybuffer,a
b0bset F_DELAY
jmp Keyactive01
Dry60active04:
clr flag4
b0bts1 F_MINUTE
jmp Dry60active01
b0bclr F_MINUTE
jmp Keyactive01
;\\\\\\\\\\\\\\\\\\\\\\\\\\\
;********************
Poweractive:
b0bts1 F_ON_OFF
jmp Poweractive01
call Clrstatus
clr flag4
jmp Keyactive01
Poweractive01:
b0bset F_ON_OFF
jmp Ster90active
;***********
Dry30active:
b0bts0 F_STER
jmp Dry30active03
Dry30active01:
clr flag2
b0bset F_DRY30
call Clrstatus01
mov a,#30
b0bset FAN
b0bset F_FAN
Dry30active02:
b0bset F_DRY
b0bset DRY
;\\\\\\\\\\\\\\\\\\\\\\\\\\\
Keyactive:
b0mov Dminute,a
clr Dsecond
Keyactive01:
clr flashtime
b0bset F_FLASH1
b0bts0 F_NO_TONE
jmp Main
b0bset TONE_ENABLE
clr tonetime
jmp Main
;*******************
Dry30active03:
b0bts0 F_DISPLAY_FLASH30
jmp Dry30active04
b0bset F_DISPLAY_FLASH30
b0bclr F_DISPLAY_FLASH60
b0bset F_DISPLAY_FLASH
b0bclr F_MINUTE
b0mov a,Dminute_dry
sub a,#60
b0bts1 FC
jmp Dry60active03
mov a,#30
b0mov Dminute_dry,a
jmp Dry60active03
Dry30active04:
clr flag4
b0bts1 F_MINUTE
jmp Dry30active01
b0bclr F_MINUTE
jmp Keyactive01
;\\\\\\\\\\\\\\\\\\\\\\\\\\\
Lightactive:
b0bts0 F_LIGHT
jmp Lightactive01
b0bset F_LIGHT
b0bset LIGHT
jmp Keyactive01
Lightactive01:
b0bclr F_LIGHT
b0bclr LIGHT
jmp Keyactive01
;\\\\\\\\\\\\\\\\\\\\\\\\\\\
Houractive:
clr flag4
b0bts0 F_ON_OFF
jmp Houractive02
Houractive01:
incms hour
nop
b0mov a,hour
sub a,#12
b0bts0 FC
clr hour
jmp Keyactive01
Houractive02:
mov a,#0x05
b0mov delaybuffer,a
b0bts0 F_DELAY
jmp Houractive01
b0bset F_DELAY
jmp Keyactive01
;\\\\\\\\\\\\\\\\\\\\\\\\\\\
Minuteactive:
b0bts0 F_ON_OFF
jmp Minuteactive02
Minuteactive01:
incms minute
nop
b0mov a,minute
sub a,#60
b0bts0 FC
clr minute
jmp Keyactive01
Minuteactive02:
b0bts0 F_DISPLAY_FLASH30
jmp Dry30_time_ster
b0bts0 F_DISPLAY_FLASH60
jmp Dry60_time_ster
incms Dminute
nop
b0bts0 F_STER90
jmp Ster90_time
b0bts0 F_STER45
jmp Ster45_time
b0bts0 F_DRY60
jmp Dry60_time
b0bts0 F_DRY30
jmp Dry30_time
b0bts0 F_DELAY
jmp Minuteactive01
jmp Main
Dry30_time:
b0mov a,Dminute
sub a,#60
b0bts1 FC
jmp Keyactive01
mov a,#30
jmp Keyactive
Dry60_time:
b0mov a,Dminute
sub a,#121
b0bts1 FC
jmp Keyactive01
mov a,#60
jmp Keyactive
Ster45_time:
b0mov a,Dminute
sub a,#90
b0bts1 FC
jmp Keyactive01
mov a,#45
jmp Keyactive
Ster90_time:
b0mov a,Dminute
sub a,#241
b0bts1 FC
jmp Keyactive01
mov a,#90
jmp Keyactive
;\\\\\\\\\\\\\\\\\\\\\\\\\\\
Dry30_time_ster:
incms Dminute_dry
nop
b0mov a,Dminute_dry
sub a,#60
b0bts1 FC
jmp Dry60_time_ster01
mov a,#30
b0mov Dminute_dry,a
jmp Dry60_time_ster01
Dry60_time_ster:
incms Dminute_dry
nop
b0mov a,Dminute_dry
sub a,#121
b0bts1 FC
jmp Dry60_time_ster01
mov a,#60
b0mov Dminute_dry,a
Dry60_time_ster01:
mov a,#15
b0mov delaybuffer,a
b0bset F_DELAY
b0bset F_MINUTE
b0bclr F_FLASH
clr timer
jmp Keyactive01
;\\\\\\\\\\\\\\\\\\\\\\\\\\\
Ster90active:
mov a,#60
b0mov Dminute_Dry,a
clr flag2
b0bset F_STER90
call Clrstatus01
mov a,#90
jmp Ster45active01
;\\\\\\\\\\\\\\\\\\\\\\\\\\\
Ster45active:
mov a,#60
b0mov Dminute_Dry,a
clr flag2
b0bset F_STER45
call Clrstatus01
mov a,#45
Ster45active01:
clr flag4
b0bset F_STER
b0bset STER
jmp Keyactive
;\\\\\\\\\\\\
AdjDisplay:
b0bts1 F_STER90
jmp AdjDisplay01
mov a,Dminute
sub a,#45
b0bts0 FC
ret
b0bclr F_STER90
b0bset F_STER45
ret
AdjDisplay01:
b0bts1 F_DRY60
ret
mov a,Dminute
sub a,#30
b0bts0 FC
ret
b0bclr F_DRY60
b0bset F_Dry30
ret
Segtable:
; ; afbgcxed
dw 0xffeb ;b'11101011' ;0
dw 0xff28 ;b'00101000' ;1
dw 0xffb3 ;b'10110011' ;2
dw 0xffb9 ;b'10111001' ;3
dw 0xff78 ;b'01111000' ;4
dw 0xffd9 ;b'11011001' ;5
dw 0xffdb ;b'11011011' ;6
dw 0xffe8 ;b'11101000' ;7
dw 0xfffb ;b'11111011' ;8
dw 0xfff9 ;b'11111001' ;9
endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -