📄 abc.asm
字号:
TEMPDATA EQU 30H
TEMPSTORE EQU 32H
COMNUM EQU 38H
HLIMIT EQU 40H
LLIMIT EQU 48H
FLAG BIT PSW.5
DQ BIT P2.4
WARNING BIT P2.3
SDATA_5950 EQU P0.0 ;串行数据输入
SDATA_5951 EQU P0.1
SDATA_5952 EQU P0.2
SDATA_5953 EQU P0.3
SCLK_595 EQU P2.2 ;移位时钟脉冲
RCK_5950 EQU P0.4 ;输出锁存器控制脉冲
RCK_5951 EQU P0.5
RCK_5952 EQU P0.6
RCK_5953 EQU P0.7
ORG 0000H
AJMP MAIN
ORG 0003H
CLR EA
MOV R7,#1
LCALL LIMIT
RETI
ORG 0013H
CLR EA
MOV R7,#0
LCALL LIMIT
RETI
ORG 0030H
MAIN:
SETB EX0
SETB EX1
SETB IT0
SETB IT1
MOV R0,#HLIMIT
MOV @R0,#0
INC R0
MOV @R0,#5
INC R0
MOV @R0,#0
INC R0
MOV @R0,#0
MOV R0,#LLIMIT
MOV @R0,#1
INC R0
MOV @R0,#1
INC R0
MOV @R0,#0
INC R0
MOV @R0,#0
START:
CLR EA
LCALL TEMPER
LCALL DATASTORE
LCALL DISPLAY
LCALL COMPARE
SETB EA
AJMP START
TEMPER:
LCALL RESET
JNB FLAG,TEMPER
MOV A,#0CCH
LCALL WR1820
MOV A,#44H
LCALL WR1820
LCALL DELAY2S
LCALL RESET
JNB FLAG,TEMPER
MOV A,#0CCH
LCALL WR1820
MOV A,#0BEH
LCALL WR1820
LCALL RD1820
RET
RESET:
CLR DQ
MOV R7,#250
DJNZ R7,$
SETB DQ
MOV R7,#30
DJNZ R7,$
CLR FLAG
JB DQ,RESETBACK
SETB FLAG
MOV R7,#210
DJNZ R7,$
SETB DQ
RESETBACK:
RET
RD1820:
MOV R1,#2
MOV R0,#TEMPDATA
RDBYTE:
MOV R2,#8
RDBIT:
CLR DQ
NOP
NOP
SETB DQ
NOP
MOV C,DQ
RRC A
MOV R7,#30
DJNZ R7,$
DJNZ R2,RDBIT
MOV @R0,A
INC R0
DJNZ R1,RDBYTE
SETB DQ
RET
WR1820:
MOV R0,#8
RRC A
WRBIT:
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
MOV DQ,C
RRC A
MOV R7,#30
DJNZ R7,$
DJNZ R0,WRBIT
SETB DQ
RET
DATASTORE:
MOV B,#10
MOV R0,#TEMPDATA+1
MOV R1,#TEMPSTORE
MOV A,@R0
JB ACC.7,NEG
MOV @R1,#0
MOV A,TEMPDATA
XCHD A,@R0
SWAP A
AJMP STORENEXT
NEG:
MOV @R1,#1
MOV A,TEMPDATA
CLR C
SUBB A,#1
MOV R7,A
MOV A,@R0
SUBB A,#0
MOV @R0,A
MOV A,R7
XCHD A,@R0
SWAP A
XRL A,#0FFH
STORENEXT:
DIV AB
INC R1
MOV @R1,A
INC R1
MOV @R1,B
INC R1
MOV A,TEMPDATA
JB ACC.3,POINT
MOV @R1,#0
AJMP STOREBACK
POINT:
MOV @R1,#1
STOREBACK:
RET
;=============================================================
;================ 显示子程序 ========================
;=============================================================
DISPLAY:
MOV R0,#TEMPSTORE
MOV A,@R0
; LCALL OUT_5950 ;将数据送到输出锁存器
JZ ZERO
MOV A,#40H
AJMP NZERO
ZERO:
MOV A,#00H
NZERO:
LCALL OUT_5950
;MOV R0,#TEMPSTORE
;MOV A,@R0
;ACALL TABLE2
;LCALL OUT_5950
INC R0
MOV A,@R0
LCALL OUT_5951 ;将数据送到输出锁存器
INC R0
MOV A,@R0
LCALL OUT_5952 ;将数据送到输出锁存器
INC R0
MOV A,@R0
LCALL OUT_5953 ;将数据送到输出锁存器
RET
;===================================================================
;=============== 输出第一位 ===================
;===================================================================
;-----------------------------
;输出锁存器输出数据子程序
;-----------------------------
OUT_5950:
LCALL WR_5950
CLR RCK_5950
NOP
NOP
SETB RCK_5950 ;上升沿将数据送到输出锁存器
NOP
NOP
NOP
CLR RCK_5950
RET
;-----------------------------------
;移位寄存器接收数据子程序
;-----------------------------------
WR_5950:
MOV R4,#08H
; ACALL TABLE2
WR_LOOP0:
RLC A
MOV SDATA_5950,C
SETB SCLK_595 ;上升沿发生移位
NOP
NOP
CLR SCLK_595
DJNZ R4,WR_LOOP0
RET
;===================================================================
;================ 输出第二位 ==================
;===================================================================
;-----------------------------
;输出锁存器输出数据子程序
;-----------------------------
OUT_5951:
LCALL WR_5951
CLR RCK_5951
NOP
NOP
SETB RCK_5951 ;上升沿将数据送到输出锁存器
NOP
NOP
NOP
CLR RCK_5951
RET
;-----------------------------
;输出锁存器输出数据子程序
;-----------------------------
WR_5951:
MOV R4,#08H
ACALL TABLE1
WR_LOOP1:
RLC A
MOV SDATA_5951,C
SETB SCLK_595 ;上升沿发生移位
NOP
NOP
CLR SCLK_595
DJNZ R4,WR_LOOP1
RET
;===================================================================
;=================== 输出第三位 ===============
;===================================================================
;-----------------------------
;输出锁存器输出数据子程序
;-----------------------------
OUT_5952:
LCALL WR_5952
CLR RCK_5952
NOP
NOP
SETB RCK_5952 ;上升沿将数据送到输出锁存器
NOP
NOP
NOP
CLR RCK_5952
RET
;-----------------------------------
;移位寄存器接收数据子程序
;-----------------------------------
WR_5952:
MOV R4,#08H
ACALL TABLE1
SETB ACC.7
WR_LOOP2:
RLC A
MOV SDATA_5952,C
SETB SCLK_595 ;上升沿发生移位
NOP
NOP
CLR SCLK_595
DJNZ R4,WR_LOOP2
RET
;===================================================================
;================== 输出第四位 =====================
;===================================================================
;-----------------------------
;输出锁存器输出数据子程序
;-----------------------------
OUT_5953:
LCALL WR_5953
CLR RCK_5953
NOP
NOP
SETB RCK_5953 ;上升沿将数据送到输出锁存器
NOP
NOP
NOP
CLR RCK_5953
RET
;-----------------------------
;输出锁存器输出数据子程序
;-----------------------------
WR_5953:
MOV R4,#08H
JZ DISZERO
MOV A,#6DH
WR_LOOP3:
RLC A
MOV SDATA_5953,C
SETB SCLK_595 ;上升沿发生移位
NOP
NOP
CLR SCLK_595
DJNZ R4,WR_LOOP3
RET
DISZERO:
MOV A,#3FH
LJMP WR_LOOP3
;=========================================================
;================= 比较子程序 ================
;=========================================================
COMPARE:
MOV R7,#3
MOV R0,#HLIMIT
MOV R1,#TEMPSTORE
MOV COMNUM,@R1
MOV A,@R1
JNZ COMN
MOV A,@R0
CJNE A,COMNUM,WARN
COMPH:
INC R0
INC R1
MOV A,@R0
MOV COMNUM,@R1
CJNE A,COMNUM,WOSP1
DJNZ R7,COMPH
AJMP COMPNEXT
WOSP1:
JC WARN
COMPNEXT:
MOV R0,#LLIMIT
MOV R1,#TEMPSTORE
MOV A,@R0
MOV COMNUM,@R1
CJNE A,COMNUM,SAFE
MOV R7,#3
COMPL:
INC R0
INC R1
MOV A,@R0
MOV COMNUM,@R1
CJNE A,COMNUM,WOSP2
DJNZ R7,COMPL
AJMP SAFE
WOSP2:
JNC WARN
AJMP SAFE
COMN:
MOV A,@R0
CJNE A,COMNUM,COMNNEXT
MOV R7,#3
COMNH:
INC R0
INC R1
MOV A,@R0
MOV COMNUM,@R1
CJNE A,COMNUM,WOSN1
DJNZ R7,COMNH
AJMP COMNNEXT
WOSN1:
JNC WARN
COMNNEXT:
MOV R0,#LLIMIT
MOV R1,#TEMPSTORE
MOV COMNUM,@R1
MOV A,@R0
CJNE A,COMNUM,WARN
MOV R7,#3
COMNL:
INC R0
INC R1
MOV A,@R0
MOV COMNUM,@R1
CJNE A,COMNUM,WOSN2
DJNZ R7,COMNL
AJMP SAFE
WOSN2:
JNC SAFE
WARN:
SETB WARNING
AJMP COMBACK
SAFE:
CLR WARNING
COMBACK:
RET
;===================================================
; 上下限设置子程序
;===================================================
LIMIT:
CLR WARNING
MOV R0,#0EEH
KEY:
;MOV P1,#0FFH
SETB P3.4
SETB P3.5
SETB P3.6
SETB P3.7
MOV A,P3
CPL A
ANL A,#0F0H
JZ KEY
LCALL DELAY20ms
MOV A,P3
CPL A
ANL A,#0F0H
JZ KEY
SWAP A
MOV B,A
KEY1:
MOV A,P3
CPL A
ANL A,#0F0H
JNZ KEY1
LCALL DELAY20ms
MOV A,B
JB ACC.0,INCNUM
JB ACC.1,NEXTNUM
JB ACC.2,OK
AJMP KEY
INCNUM:
MOV A,R7
JZ SETLOW1
MOV R1,#HLIMIT
AJMP NEXTEN
SETLOW1:
MOV R1,#LLIMIT
NEXTEN:
MOV A,R0
JNB ACC.0,SIGN
JNB ACC.1,NUM1
JNB ACC.2,NUM2
JNB ACC.3,NUM3
AJMP KEY
SIGN:
MOV A,@R1
;CPL ACC.0
;MOV @R1,A
JZ NEXT
MOV A,#00H
MOV @R1,A
AJMP NEXT1
NEXT:
MOV A,#40H
MOV @R1,#01H
NEXT1:
LCALL OUT_5950
NOP
NOP
AJMP KEY
NUM1:
INC R1
CHANGE:
CJNE @R1,#9,INCNEXT1
MOV @R1,#0
AJMP SETSHOW1
INCNEXT1:
INC @R1
SETSHOW1:
MOV A,@R1
LCALL OUT_5951
NOP
NOP
AJMP KEY
NUM2:
INC R1
INC R1
CJNE @R1,#9,INCNEXT2
MOV @R1,#0
AJMP SETSHOW2
INCNEXT2:
INC @R1
SETSHOW2:
MOV A,@R1
LCALL OUT_5952
NOP
NOP
AJMP KEY
NUM3:
INC R1
INC R1
INC R1
MOV A,@R1
CPL ACC.0
MOV @R1,A
LCALL OUT_5953
NOP
NOP
AJMP KEYBACK
KEYBACK:
AJMP KEY
NEXTNUM:
MOV A,R0
RL A
MOV R0,A
AJMP KEY
OK:
SETB EA
RET
TABLE1: MOV DPTR,#TAB
MOVC A,@A+DPTR
RET
TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
DELAY2s:
MOV R4,#5
MOV R5,#0
DLP:
DJNZ R5,$
DJNZ R4,DLP
RET
DELAY20ms:
MOV R5,#100
DLOOP:
MOV R6,#100
DJNZ R6,$
DJNZ R5,DLOOP
RET
DELAY200ms:
MOV R5,#36
MOV R4,#50
DLOP:
DJNZ R4,$
DJNZ R5,DLOP
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -