📄 能闹铃秒表时钟1.asm
字号:
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 DS20MS ;消抖
JB P1.1,SET41 ;干扰,返回调分等待
FUNSUB1: JNB P1.1,FUNSUB1 ;等待键放开
MOV R0,#77H ;
LCALL SUB1 ;分减1程序
LJMP SET4 ;返回调分等待
;
SET41: LJMP SET4 ;
;FUNSUBB,时减1程序 ;
FUNSUBB: LCALL DS20MS ;消抖
JB P1.1,SET61 ; 干扰,返回调时等待
FUNSUBB1: 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,DISPFIRST ;指向显示数据首址
MOV R5,#0FEH ;扫描控制字初值
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.2,LOOP5 ;小数点处理
CLR P0.7 ;
LOOP5: JB ACC.4,LOOP6 ;小数点处理
CLR P0.7 ;
LOOP6: LCALL DL1MS ;显示1MS
INC R1 ;指向下一地址
MOV A,R5 ;扫描控制字放入A
JNB ACC.5,ENDOUT ;ACC.5=0时一次显示结束
RL 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 R1,DISPFIRST
MOV R5,#0FEH ;扫描控制字初值
SPLAY: MOV A,R5 ;扫描字放入A
MOV P2,A ;从P2口输出
MOV A,@R1 ;取显示数据到A
MOV DPTR,#TABS ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P0,A ;段码放入P1口
MOV A,R5 ;
LCALL DL1MS ;显示1MS
INC R1 ;指向下一地址
MOV A,R5 ;扫描控制字放入A
JNB ACC.5,ENDOUTS ;ACC.5=0时一次显示结束
RL A ;A中数据循环左移
MOV R5,A ;放回R5内
AJMP SPLAY ;跳回PLAY循环
ENDOUTS: MOV P2,#0FFH ;一次显示结束,P2口复位
MOV P0,#0FFH ;P0口复位
RET ;子程序返回
TABS: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0C6H,0BFH,88H
; 显示数 "0 1 2 3 4 5 6 7 8 9 不亮 C - A "
; 内存数 "0 1 2 3 4 5 6 7 8 9 0AH 0BH 0CH 0DH "
;STAB表,启动时显示2006年12月23日、C04-2-28(学号)用
STAB: DB 0AH,0AH,0AH,0AH,0AH,0AH,08H,02H,0CH,02H,0CH,04H,00H,0BH,0AH,0AH
DB 03H,02H,0CH,02H,01H,0CH,06H,00H,00H,02H,0AH,0AH,0AH,0AH,0AH,0AH
; 注:0A不亮,0B显示“A”,0C显示“-”
;
;***********************************************************
;ST,上电时显示年月班级用,采用移动显示,先右移,接着左移.
;***********************************************************
ST: MOV R0,#40H ;将显示内容移入40H-5FH单元
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 DISPFIRST,#40H ;以下程序从左往右移
SSLOOP: MOV R2,#50 ;控制移动速度
SSLOOP1: LCALL SDISPLAY ;
DJNZ R2,SSLOOP1 ;
INC DISPFIRST
MOV A,DISPFIRST
CJNE A,#5AH, SSLOOP ;
MOV DISPFIRST,#5AH ;以下程序从右往左移
MOV R3,#1BH ;显示27个单元
SSLOOP2: MOV R2,#32H ;控制移动速度
SSLOOP12: LCALL SDISPLAY ;
DJNZ R2,SSLOOP12 ;
DEC DISPFIRST
DJNZ R3,SSLOOP2 ;
RET
;*******************************************
;; 延时程序 ;;
;*******************************************
;
;1MS延时程序,LED显示程序用
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象
DS20MS: CLR BELL
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
SETB BELL
RET
;延时程序,用作按键时间的长短判断
DL1S: LCALL DL05S
LCALL DL05S
RET
DL05S: MOV R3,#20H ;8毫秒*32=0.196秒
DL05S1: LCALL DISPLAY
DJNZ R3,DL05S1
RET
;*************************************
;以下是闹铃时间设定程序中的时调整程序
;*************************************
DSSFUNN: LCALL DISPLAY ;等待键释放
JNB P1.3, DSSFUNN
MOV 50H,#0AH ;时调整时显示为00:00:- .
MOV 51H,#0CH
WAITSS: SETB EA
LCALL DISPLAY
JNB P1.2,FFFF ;时加1键
JNB P1.0,DDDD ;时减1
JNB P1.3,OOOO ;闹铃设定退出键
JNB P1.1,ENA ;闹铃设定有效或无效按键
AJMP WAITSS
OOOO: LCALL DS20MS ;消抖
JB P1.3, WAITSS
DSSFUNNM: LCALL DISPLAY ;键释放等待
JNB P1.3, DSSFUNNM
MOV DISPFIRST,#70H
LJMP START1
ENA: LCALL DS20MS ;消抖 ;
JB P1.1, WAITSS
DSSFUNMMO: LCALL DISPLAY ;键释放等待
JNB P1.1, DSSFUNMMO
CPL 05H
JNB 05H,WAITSS11
MOV 50H,#00H ;05H=1,闹铃开,显示为 00:00: 0。
AJMP WAITSS
WAITSS11: MOV 50H,#0aH ;闹铃不开,显示为00:00:- .
AJMP WAITSS
FFFF: LCALL DS20MS ;消抖 ;
JB P1.2, WAITSS
DSSFUNMM: LCALL DISPLAY ;键释放等待
JNB P1.2, DSSFUNMM
CLR EA
MOV R0,#55H
LCALL ADD1
MOV A,R3 ;
CLR C ;
CJNE A,#24H,ADDHH33N ;
ADDHH33N: JC WAITSS ;小于24点返回
ACALL CLR0 ;大于等于24点清零
AJMP WAITSS
DDDD : LCALL DS20MS ;消抖 ;
JB P1.0, WAITSS
DSSFUNDD: LCALL DISPLAY ;键释放等待
JNB P1.0, DSSFUNDD
CLR EA
MOV R0,#55H
LCALL SUBB1
LJMP WAITSS
;*********************
;以下是闹铃判断子程序
;*********************
BAOJ: JNB 05H,BBAO ;05H=1,闹钟开,要比较数据
MOV A,79H ;从时十位、个位、分十位、分个位顺序比较
CJNE A,55H,BBAO
MOV A,78H
CLR C
BB3: CJNE A,54H,BBAO
MOV A,77H
CLR C
CJNE A,53H,BBAO
MOV A,76H
CLR C
BB2: CJNE A,52H,BBAO
JNB 07H,BBAO ;07H在1秒到时会取反
CLR BELL ;时分相同时呜叫(1秒间隔叫)
RET
;
BBAO: SETB BELL ;不相同或闹铃不开
RET
;********************************************************
END ;程序结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -