📄 s608220v.src
字号:
;S3F9454 IN 3.2MHz
; 199-241显示 230V
;-----------------------VER -------------------------------
.INCLUDE "Hardware.SRC"
.RAM_ORG 00H
FlagReg: .RAM_DS 1
FreshDisp: .EQU 01h
delay_short_long_flag: .EQU 02h
IN_OUT_Volt_flag: .EQU 04h
BLINK_500ms: .EQU 08h
SelfBlink: .EQU 10h
DispUnchange: .EQU 20H
ThirdKeyPress: .EQU 40H
UserFlag: .RAM_DS 1
delay_set_bak: .EQU 01H
FreshVolt: .EQU 02H
ProtectEable: .EQU 04H
FreshAdc: .EQU 08h
BasePoint: .EQU 10H
Cnt500ms: .RAM_DS 1
ms500: .EQU 600/4
Cnt300ms: .ram_ds 1
_300ms: .equ 175
Cnt1000ms: .ram_ds 1
_1000ms: .equ 1000/4;
dispnow: .RAM_DS 1 ;动态显示位控控制
DispBuf: .RAM_DS 3 ; display buffer
DispStatus: .RAM_DS 1
InVoltValue: .RAM_DS 2
OutVoltValue: .RAM_DS 2
;----------
BEFOREOutVoltValue: .RAM_DS 2
UNNORMALOutVoltValue: .RAM_DS 2
UNNORMALOutVolt_count: .RAM_DS 1
;----------
KeyAdcValue: .RAM_DS 2
PressedTime: .RAM_DS 1
keyold: .RAM_DS 1
KeyPress3secCnt: .RAM_DS 1
KeyStatus: .RAM_DS 1
Key_uncertain: .equ 0*3
Key_wait_release: .equ 1*3
Key_normal: .equ 2*3
Key_continue: .equ 3*3
;-----------------
key_uncertain_time: .RAM_DS 1
_UNCERTAINTIME: .EQU 10
key_old: .RAM_DS 1
key_three_sec_cnt: .ram_ds 1
key3sec: .equ 3
;=================
DelayTimeCnt: .RAM_DS 1
_120sec: .EQU 120
_5sec: .EQU 6
_3sec: .EQU 5
DispSetTime: .RAM_DS 1
_4sec: .EQU 9
LedStatus: .ram_ds 1 ;三个指示灯状态
ProtectStatus: .RAM_DS 1
Pro255Time: .RAM_DS 1
Pro260Time: .RAM_DS 1
SystemTime: .RAM_DS 1
SYS_TIME: .EQU (4000/80)
DELAY_300_display_flag: .RAM_DS 1
DELAY_time_display: .RAM_DS 1
GO_do_time .RAM_DS 1
;=================
AdataH: .RAM_DS 1
AdataL: .RAM_DS 1
RelayOnTime: .RAM_DS 1
_6s: .EQU 6 ;短延时
_120s: .EQU 120 ;长延时
;------------------------------------------------------------
WORK_LED: .MACRO ON_OFF
.IF ON_OFF==ON
AND DispBuf+0,#~80h
.ELSE
OR DispBuf+0,#80h ;常暗
.ENDIF
.ENDM
;---------
DELAY_LED: .MACRO ON_OFF
.IF ON_OFF==ON
AND DispBuf+1,#~80H
.ELSE
OR DispBuf+1,#80H
.ENDIF
.ENDM
;---------
ERROR_LED: .MACRO ON_OFF
.IF ON_OFF==ON
AND DispBuf+2,#~80H
.ELSE
OR DispBuf+2,#80H
.ENDIF
.ENDM
;========
;-----------------------------
.ORG 0000H
.VECTOR 00H,INT_Handler
INT_Handler::
TM T0CON,#00000001B
JR NZ,INT_Timer0
IRET
;----------------------------------------------
.ORG 003CH
DB 00H
DB 00H
DB 0E7H
DB 03H
;----------------
INT_Timer0:: ;80us interrupt
TM ADCON,#ADC_OEC
JR Z,skip_fresh_adc
LD AdataH,ADDATAH
LD AdataL,ADDATAL
OR ADCON,#START_ADC
OR UserFlag,#FreshAdc
skip_fresh_adc:
DEC SystemTime
JP NZ,end_int_timer0
LD SystemTime,#SYS_TIME
CP DELAY_time_display,#0
JR EQ,SKIP_DELAY_time_display
DEC DELAY_time_display
CP DELAY_time_display,#190
JR NE,SKIP_DELAY_time_display11
OR DELAY_300_display_flag,#08H
SKIP_DELAY_time_display11:
CP DELAY_time_display,#0
JR NE,SKIP_DELAY_time_display
OR DELAY_300_display_flag,#01H
AND DELAY_300_display_flag,#~08H
SKIP_DELAY_time_display:
DEC Cnt500ms
JR NZ,skip_Cnt500ms
LD Cnt500ms,#ms500
OR FlagReg,#FreshDisp
OR UserFlag,#FreshVolt
XOR FlagReg,#BLINK_500ms
skip_Cnt500ms:
CP Cnt300ms,#0
JR Z ,skip_Cnt300ms
DEC Cnt300ms
skip_Cnt300ms:
;----------
DEC Cnt1000ms
JR NZ,skip_Cnt1000ms
;-------------------
CP GO_do_time,#0
JR EQ,GO_DO_NEXT
DEC GO_do_time
CP GO_do_time,#0
JR NE,GO_DO_NEXT
AND DELAY_300_display_flag,#~10H
GO_DO_NEXT:
;-------------------
LD Cnt1000ms,#_1000ms
INC KeyPress3secCnt
CP DelayTimeCnt,#0
JR EQ,skip_DelayTimeCnt
DEC DelayTimeCnt
skip_DelayTimeCnt:
CP DispSetTime,#0
JR EQ,skip_DispSetTime
DEC DispSetTime
skip_DispSetTime:
CP Pro255Time,#0
JR EQ,skip_Pro255Time
DEC Pro255Time
skip_Pro255Time:
CP Pro260Time,#0
JR EQ,skip_Pro260Time
DEC Pro260Time
skip_Pro260Time:
CP key_three_sec_cnt,#0
JR EQ,skip_key_three_sec_cnt
DEC key_three_sec_cnt
skip_key_three_sec_cnt:
skip_Cnt1000ms: ;一秒未到
CP PressedTime,#100
JR UGE,skip_inc_PressedTime
INC PressedTime
skip_inc_PressedTime:
CALL display
CP key_uncertain_time,#0
JR EQ,skip_key_uncertain_time
DEC key_uncertain_time
skip_key_uncertain_time:
end_int_timer0:
AND T0CON,#0F6h
IRET
;------------------------------------------------------
.ORG 0100H
JP init_system
init_system::
DI
init_io_function ;I/O初始化
; INPUT_OFF ;关断所有输入电压可控硅
CLR R0
RAM_Clear:
CLR @R0
INC R0
CP R0,#60H
JR ULT,RAM_Clear
CALL init_parameter
EI
;------------------------------------
LD R7,#OUTPUT_SEG4
LD OutputStatus,R7
OR DELAY_300_display_flag,#10H
main::
CALL deal_input
CALL check_regulate_volt
CALL deal_keyboard
CALL deal_display
JR main
;==============================================================================
;串行输出BYTE子程序(高位先输出):
; 入口: R13:数据,
;===================================
_DISP_8BIT::
RLC R13
JR NC,SEND_LOW_BIT7
OR P0,#08H
JR bit6
SEND_LOW_BIT7:
AND P0,#~08H
bit6:
RLC R13
JR NC,SEND_LOW_BIT6
OR P0,#04H
JR bit5
SEND_LOW_BIT6:
AND P0,#~04H
bit5:
RLC R13
JR NC,SEND_LOW_BIT5
OR P0,#02H
JR bit4
SEND_LOW_BIT5:
AND P0,#~02H
bit4:
RLC R13
JR NC,SEND_LOW_BIT4
OR P0,#01H
JR bit3
SEND_LOW_BIT4:
AND P0,#~01H
bit3:
RLC R13
JR NC,SEND_LOW_BIT3
OR P2,#02H
JR bit2
SEND_LOW_BIT3:
AND P2,#~02H
bit2:
RLC R13
JR NC,SEND_LOW_BIT2
OR P2,#01H
JR bit1
SEND_LOW_BIT2:
AND P2,#~01H
bit1:
RLC R13
JR NC,SEND_LOW_BIT1
OR P1,#02H
JR bit0
SEND_LOW_BIT1:
AND P1,#~02H
bit0:
RLC R13
JR NC,SEND_LOW_BIT0
OR P1,#01H
JR bit0_over
SEND_LOW_BIT0:
AND P1,#~01H
bit0_over:
RET
;----------------------------------------------------------------------
;------------------------------------------------------
display::
OFF_DISP
LD R14,dispnow
LD R13,#DispBuf[R14]
CALL _DISP_8BIT
LD R14,dispnow
CP R14,#0
JR NE,if_is_1
ON_DIGIT_1
JR medify_dispnow
if_is_1:
CP R14,#1
JR NE,is_2
ON_DIGIT_2
JR medify_dispnow
is_2:
ON_DIGIT_3
medify_dispnow:
INC dispnow
CP dispnow,#3
JR ULT,exit_disp
CLR dispnow
exit_disp:
RET
;------------------------------------------------------------------------------
LED_SEG_0: .EQU 0C0H
LED_SEG_1: .EQU 0F9H
LED_SEG_2: .equ 0A4H
LED_SEG_5: .EQU 92H
LED_SEG_6: .EQU 82H
LED_SEG_8: .EQU 80H
SIGNED_DEC: .EQU 17 ;正号偏移量
SIGNED_ADD: .EQU 18 ;负号偏移量
LED_OFF: .EQU 0FFH ;LED不显示
CHAR_H: .EQU 10001001B;H
CHAR_L: .EQU 11000111B;L
CHAR_O: .EQU 10100011B;o
CHAR_A: .EQU 88H
CHAR_D: .EQU 0A1H
CHAR_U: .EQU 11100011B;u
CHAR_T: .EQU 10000111B;t
CHAR_R: .EQU 10101111B;r
CHAR_C: .EQU 0A7H
CHAR_F: .EQU 8EH
CHAR_Y: .EQU 10010001B;y
CHAR_E: .EQU 86H
DISP_LED_TAB: ;七段LED显示码表,共阳极
.DB LED_SEG_0 ;0
.DB LED_SEG_1 ;1
.DB LED_SEG_2 ;2
.DB 0B0H ;3
.DB 99H ;4
.DB LED_SEG_5 ;5
.DB 82H ;6
.DB 0F8H ;7
.DB 80H ;8
.DB 90H ;9
.DB CHAR_A ;A
.DB 83H ;B
.DB CHAR_C ;C
.DB CHAR_D ;D
.DB CHAR_E ;E
.DB CHAR_F ;F ;15
.DB LED_OFF ;space ;16
.DB 0CH&0FH ;17
.DB 00H&0FH ;18
msg_LOAD_H:;; 1 2 3 4 5 6 7 8 9 10 11 12
.DB CHAR_L,LED_SEG_0,CHAR_A,CHAR_D ,LED_OFF,CHAR_H,LED_OFF,LED_OFF,LED_OFF,LED_SEG_0,CHAR_F,CHAR_F,0
msg_OUT_L:
.DB CHAR_O,CHAR_U,CHAR_T,LED_OFF,LED_OFF,CHAR_L,LED_OFF,CHAR_D ,CHAR_E ,CHAR_L, CHAR_A ,CHAR_Y,0
msg_OUT_H:
.DB CHAR_O,CHAR_U,CHAR_T,LED_OFF,LED_OFF,CHAR_H,LED_OFF,CHAR_D,CHAR_E,CHAR_L,CHAR_A,CHAR_Y,0
msg_HOT:
.DB CHAR_H,CHAR_O,CHAR_T,LED_OFF,LED_OFF,LED_OFF,LED_OFF,LED_OFF,LED_OFF,LED_SEG_0,CHAR_F,CHAR_F,0
msg_key_tab:
.DB 88H,88H,88H,0
.DB 83H,83H,83H,0
.DB 0A7H,0A7H,0A7H,0
.DB 0A1H,0A1H,0A1H,0
.DB 86H,86H,86H,0
.DB 8EH,8EH,8EH,0
set_same_dispbuf::
LD R0,#DispBuf
set_go:
LD @R0,R7
INC R0
CP R0,#DispBuf+3
JR ULT,set_go
RET
;---------------------------------------------------
;------------------------------------------------------------------
; 入口: R6:数据高八位 R7:数据低八位
; 出口: BCD码->低:(R2,),R3,R4,R5
BCD_conversion::
CLR R2
CLR R3
_1000_loop:
LD R4,R6
LD R5,R7
SUB R7,#1000%256
SBC R6,#1000/256
JR C,conversion_next
INC R2
JR _1000_loop
conversion_next:
LD R6,R4
LD R7,R5
_100_loop:
LD R4,R6
LD R5,R7
SUB R7,#100
SBC R6,#0
JR C,_10_loop
INC R3
JR _100_loop
_10_loop:
LD R6,R5
SUB R5,#10
JR C,end_of_BCD_conversion
INC R4
JR _10_loop
end_of_BCD_conversion:
LD R5,R6
RET
;-------------------------------------------------------------
BCD_TO_LED::
LD R0,#DISP_LED_TAB/256
LD R1,#DISP_LED_TAB%256
ADD R1,R7
ADC R0,#0
LDC R7,@RR0
RET
;-------------------------------------------------
set_display_data:: ;将R3R4R5内的BCD玛放到显示缓冲区
LD R7,R3
CALL BCD_TO_LED
AND DispBuf+0,#80H
AND R7,#~80H
OR DispBuf+0,R7
LD R7,R4
CALL BCD_TO_LED
AND DispBuf+1,#80H
AND R7,#~80H
OR DispBuf+1,R7
LD R7,R5
CALL BCD_TO_LED
AND DispBuf+2,#80H
AND R7,#~80H
OR DispBuf+2,R7
RET
;====================================================
dbl_divs::
CLRWDT
LD R6,#16
CLR R4
CLR R5
_divs_do:
RCF
RLC R1
RLC R0
RLC R5
RLC R4
CP R4,R2
JR ULT,no_go
JR UGT,go_sub
CP R5,R3
JR ULT,no_go
go_sub:
SUB R5,R3
SBC R4,R2
OR R1,#1
sub_en:
no_go:
DEC R6
JR NZ,_divs_do
RET
;==========================
multiplication::
CLRWDT
LD R8,#16
CLR R4
CLR R5
;CLR R6
;CLR R7
_mult_do:
RRC R2
RRC R3
JR NC,NO_add
ADD R5,R1
ADC R4,R0
NO_add:
RRC R4
RRC R5
RRC R6
RRC R7
DEC R8
JR NZ,_mult_do
LD R1,R7
LD R0,R6
RET
;===========================================
INPUTVOLT: .equ 12
OUTVOLT: .equ 23
KEYVOLT: .equ 34
deal_input::
LD ADCON,#OUTVOLTADCON|START_ADC
CALL SampleNew
CALL calc_volt
LD OutVoltValue+1,R1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -