📄 jiaobanqi.asm
字号:
;*******************************************************************************
CHIP SN8P2602B ; Select the CHIP
//{{SONIX_CODE_OPTION
.Code_Option LVD LVD_M ; 2.0V Reset Enable LVD24 bit of PFLAG for 2.4V Low Voltage Indicator
.Code_Option Reset_Pin P15
.Code_Option Watch_Dog Enable
.Code_Option High_Clk 4M_X'tal ; Crystal/Resonator: 2Mhz~10Mhz
.Code_Option Fcpu #3 ; Fcpu = Fosc/8
.Code_Option Security Enable
.Code_Option Noise_Filter Enable
//}}SONIX_CODE_OPTION
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
.nolist ; do not list the macro file
INCLUDESTD MACRO1.H
INCLUDESTD MACRO2.H
INCLUDESTD MACRO3.H
.list ; Enable the listing function
;-------------------------------------------------------------------------------
; Variables Definition
;-------------------------------------------------------------------------------
.DATA
ORG 0H
PFLAGBUF DS 1 ;PSW SAVE TEMP
ACCBUF DS 1 ;ACC SAVE TEMP
FLAG DS 1 ;PROGRAM STATUS
OVERLOAD_FLAG EQU FLAG.1 ;OVER LOADING FLAG
OUTPUT_PAUSE EQU FLAG.2 ;OUTPUT STOP
TIME_T EQU FLAG.3 ;5MS FLAG
TRIGGLE_FLAG EQU FLAG.4 ;TIRGGLE OR NOT
;; DISP_FLAG EQU FLAG.5 ;MODE LED DISPLAY OR NOT
FLAG2 DS 1
KEY_FLAG_1 EQU FLAG2.0 ;SW1 RELEASE OR NOT
KEY_FLAG_2 EQU FLAG2.1 ;SW2 RELEASE OR NOT
KEY_FLAG_3 EQU FLAG2.2 ;SW3 RELEASE OR NOT
KEY_FLAG_4 EQU FLAG2.3 ;SW4 RELEASE OR NOT
KEY_FLAG_5 EQU FLAG2.4 ;SW5 RELEASE OR NOT
KEY_FLAG_6 EQU FLAG2.5 ;SW6 RELEASE OR NOT
QUDOU_BUFF DS 1 ;KEY DEBOUNCE BUFFER
MODE_FLAG DS 1 ;MODE FLAG
MODE1 EQU MODE_FLAG.0
MODE2 EQU MODE_FLAG.1
MODE3 EQU MODE_FLAG.2
MODE4 EQU MODE_FLAG.3
MODE5 EQU MODE_FLAG.4
MODE_STATUS DS 1 ;SMALL MODE FOR MODE1 TO MODE5
TIME_MS DS 1 ;TIME MILLION SECOND COUNTER
TIME_SEC DS 1 ;TIME SECOND COUNTER
R_SPEED DS 1 ;SPEED SELECT REGISTER
MODE3_CIRCLE DS 1 ;MODE3 RUN 2 CIRCLE
DELAY_BUFF DS 1 ;BT TRIGGLE PULSE TIME
DELAY_BUFF2 DS 1 ;OVERLOAD DETECT DELAY
DELAY_BUFF3 DS 1 ;DELAY FOR KEY DEBOUNCE
R_SLEPTIME DS 1 ;AC POWER OFF DELAY RESET
;-------------------------------------------------------------------------------
; I/O DEFINITION
;-------------------------------------------------------------------------------
; INPUT
;-------------------------------------------------------------------------------
KEY_SW1 EQU FP54
KEY_SW2 EQU FP56
KEY_SW3 EQU FP11
KEY_SW4 EQU FP53
KEY_SW5 EQU FP50
KEY_SW6 EQU FP15
INPUT_50HZ EQU FP00
; OVER_LOAD EQU FP13
;-------------------------------------------------------------------------------
; OUTPUT
;-------------------------------------------------------------------------------
LED_L1 EQU FP55
LED_L2 EQU FP57
LED_L3 EQU FP10
LED_L4 EQU FP52
LED_L5 EQU FP51
LED_L6 EQU FP13
BT_TRIGGLE EQU FP12
;--------------------------------------------------------------------------------
; CONSTANT DEFINE
;--------------------------------------------------------------------------------
_TIME_19000 EQU #248 ;SPEED 0
_TIME_18300 EQU #211 ;SPEED 1
_TIME_17100 EQU #151 ;SPEED 2
_TIME_15200 EQU #111 ;SPEED 3
_TIME_13300 EQU #83 ;SPEED 4
_TIME_10000 EQU #57 ;SPEED 5
_TIME_9500 EQU #53 ;SPEED 6
;--------------------------------------------------------------------------------
_SPD_19000 EQU #01H ;SPEED 0
_SPD_18300 EQU #02H ;SPEED 1
_SPD_17100 EQU #04H ;SPEED 2
_SPD_15200 EQU #08H ;SPEED 3
_SPD_13300 EQU #10H ;SPEED 4
_SPD_10000 EQU #20H ;SPEED 5
_SPD_9500 EQU #40H ;SPEED 6
;--------------------------------------------------------------------------------
_TIME_MS EQU #200 ;200*5MS=1S
_CIRCLE_M3 EQU #2 ;MODE 3 RUN 2 CIRCLE
_DEBOUNCE_TIME EQU #100 ;KEY DEBOUNCE TIME (100MS)
_DLY_BUFF EQU #35 ;DELAY TIME FOR TIRGGLE PULSE
_DLY_BUFF2 EQU #80 ;DELAY TIME FOR DECTTING OVERLOAD
_DLY_BUFF3 EQU #60 ;DELAY FOR KEY DEBOUNCE
_SLEP_DLY EQU #5 ;AC POWER OFF DELAY RESET
;-------------------------------------------------------------------------------
; Code section
;-------------------------------------------------------------------------------
.CODE
ORG 0
NOP
NOP
jmp Reset1 ;Reset vector
;Address 4 to 7 are reserved
ORG 8
NOP
NOP
jmp Isr ;Interrupt vector
ORG 20h
;-------------------------------------------------------------------------------
; Program reset section
;-------------------------------------------------------------------------------
Reset1:
mov A,#7Fh ;Initial stack pointer and
b0mov STKP,A ;disable global interrupt
b0mov PFLAG,#00h ;pflag = x,x,x,x,x,c,dc,z
call SysInit ;System initial
call ClrRAM ;Clear RAM
MOV A,_DLY_BUFF
B0MOV DELAY_BUFF,A
MOV A,_DLY_BUFF2
B0MOV DELAY_BUFF2,A
MOV A,#255
B0MOV R_SPEED,A
MOV A,#0FFH
B0MOV FLAG2,A
B0BSET FP00IEN
B0BSET FGIE
;-------------------------------------------------------------------------------
; Main routine
;-------------------------------------------------------------------------------
Main:
MOV A,#5AH
B0MOV WDTR,A
CALL KEY_SCAN
CALL DISPLAY
; CALL DETECT_LOAD
CALL RUN_MODE
CALL F_DELAY
JMP MAIN
;------------------------------------------------------------------------------
KEY_SCAN:
B0BTS0 KEY_FLAG_1
JMP KEY_EXIT1
B0BTS0 KEY_FLAG_2
JMP KEY_EXIT2
B0BTS0 KEY_FLAG_3
JMP KEY_EXIT3
B0BTS0 KEY_FLAG_4
JMP KEY_EXIT4
B0BTS0 KEY_FLAG_5
JMP KEY_EXIT5
B0BTS0 KEY_FLAG_6
JMP KEY_EXIT6
;----------------------------------------
B0BTS0 KEY_SW1
JMP KEY_NEXT1
DECMS QUDOU_BUFF
JMP KEY_RET
B0BTS0 KEY_SW1
JMP KEY_NEXT1
B0BSET KEY_FLAG_1
MOV A,_DEBOUNCE_TIME
B0MOV QUDOU_BUFF,A
B0BTS0 MODE1 ;0N/OFF
B0BCLR OUTPUT_PAUSE
B0BTS1 MODE1
B0BSET OUTPUT_PAUSE
MOV A,#00000001B ;KEY_SW1 SERVICE
B0MOV MODE_FLAG,A
MOV A,#5
B0MOV TIME_SEC,A
MOV A,_TIME_MS
B0MOV TIME_MS,A
MOV A,#1
B0MOV MODE_STATUS,A
B0BCLR OVERLOAD_FLAG
B0BTS1 OUTPUT_PAUSE ;CLOSE DISPLAY
CLR MODE_FLAG
JMP KEY_RET
;----------------------------------------
KEY_NEXT1:
B0BTS0 KEY_SW2
JMP KEY_NEXT2
DECMS QUDOU_BUFF
JMP KEY_RET
B0BTS0 KEY_SW2
JMP KEY_NEXT2
B0BSET KEY_FLAG_2
MOV A,_DEBOUNCE_TIME
B0MOV QUDOU_BUFF,A
B0BTS0 MODE2 ;0N/OFF
B0BCLR OUTPUT_PAUSE
B0BTS1 MODE2
B0BSET OUTPUT_PAUSE
MOV A,#00000010B
MOV MODE_FLAG,A ;KEY_SW2 SERVICE
MOV A,#10
B0MOV TIME_SEC,A
MOV A,_TIME_MS
B0MOV TIME_MS,A
MOV A,#1
B0MOV MODE_STATUS,A
B0BCLR OVERLOAD_FLAG
B0BTS1 OUTPUT_PAUSE ;CLOSE DISPLAY
CLR MODE_FLAG
JMP KEY_RET
;----------------------------------------
KEY_NEXT2:
B0BTS0 KEY_SW3
JMP KEY_NEXT3
DECMS QUDOU_BUFF
JMP KEY_RET
B0BTS0 KEY_SW3
JMP KEY_NEXT3
B0BSET KEY_FLAG_3
MOV A,_DEBOUNCE_TIME
B0MOV QUDOU_BUFF,A
B0BTS0 MODE3 ;0N/OFF
B0BCLR OUTPUT_PAUSE
B0BTS1 MODE3
B0BSET OUTPUT_PAUSE
MOV A,#00000100B ;KEY_SW3 SERVICE
MOV MODE_FLAG,A
MOV A,#3
B0MOV TIME_SEC,A
MOV A,_TIME_MS
B0MOV TIME_MS,A
MOV A,#1
B0MOV MODE_STATUS,A
MOV A,_CIRCLE_M3
B0MOV MODE3_CIRCLE,A
B0BCLR OVERLOAD_FLAG
B0BTS1 OUTPUT_PAUSE ;CLOSE DISPLAY
CLR MODE_FLAG
JMP KEY_RET
;----------------------------------------
KEY_NEXT3:
B0BTS0 KEY_SW4
JMP KEY_NEXT4
DECMS QUDOU_BUFF
JMP KEY_RET
B0BTS0 KEY_SW4
JMP KEY_NEXT4
B0BSET KEY_FLAG_4
MOV A,_DEBOUNCE_TIME
B0MOV QUDOU_BUFF,A
B0BTS0 MODE4 ;0N/OFF
B0BCLR OUTPUT_PAUSE
B0BTS1 MODE4
B0BSET OUTPUT_PAUSE
MOV A,#00001000B ;KEY_SW4 SERVICE
MOV MODE_FLAG,A
B0BCLR OVERLOAD_FLAG
B0BTS1 OUTPUT_PAUSE ;CLOSE DISPLAY
CLR MODE_FLAG
JMP KEY_RET
;------------------------------------
KEY_NEXT4:
B0BTS0 KEY_SW5
JMP KEY_NEXT5
DECMS QUDOU_BUFF
JMP KEY_RET
B0BTS0 KEY_SW5
JMP KEY_NEXT5
MOV A,_DEBOUNCE_TIME
B0MOV QUDOU_BUFF,A
B0BSET KEY_FLAG_5
;; B0BTS0 MODE5 ;0N/OFF
;; B0BCLR OUTPUT_PAUSE
;; B0BTS1 MODE5
B0BSET OUTPUT_PAUSE
MOV A,#00010000B ;KEY_SW5 SERVICE
B0MOV MODE_FLAG,A
B0BCLR OVERLOAD_FLAG
;; B0BTS1 OUTPUT_PAUSE ;CLOSE DISPLAY
;; CLR MODE_FLAG
JMP KEY_RET
;----------------------------------------
KEY_NEXT5:
B0BTS0 KEY_SW6
JMP KEY_RET
DECMS QUDOU_BUFF
JMP KEY_RET
B0BTS0 KEY_SW6
JMP KEY_RET ;OFF
MOV A,_DEBOUNCE_TIME
B0MOV QUDOU_BUFF,A
B0BSET KEY_FLAG_6
MOV A,MODE_FLAG ///
XOR A,#0 ///
B0BTS1 FZ ///
B0BSET LED_L6 ///
B0BCLR OUTPUT_PAUSE
CLR MODE_FLAG
JMP KEY_RET
;----------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -