📄 shuzizhong.asm
字号:
;****************** 主程序*****************************
ORG 0000H
AJMP MAIN
ORG 000BH
LJMP CLOCK ;转时钟程序
ORG 0100H
PORT EQU 4400H ;定义8155控制寄存器、A、B、C端口符号地址
PORTA EQU 4401H
PORTB EQU 4402H
PORTC EQU 4403H
SECBIT EQU 08H ;定义各标识位符号地址
MINBIT EQU 09H
HOURBIT EQU 0AH
RMINBIT EQU 0BH
RHOURBIT EQU 0CH
RTIMBIT EQU 0DH
ARMBIT EQU 0EH
TIMDATA EQU 30H
RTIMDATA EQU 31H
MSEC1 EQU 32H
MSEC2 EQU 33H
SEC EQU 34H
MIN EQU 35H
HOUR EQU 36H
RSEC EQU 37H
RMIN EQU 38H
RHOUR EQU 39H
COUNT EQU 3AH
MAIN: MOV SP,#60H
MOV DPTR,#PORT
MOV A,#03H ;设8155A、B口输出,C口输入
MOVX @DPTR,A
MOV 21H,#00H ;清零闹钟标识位
MOV RHOUR,#00H ;设置闹钟单元初值
MOV RMIN,#00H
MOV RSEC,#00H
MOV HOUR,#00H ;设置时钟单元初值
MOV MIN,#00H
MOV MSEC1,#00H
MOV MSEC2,#00H
MOV TIMDATA,#00H ;时钟修改记忆单元清零
MOV RTIMDATA,#00H ;闹钟修改记忆单元清零
MOV COUNT,#00H ;闹钟保持10S计时单元清零
MOV TMOD,#02H ;定时器T0方式2
MOV TL0,#06H ;定时250us初始值
MOV TH0,#06H
SETB EA ;中断允许
SETB ET0
SETB TR0 ;启动定时器
MOV B,#SEC ;时钟单元首地址送B
BEGIN: LCALL KEYTEST ;调用判别键入测试程序
JNZ RETEST ;有键入则转去抖程序
LCALL DISPLAY ;无键入调用显示程序
JNB ARMBIT,BEGIN ;判别闹钟设定标识位
LCALL ALARM ;调闹钟程序
AJMP BEGIN ;返回
RETEST: LCALL DISPLAY ;调用显示子程序延时去抖
LCALL KEYTEST
JNZ KEDATA ;若无抖动,则查键号,否则返回
LJMP BEGIN
KEDATA: LCALL SERCH ;调键号测试程序
CJNE A,#00H,NEXT1 ;判别是否时钟修改功能键
LCALL FTION0 ;是时钟参数修改功能键则调用时钟修改程序
SJMP NEXT3
NEXT1: CJNE A,#01H,NEXT2 ;判别是否闹钟修改功能键
LCALL FTION1 ;是闹钟参数修改功能键则调用闹钟设定程序
SJMP NEXT3
NEXT2: CJNE A,#02H,NEXT3 ;判别是否加1功能键
LCALL CUM ;是加1功能键则调用加1修改程序
NEXT3: SJMP BEGIN ;循环返回
;**************************** 时钟参数修改子程序FTION0*******************************
;功能:根据时钟修改功能键按下的次数,分别将时钟修改标识位SECBIT、MINBIT、HOURBIT置“1”
;入口:TIMDAT,时钟修改功能键按下次数,每按一次时钟修改功能鍵,该单元内容加1
;出口:TIMDAT、SECBIT、HOURBIT,根据当前TIMDAT的次数,分别将对应时钟修改标识位置1
FTION0: CLR TR0 ; 关定时器
CLR RMINBIT ;禁止闹钟参数修改,清闹钟分修改标识位0BH
CLR RHOURBIT ;清闹钟小时修改标识位0CH
MOV B,#SEC ;将时钟秒单元设为显示首地址
MOV RTIMDATA,#00H ;清闹钟修改位置标识记录
INC TIMDATA ;将时钟修改记录值加1
MOV A,TIMDATA
CJNE A,#01H,TW0 ;若记录值为1,则将时钟秒修改标识置1
SETB SECBIT ;时钟秒标识位08H置1
LJMP BAC0
TW0: CJNE A,#02H,THREE0 ;若记录值为1,则将时钟秒个性标识置1
CLR SECBIT ;时钟秒标识位08H清零
SETB MINBIT ;时钟分标识位09H置1
LJMP BAC0
THREE0: CJNE A,#03H,BACK ;若记录值为3,则将时钟小时修改标识置1
CLR MINBIT ;时钟分标识位清零
SETB HOURBIT ;时钟小时标识位0AH置1
LJMP BAC0
BACK: MOV TIMDATA,#00H ;若按4次,则清时钟单元修改位置记录
CLR HOURBIT ;时钟小时标识位0AH清零
SETB TR0 ;定时器重新启动
BAC0: RET
;**********************闹钟参数修改功能键设定子程序FTION1*****************************
;功能:根据闹钟修改功能键按下的次数,分别将闹钟修改标识位RMINBIT、RHOURBIT置“1”
;入口:RTIMDAT,闹钟修改功能键按下次数,每按下一次闹钟修改功能键,该单元内容加1
;出口:RTIMDAT、ARMBIT、B、RMINBIT、RHOURBIT,根据当前RTIMDAT的次数,分别将对应闹钟修改标识位置1,
;并设置闹钟参数显示单元首地址和闹钟启动标志
FTION1: CLR SECBIT ;08H清零,禁止时钟时间修改
CLR MINBIT ;时钟秒标识位09H清零
CLR HOURBIT ;时钟小时标识位0AH清零
MOV B,#RSEC ;将闹钟单元地址设为显示首地址
MOV TIMDATA,#00H
INC RTIMDATA ;将闹钟个性记录值加1
MOV A,RTIMDATA
CJNE A,#01H,TOW1
SETB RMINBIT ;若记录值为1,则将闹钟分单元修改标识位0BH
LJMP BAC1 ;置1
TOW1: CJNE A,#02H,THREE1
CLR RMINBIT ;若记录值为2,则将闹钟分单元修改标识位0BH
SETB RHOURBIT ;清零,将闹钟小时单元修改标识位0CH置1
LJMP BAC1
THREE1: CLR RHOURBIT ;将闹钟小时单元修改标识位0CH清零
SETB ARMBIT ;F0标识位为1表示闹钟已设定
MOV B,#SEC ;恢复时钟显示单元首地址
MOV RTIMDATA,#00H ;将闹钟修改记录值清零
BAC1: RET
;************************加1键修改子程序CUM*******************************************
;功能:根据时钟和闹钟修改标识位的状态,将时钟或闹钟对应显示单元内容加1
;入口:SECBIT、MINBIT、RSECBIT、RMINBIT、RHOURBIT,若其中某标识位已被置“1”,将对应的时钟或闹钟显示单元内容加1
;出口:34H~39H,时钟或闹钟显示单元
CUM: JNB SECBIT,CUM0
MOV A,SEC
ADD A,#01H
DA A
MOV SEC,A
CJNE A,#60H,CUMEND
MOV SEC,#00H
LJMP CUMEND
CUM0: JNB MINBIT,CUM1
MOV A,MIN
ADD A,#01H
DA A
MOV MIN,A
CJNE A,#60H,CUMEND
MOV MIN,#00H
LJMP CUMEND
CUM1: JNB HOURBIT,CUM2
MOV A,HOUR
MOV A,#01H
DA A
MOV HOUR,A
CJNE A,24H,CUMEND
LJMP CUMEND
CUM2: JNB RMINBIT,CUM3
MOV A,RMIN
ADD A,#01H
DA A
MOV RMIN,A
CJNE A,#60H,CUMEND
MOV RMIN,#00H
LJMP CUMEND
CUM3: JNB RHOURBIT,CUMEND
MOV A,RHOUR
ADD A,#01H
DA A
MOV RHOUR,A
CJNE A,#24H,CUMEND
MOV RHOUR,#00H
CUMEND: RET
;*******************闹钟判断与启动程序ALARM*********************
;
;
;
ALARM: MOV A,RMIN
CJNE A,MIN,DONT0
MOV A,RHOUR
CJNE A,HOUR,DONT0
CLR P1.0
SETB RTIMBIT
DONT0: MOV A,COUNT
CJNE A,#10,DONT
MOV COUNT,#00H
SETB P1.0
CLR ARMBIT
CLR RTIMBIT
DONT: RET
;***********************测键入子程序KEYTEST*************************
;功能:判断是否有键输入
;入口:无
;出口:累加器A,A的内容为0表示无键输入,A的内容指针指向8155的A口
KEYTEST: MOV DPTR,#PORTA ;DPTR指针指向8155的A口
MOV A,#00H
MOVX @DPTR,A ;扫描字00H送8155的A口
MOV DPTR,#PORTC ;DPTR指针指向8155的C口
MOVX A,@DPTR ;读入C口运行状态
CPL A ;A取反
ANL A,#0FH ;屏蔽高4位
RET
;************************时钟修正中断服务子程序CLOCK*****************
;功能:通过定时器中断,自动修改时钟参数
;入口:MSEC1、MSEC2、、SEC、MIN、HOUR,时钟毫秒、秒、分、时单元,存放原时钟参数
;出口:MSEC1、MSEC2、、SEC、MIN、HOUR,时钟毫秒、秒、分、时单元,存入修改后的时钟参数
CLOCK: CLR EA ;关中断
PUSH PSW ;保护现场
PUSH ACC
SETB RS1
INC MSEC1
MOV A,MSEC1
CJNE A,#28H,BACK1
MOV MSEC1,#00H
INC MSEC2
MOV A,MSEC2
CJNE A,#64H,BACK1
MOV MSEC2,#00H
JNB RTIMBIT,BACK0
INC COUNT
BACK0: MOV A,SEC
ADD A,#01H
DA A
MOV SEC,A
CJNE A,#60H,BACK1
MOV SEC,#00H
MOV A,MIN
ADD A,#01H
DA A
MOV MIN,A
CJNE A,#60H,BACK1
MOV MIN,#00H
MOV A,HOUR
ADD A,#01H
DA A
MOV HOUR,A
CJNE A,#24H,BACK1
MOV HOUR,#00H
BACK1: POP ACC
POP PSW
SETB EA
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -