📄 万年历显示.asm
字号:
ORG 0000H
TEMPER_L EQU 56H
TEMPER_H EQU 55H
TEMPER_NUM EQU 60H
DQ BIT P3.5
MOV SP,#7
MOV R0,#0AH
MOV A,#2AH
MOVX @R0,A
INC R0
MOV A,#06H
MOVX @R0,A
MAIN: ACALL KEY
ACALL READ
ACALL CAI
ACALL GET_TEMPER ;调“读出转换后的温度值”
ACALL TEMPER_COV ;调“温度转换”
MOV A, TEMPER_NUM
ANL A, #0FH
MOV 2EH,A
MOV A, TEMPER_NUM
SWAP A
ANL A, #0FH
MOV 2FH,A
ACALL DISP
SJMP MAIN
;----------------------------;读DS12887并分配内部RAM
READ: MOV R2,#3
MOV R1,#20H
MOV R0,#00H
LP1: MOVX A,@R0
MOV @R1,A
INC R0
INC R0
INC R1
DJNZ R2,LP1
LP2: MOVX A,@R0
MOV @R1,A
INC R0
INC R1
CJNE R0,#0AH,LP2
RET
;--------------------------显示子程序
DISP: MOV R3,#00H
MOV R1,#3CH
LP4: MOV A,@R1
ORL A,R3
MOV P1,A
ACALL DELAY
DEC R1
MOV A,R3
ADD A,#10H
MOV R3,A
CJNE R3,#00H,LP4
RET
;-------------------------拆字分配RAM子程序
CAI: MOV A,20H
MOV B,#10
DIV AB
MOV 30H,B
MOV 31H,A
MOV A,21H
MOV B,#10
DIV AB
MOV 32H,B
MOV 33H,A
MOV A,22H
MOV B,#10
DIV AB
MOV 34H,B
MOV 35H,A
MOV 36H,23H
MOV A,24H
MOV B,#10
DIV AB
MOV 37H,B
MOV 38H,A
MOV A,25H
MOV B,#10
DIV AB
MOV 39H,B
MOV 3AH,A
MOV A,26H
MOV B,#10
DIV AB
MOV 3BH,B
MOV 3CH,A
RET
;------------------------键盘扫描
KEY: JB P2.3,OUT
ACALL DELAY2
JNB P2.3,$
MOV 70H,#0
MOV R0,#0BH
MOV A,#8EH
MOVX @R0,A
NT: JNB P2.3,TX1
JNB P2.0,TX2
JNB P2.1,TX3
JNB P2.2,TX4
ACALL FLASH
SJMP NT
TX1: ACALL KEY23
SJMP OUT
TX2: ACALL KEY20
SJMP NT
TX3: ACALL KEY21
SJMP NT
TX4: ACALL KEY22
SJMP NT
OUT: RET
;------------------闪烁子程序
FLASH: MOV R7,#10
LK1: ACALL READ
ACALL CAI
ACALL DISP
DJNZ R7,LK1
MOV R7,#10
ACALL JUDGE
KK1: ACALL DISP
DJNZ R7,KK1
;------------------判断修改单元
JUDGE: MOV A,70H
CJNE A,#0,NEXT
MOV 3CH,#0FH
MOV 3BH,#0FH
SJMP OUT2
NEXT: CJNE A,#1,NEXT_1
MOV 3AH,#0FH
MOV 39H,#0FH
SJMP OUT2
NEXT_1: CJNE A,#2,NEXT_2
MOV 38H,#0FH
MOV 37H,#0FH
SJMP OUT2
NEXT_2: CJNE A,#3,NEXT_3
MOV 36H,#0FH
SJMP OUT2
NEXT_3: CJNE A,#4,NEXT_4
MOV 35H,#0FH
MOV 34H,#0FH
SJMP OUT2
NEXT_4: CJNE A,#5,NEXT_5
MOV 33H,#0FH
MOV 32H,#0FH
SJMP OUT2
NEXT_5: CJNE A,#6,NEXT_6
MOV 31H,#0FH
MOV 30H,#0FH
SJMP OUT2
NEXT_6: MOV 3CH,#0FH
MOV 3BH,#0FH
OUT2: RET
;-------------------子键处理0
KEY23: ACALL DELAY
JB P2.3,OUT23
ACALL DELAY2
JNB P2.3,$
MOV R0,#0BH
MOV A,#06H
MOVX @R0,A
OUT23: RET
;---------------------子键1
KEY20: ACALL DELAY2
JB P2.0,OUT20
ACALL DELAY2
JNB P2.0,$
INC 70H
MOV A,70H
CJNE A,#7,OUT20
MOV 70H,#0
OUT20: RET
;--------------------子键2
KEY21: ACALL DELAY2
JB P2.1,OUT21
ACALL DELAY2
JNB P2.1,$
MOV A,70H
ADD A,70H
SETB 7FH
MOV DPTR,#TAB
JMP @A+DPTR
OUT21: RET
;--------------------子键3
KEY22: ACALL DELAY2
JB P2.2,OUT22
ACALL DELAY2
JNB P2.2,$
MOV A,70H
ADD A,70H
CLR 7FH
MOV DPTR,#TAB
JMP @A+DPTR
OUT22: RET
;?------------------子程序0
OPR0: MOV R0,#09H
MOVX A,@R0
JB 7FH,ADDYEAR
CJNE A,#0,MX
MOV A,#99
SJMP OT
ADDYEAR: CJNE A,#99,MX1
MOV A,#0
SJMP OT
MX1: INC A
SJMP OT
MX: DEC A
OT: MOVX @R0,A
RET
;?------------------子程序1
OPR1: MOV R0,#08H
MOVX A,@R0
JB 7FH,ADDMOUTH
CJNE A,#1,MX2
MOV A,#12
SJMP OT1
ADDMOUTH: CJNE A,#12,MX3
MOV A,#1
SJMP OT1
MX3: INC A
SJMP OT1
MX2: DEC A
OT1: MOVX @R0,A
RET
;?------------------子程序2
OPR2: MOV R0,#07H
MOVX A,@R0
JB 7FH,ADDDAY
CJNE A,#1,MX4
MOV A,#31
SJMP OT2
ADDDAY: CJNE A,#31,MX5
MOV A,#1
SJMP OT2
MX5: INC A
SJMP OT2
MX4: DEC A
OT2: MOVX @R0,A
RET
;?-------------------子程序3
OPR3: MOV R0,#06H
MOVX A,@R0
JB 7FH,ADDWEEK
CJNE A,#1,MX6
MOV A,#7
SJMP OT3
ADDWEEK: CJNE A,#7,MX7
MOV A,#1
SJMP OT3
MX7: INC A
SJMP OT3
MX6: DEC A
OT3: MOVX @R0,A
RET
;?--------------------子程序4
OPR4: MOV R0,#04H
MOVX A,@R0
JB 7FH,ADDHOUR
CJNE A,#0,MX8
MOV A,#23
SJMP OT4
ADDHOUR: CJNE A,#23,MX9
MOV A,#0
SJMP OT4
MX9: INC A
SJMP OT4
MX8: DEC A
OT4: MOVX @R0,A
RET
;?-------------------子程序5
OPR5: MOV R0,#02H
MOVX A,@R0
JB 7FH,ADDMIN
CJNE A,#0,MX10
MOV A,#59
SJMP OT5
ADDMIN: CJNE A,#59,MX11
MOV A,#0
SJMP OT5
MX11: INC A
SJMP OT5
MX10: DEC A
OT5: MOVX @R0,A
RET
;?-------------------子程序6
OPR6: MOV R0,#00H
MOVX A,@R0
JB 7FH,ADDSEC
CJNE A,#0,MX12
MOV A,#59
SJMP OT6
ADDSEC: CJNE A,#59,MX13
MOV A,#0
SJMP OT6
MX13: INC A
SJMP OT6
MX12: DEC A
OT6: MOVX @R0,A
RET
;----------------------读出转换后的温度值
GET_TEMPER:
LCALL INIT_1820
MOV A, #0CCH ; 跳过ROM匹配------0CC
LCALL WRITE_1820
MOV A, #44H ; 发出温度转换命令
LCALL WRITE_1820
LCALL INIT_1820
MOV A, #0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A, #0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ;READ_1820
RET
;-------------------写DS18B20的程序
WRITE_1820:
MOV R2, #8
CLR C
WR1: CLR DQ
MOV R3, #6
DJNZ R3, $
RRC A
MOV DQ, C
MOV R3, #23
DJNZ R3, $
SETB DQ
NOP
DJNZ R2, WR1
RET
;-------------------读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
MOV R4, #2 ; 将温度高位和低位从DS18B20中读出
MOV R1, #56H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00: MOV R2, #8
RE01: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3, #7
DJNZ R3, $
MOV C, DQ
MOV R3, #23
DJNZ R3, $
RRC A
DJNZ R2, RE01
MOV @R1, A
DEC R1
DJNZ R4, RE00
RET
;-------------------将从DS18B20中读出的温度数据进行转换
TEMPER_COV:MOV A, #0F0H
ANL A, TEMPER_L ; 舍去温度低位中小数点后的四位温度数值
SWAP A
MOV TEMPER_NUM, A
MOV A, TEMPER_L
JNB ACC.3, TEMPER_COV1 ; 四舍五入去温度值
INC TEMPER_NUM
TEMPER_COV1:MOV A, TEMPER_H
ANL A, #07H
SWAP A
ORL A, TEMPER_NUM
MOV TEMPER_NUM,A ; 保存变换后的温度数据
LCALL BIN_BCD
RET
;-------------------将16进制的温度数据转换成压缩BCD码
BIN_BCD:MOV DPTR, #TEMP_TAB
MOV A, TEMPER_NUM
MOVC A, @A+DPTR
MOV TEMPER_NUM, A
RET
;------------------18B20初始化
INIT_1820:CLR DQ
MOV R0, #200 ;持续400US的低电平
DJNZ R0, $ ;
SETB DQ ;上升沿
MOV R0, #32 ;64US
DJNZ R0, $
JNB DQ, INIT_1820
MOV R0, #80 ;160US
DJNZ R0, $ ; 延时
RET
;------------------延时子程序
DELAY2: MOV R6, #0FFH
QQ: MOV R7, #0FFH
DJNZ R7, $
DJNZ R6, QQ
RET
DELAY: MOV R5,#255
DJNZ R5,$
RET
;-----------------温度数值表
TEMP_TAB:DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,10H,11H,12H,13H,14H,15H
DB 16H,17H,18H,19H,20H,21H,22H,23H
DB 24H,25H,26H,27H,28H,29H,30H,31H
DB 32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H
DB 48H,49H,50H,51H,52H,53H,54H,55H
DB 56H,57H,58H,59H,60H,61H,62H,63H
DB 64H,65H,66H,67H,68H,69H,70H,71H
DB 72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H
DB 88H,89H,90H,91H,92H,93H,94H,95H
DB 96H,97H,98H,99H
;?---------------散转子程序表
TAB: AJMP OPR0
AJMP OPR1
AJMP OPR2
AJMP OPR3
AJMP OPR4
AJMP OPR5
AJMP OPR6
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -