📄 data.txt
字号:
;子程序返回
;
SUB11:
MOV
A,#59H
AJMP
SUB111
SUB1110: MOV
A,R3
;移入R3寄存器
ANL
A,#0FH
;高四位变0
MOV
@R0,A
AJMP
SUB110
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 时减1子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
SUBB1: MOV
A,@R0
;取当前计时单元数据到A
DEC
R0
;指向前一地址
SWAP
A
;A中数据高四位与低四位交换
ORL
A,@R0
;前一地址中数据放入A中低四位
JZ
SUBB11
;00减1为23h
DEC
A
;A减1操作
SUBB111:MOV
R3,A
;移入R3寄存器
ANL
A,#0FH
;高四位变0
CLR
C
;清进位标志
SUBB
A,#0AH
SUBB1111:JC
SUBB1110
MOV
@R0,#09H
;时个位大于0AH,为9
SUBB110:MOV
A,R3
;取回R3中暂存数据
INC
R0
;指向当前地址单元
SWAP
A
;A中数据高四位与低四位交换
ANL
A,#0FH
;高四位变0
MOV
@R0,A
;时十位数数据放入
RET
;子程序返回
;
SUBB1110:MOV
A,#23H
AJMP
SUBB111
SUBB1110:MOV
A,R3
;时个位小于0A不处理
ANL
A,#0FH
;高四位变0
MOV
@R0,A
;个位移入
AJMP
SUBB110
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 清0程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;对计时单元复0用
CLR0:CLR
A
;清累加器
MOV
@R0,A
;清当前地址单元
DEC
R0
;指向前一地址
MOV
@R0,A
;前一地址单元清0
RET
;子程序返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 时钟调整程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;当调时按键按下时进入此程序
SETMM:CLR
ET0
;关定时器T0中断
CLR
TR0
;关闭定时器T0
LCALL
DLIS
;调用1s延时程序
JB
P1.0,CLOSEDIS ;键按下时间短于1s,关闭显示(省电)
MOV
R2,#06H
;进入调时状态,赋闪烁定时初值
SETB
ET1
;允许T1中断
SETB
TR1
;开启定时器T1
SET2:
JNB
P1.0,SET1
;P1.0口为0(键未释放),等待
SETB
00H
;键释放,分调整闪烁标志置1
SET4:
JB
P1.0,SET3
;等待键按下
LCALL
DL05S
;有键按下,延时0.5s
JNB
P1.0,SETHH
;按下时间长于0.5s,转调[小]时状态
MOV
R0,#77H
;按下时间长于0.5s,加1min操作
LCALL
ADD1
;调用加1子程序
MOV
A,R3
;取调整单元数据
CLR
C
;清进位标志
CJNE
A,#60H,HHH
;调整单元数据与60比较
HHH:
JC
SET4
;调整单元数据小于60,转SET4循环
LCALL
CLR0
;调整单元数据大于或等于60时,清0
CLR
C
;清进位标志
AJMP
SET4
;跳转到SET4循环
CLOSEDIS:SETB
ET0
; 省电(LED不显示)状态,开T0中断
SETB
TR0
;开启T0定时器(开时钟)
CLOSE: JB
P1.0,CLOSE ;无按键按下,等待
LCALL
DISPLAY
;有键按下,调显示子程序延时消抖
JB
P1.0,CLOSE
;是干扰,返回CLOSE等待
WAITH: JNB
P1.0,WAITH
;等待键释放
LJMP
START1
;返回主程序(LED数据显示亮)
SETHH: CLR
00H
;分闪烁标志清除(进入调[小]时状态
SETHH1: JNB
P1.0,SET5
;等待键释放
SETB
01H
;[小]时调整标志置1
SET6: JB
P1.0,SET7
;等待键按下
LCALL
DL05S
;有键按下,延时0.5s
JNB
P1.0,SETOUT ;按下时间长于0.5s,退出时间调整
MOV
R0,#79H
;按下时间短于0.5s,加1h操作
LCALL
ADD1
;调加1子程序
MOV
A,R3
CLR
C
CJNE
A,#24H,HOUU ;计时单元数据与24比较
HOUU:
JC
SET6
;小于24,转SET6循环
LCALL
CLR0
;大于或等于24时,清0操作
AJMP
SET6
;跳转到SET6循环
SETOUT:
JNB
P1.0,SETOUT1
;调时退出程序。等待键释放
LCALL
DISPLAY
;延时消抖
JNB
P1.0,SETOUT
;是抖动,返回SETOUT再等待
CLR
01H
;清调[小]时标志
CLR
00H
;清调分标志
CLR
02H
;清闪烁标志
CLR
TR1
;关闭定时器T1
CLR
ET1
;关定时器T1中断
SETB
TR0
;开启定时器T0
SETB
ET0
;开定时器T0中断(计时开始)
LJMP
START1
;跳回主程序
SET1: LCALL
DISPLAY
;键释放等待时调用显示程序(调分)
AJMP
SET2
;防止键按下时无时钟显示
SET3: LCALL
DISPLAY
;等待调分按键时时钟显示用
JNB
P1.1,FUNSUB ;减1分操作
AJMP
SET4
;调分等待
SET5: LCALL
DISPLAY
;键释放等待时调用显示程序(调[小]时)
AJMP
SETHH1
;防止键按下时无时钟显示
SET7: LCALL
DISPLAY
;等待调[小]时按键时时钟显示用
JNB
P1.1,FUNSUBB;[小]时减1操作
AJMP
SET6
;调时等待
SETOUT1:LCALL
DISPLAY
退出时钟调整时键释放等待
AJMP
SETOUT
;防止键按下时无时钟显示
;FUNSUB,分减1程序?
FUNSUB: LCALL
DISPLAY
;消抖动
JB
P1.1,SET41
;干扰,返回调分等待
FUNSUB1: JNB
P1.1,FUNSUB1 ;等待键放开
MOV
R0,#77H
LCALL
SUB1
;分减1程序
LJMP
SET4
;返回调分等待
;
SET41:LJMP
SET4
;FUNSUBB,时减1程序
FUNSUBB:LCALL
DISPLAY
;消抖动
JB
P1.1,SET61
;干扰,返回调时等待
JUNSUBB1:JNB
P1.1,FUNSUBB1 ;等待键放开
MOV
R0,#79H
LCALL
SUBB1
;时减1程序
LJMP
SET6
;返回调时等待
;
SET61:
LJMP
SET6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 显示程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;显示数据在70H~75H单元内,用六位LED共阳数码管显示,P0口输出段码数据,P2口
;作扫描控制,每个LED数码管亮1ms时间,再逐位循环。
DISPLAY:MOV
R1,#70H
;指向显示数据首址
MOV
R5,#0DFH
;扫描控制字初值
PLAY:MOV
A,R5
;扫描字放入A
MOV
P2,A
;从P2口输出
MOV
A,@R1
;取显示数据到A
MOV
DPTR,#TAB
;取段码表地址
MOVC
A,@A+DPTR ;查显示数据对应段码
MOV
P0,A
;段码放入P1口
MOV
A,R5
JB
ACC.1,LOOP5 ;小数点处理
CLR
P0.7
LOOP5: JB
ACC.3,LOOP6 ;小数点处理
CLR
P0.7
LOOP6: LCALL
DLIMS
;显示1ms
JNC
R1
;指向下一地址
MOV
A,R5
;扫描控制字放入A
JNB
ACC.0,ENDOUT;ACC.0=0时,一次显示结束
RR
A
;A中数据循环左移
MOV
R5,A
;放回R5内
MOV
P0,#0FFH
AJMP
PLAY
;跳回PLAY循环
ENDOUT: MOV
P2,#0FFH
;一次显示结束,P2口复位
MOV
P0,#0FFH
;P0口复位
RET
;子程序返回
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,
0FFH,88H,0BFH
;共阳段码表 “0”“1”“2”“3”“4”“5”“6”“7”“8”“9”“不亮”“A”“—”
;
;SDISPLAY,上电显示程序
;不带小数点显示,有“A”“—”显示功能
SDISPLAY:MOV
R5,#0DFH
;扫描控制字初值
SPLAY:MOV
A,R5
;扫描字放入A
MOV
P2,A
;从P2口输出
MOV
A,@R1
;取显示数据到A
MOV
DPTR,#TABS
;取段码表地址
MOVC
A,@A+DPTR
;查显示数据对应段码
MOV
P0,A
;段码放入P0口
MOV
A,R5
LCALL
DL1MS
;显示1ms
INC
R1
;指向下一地址
MOV
A,R5
;扫描控制字放入A
JNB
ACC.0,ENDOUTS ;ACC.0=0时,一次显示结束
RR
A
;A中数据循环左移
MOV
R5,A
;放回R5内
AJMP
SPLAY
; 跳回PLAY循环
ENDOUTS: MOV
P2,#0FFH
;P0口复位
MOV
P0,#0FFH
;子程序返回
RET
TABS:DB 0CH,0F9H,04AH,0B0H,99H,92H,82H,0F8H,80H,90H,
0FFH,88H,0BFH
;STAB表,启动时显示2003—12—07(制作年月日)、A01—2—28(班级学号)
;
STAB:DB 0AH,0AH,0AH,0AH,0AH,0AH,08H,02H,0CH,02H,0CH,01H,00H,0BH,0AH,0AH
DB 07H,00H,0CH,02H,01H,0CH,03H,00H,00H, 02H,0AH,0AH,0AH,0AH,0AH,0AH
;注:0A不亮,0B显示“A”,0C显示“—”
;
;ST 子程序,上电时显示年月日班级用,采用移动显示
ST:MOV
R0,#40H
MOV
R2 ,#20H
MOV
R3,#00H
CLR
A
MOV
DPTR,#STAB
SLOOP: MOVC
A,@A+DPTR
MOV
@R0,A
MOV
A,R3
INC
A
MOV
R3,A
INC
R0
DJNZ
R2,SLOOP
;移入完毕
MOV
R1,#5AH
MOV
R3,#1BH
;显示27个单元
SSLOOP:
MOV
R2,#32H
;控制移动速度
SSLOOP1:
LCALL
SDISPLAY
DJNZ
R2,SSLOOP11
MOV
A,R1
SUBB
A,#07H
;显示首址修正为低1个单元
MOV
R1,A
DJNZ
R3,SSLOOP
RET
SSLOOP11: MOV
A,R1
;指针修正为原值
SUBB
A,#06H
MOV
R1,A
AJMP
SSLOOP1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 延时程序
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;1ms延时程序,LED显示程序用
DL1MS:MOV
R6,#14H
DL1:MOV
R7,#19H
DL2:DJNZ
R7,DL2
DJNZ
R6,DL1
RET
;20ms延时程序,采用调用显示子程序,以改善LED的显示闪烁现象
DS20MS:ACALL
DISPLAY
ACALL
DISPLAY
ACALL
DISPLAY
RET
;延时程序,用作按键时间的长短判断
DLIS:LCALL
DL05S
LCALL
DL05S
RET
DL05S:MOV
R3,#20H
;8ms*32=0.196s
DL05S1:LCALL
DISPLAY
DJNZ
R3,DL05S1
RET
;
END
;程序结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -