51单片机汇编语言万年历完美版
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
;**************万年历制作 BY----信工七班
;****************************
;*****************************
;-----------------------------------------------------------------------------------------
RCK BIT P0.5
SCK BIT P0.4
DAT BIT P0.7
RST BIT P0.6
BUZZER BIT P1.3 ;蜂鸣器
BYTE EQU 40H ;用于给锁存器送入数据
GEWEI EQU 41H ;用于存放数码管显示的第一位
SHIWEI EQU 42H ;用于存放数码管显示的第二位
BAIWEI EQU 43H ;用于存放数码管显示的第三位
QIANWEI EQU 44H ;用于存放数码管显示的第四位
TEMP1 EQU 45H
TEMP2 EQU 46H
COUNT EQU 47H ;用于扩展定时器计数时间
KTIME EQU 49H
TEMP EQU 50H
DMS EQU 51H ;用于存放运动秒表的最低位
DSECOND EQU 52H ;用于存放运动秒表的秒
DMIN EQU 53H ;用于存放运动秒表的分钟
CLKMIN EQU 54H ;用于存放闹钟分钟
CLKHOUR EQU 55H ;用于存放闹钟时
CLKF EQU 56H ;用于闹钟开启的标志位
;-----------------------------------------------------------------------------------------
ORG 0000H
AJMP MAIN
ORG 000BH ;定时器0中断入口地址
AJMP T0_INT
ORG 001BH ;定时器1中断入口地址
AJMP T1_INT
;********************************主程序*************************************************
;-----------------------------------------------------------------------------------------
MAIN: MOV R4,#00 ;计数秒
MOV R5,#50 ;计数分
MOV R6,#15 ;计数时
MOV R0,#14H ;2013年
MOV R1,#0DH
MOV R2,#6 ;6月
MOV R3,#18 ;18日
MOV COUNT,#0H
MOV A,#5 ;开始使A不等于0,用于后面的判断
MOV CLKMIN,#0H
MOV CLKHOUR,#0H
MOV CLKF,#0H
MOV SP,#60H
MOV TMOD,#11H ;设置定时器0为工作模式1
MOV TH0, #03CH
MOV TL0, #0B0H ;定时50000 us
MOV TH1, #0D8H
MOV TL1, #0F0H ;定时1000us=1MS
SETB ET0 ;允许定时器中断
SETB ET1
SETB EA ;允许全局中断
SETB PT0 ;定时器中断设为高优先级
SETB EX0 ;允许外部中断
SETB EX1
SETB IT0 ;外部中断设为下降沿触发
SETB IT1
SETB TR0 ;启动定时器
;---------------------------------------
START: MOV DPTR,#TABLE
LJMP KEYSCAN ;首先进入时间显示,由于地址相差太远所以代码顺序有所改变
;--------------------------------------
MARK2: LJMP KEYSCAN ;地址差跳远无法跳转,此处进行中间跳转到时间显示界面
KEYCLK: MOV A,CLKF ;此处为闹
钟设置刚进入时的程序,由按键s12进入
JNZ KEYCLKF ;进入后通过CLKF来判断闹钟功能是否启动,未启动时正常
;显示为SHOWCLKF,启动时显示SHOWCLKF1,此两种显示差一个数码管最低位标志的点
KEYCLK1: LCALL SHOWCLK ;此处判定未启动闹钟功能时的显示
LCALL S4 ;在闹钟界面查看有无切换显示模式(此处也可认为是确定
;按键)的按键s4按下,
JZ MARK2 ;按下后跳转到时间显示
LCALL S8 ;在闹钟显示界面下查看启动闹钟功能的键s8是否按下
MOV A,CLKF
JNZ KEYCLKF ;按下后显示SHOWCLKF1的显示
LCALL S16 ;未按下则显示没有闹钟标志的数码管显示,再查看有无进
;入调节s16的键按下,
CJNE A,#7EH,KEYCLK1 ;未按下继续闹钟界面显示
KEYCLK2: LCALL SCLKMIN ;按下进入调节
MOV A,CLKMIN ;显示设置分钟的调节
MOV TEMP,A
LCALL KEYSUB1 ;通过加减键s8,s12来设置闹钟
LCALL KEYADD1
MOV A,TEMP
SUBB A,#60 ;调节分钟不超过59
JC REMAIN0
MOV TEMP,#0
REMAIN0: MOV A,TEMP
MOV CLKMIN,A
LCALL S16 ;查看有无进入调节s16的键按下,
CJNE A,#7EH,KEYCLK2 ;未按下继续显示分钟调节
KEYCLK3: LCALL SCLKHOUR ;按下进入显示时调节
MOV A,CLKHOUR
MOV TEMP,A ;送入参数,通过加减键进行调节设置
LCALL KEYSUB2
LCALL KEYADD2
MOV A,TEMP
SUBB A,#24 ;时的设置不超过24
JC REMAIN1
MOV TEMP,#0 ;超过24置0
REMAIN1: MOV A,TEMP
MOV CLKHOUR,A
LCALL S16
CJNE A,#7EH,KEYCLK3 ;再次判断有无调节的切换键(按3次为确定)按下
KEYCLK4: LCALL SHOWCLK ;按下后跳转为闹钟的界面正常显示
LCALL S4 ;再判断有无切换显示模式的键按下,按下跳转显示
JZ KEYSCAN
LCALL S8 ;再判断有无启动(关闭)闹钟功能的键按下
MOV A,CLKF ;根据CLKF(闹钟功能启动)的标志位显示不同的闹钟界面
JNZ KEYCLKF ;闹钟功能启动,跳转到KEYCLKF显示闹钟启动标记
GOON: LCALL S16 ;未启动则又判断有无进入调节的键按下
CJNE A,#7EH,KEYCLK4 ;没有按下继续正常显示
AJMP KEYCLK2 ;按下后重复KEYCLK2开始的内容
KEYCLKF: LCALL SHOWCLK1 ;显示出闹钟功能启动后的标记(数码管最低位标记)
LCALL S4 ;查看有无切换显示模式(闹钟设置确定后)键按下
JZ KEYSCAN ;按下后跳转到显示时间的界面
LCALL S8 ;未按则扫描开启(关闭)闹钟功能的键按下
MOV A,CLKF
JZ KEYCLK4 ;根据闹钟功能的标记位跳转显示,若判断闹钟功能关闭则
;跳转到KEYCLK4 显示无标志的闹钟
LCALL S16 ;若判断闹钟功能开启则扫描有无进入调节的按键s16按下
CJNE A,#7EH,KEYCLKF ;未按下则继续显示有标记的闹钟界面
AJMP KEYCLK2 ;按下后则又进入调节界面KEYCLK2
;--------------------------------------------------
MARK3: LJMP MARK1 ;地址差跳远无法跳转,此处进行中间跳转到闹钟界面
;----------------------------------------------------
KEYSCAN: LCALL HOURMINUTE ;显示时间
PUSH ACC ;为s12的判断先把A入堆栈,否则s12出会出现判断错误
LCALL S4 ;查看有无切换键s4按下,按下跳转显示秒
JZ KEYSCAN1
MOV A,CLKF ;在显示时间时判断闹钟功能是否开启,未开则跳转显示
JZ GO
MOV A,R6 ;判断是否与闹钟设置的时间相等,R6---时
CJNE A,CLKHOUR,GO
MOV A,R5 ;R5--分
CJNE A,CLKMIN,GO
LCALL SOUND ;闹钟功能开启,时分相等,则闹铃响
;--------------------------------------------------
GO: POP ACC ; 如果不pop,A=0一直成立,此时出现错误跳转
LCALL S12 ;查看有无进入闹钟设置的键按下
JZ MARK3 ; 按下则跳入显示闹钟设置界面
LCALL S16 ;查看有无进入调节键s16按下,按下进入调节
CJNE A,#7EH,KEYSCAN ;未按下则 继续显示时间
SMINUTE: LCALL MINUTE ;s16按下后进入分调节显示
MOV TEMP,R5 ;将要调节的分钟送入函数参数
LCALL KEYADD1 ;进入调节后查看是否按下加法键s8,按下加一
LCALL KEYSUB1 ;进入调节后查看是否按下减法键s8,按下减一
MOV A,TEMP
SUBB A,#60 ;调节不超过60
JC REMAIN2
MOV TEMP,#0
REMAIN2: MOV R5,TEMP ;把运算完后的分钟送出显示
LCALL S16
CJNE A,#7EH,SMINUTE ;没有s16按下,继续显示分调节
SHOUR: LCALL HOUR ;按下后进入显示时调节
MOV TEMP,R6 ;R6为 装时 的寄存器,送入参数进行调节
LCALL KEYADD2
LCALL KEYSUB2
MOV A,TEMP
SUBB A,#24 ;调节不超过24
JC REMAIN3
MOV TEMP,#0
REMAIN3: MOV R6,TEMP
LCALL S16 ; 再次按下s16键可确定时间调节完成
CJNE A,#7EH,SHOUR
AJMP KEYSCAN ;调节完后重新正常显示时间
;---------------------------------------
;---------------------------------------
KEYSCAN1: LCALL SHOWSECOND ;按切换键s4后进入的秒显示
LCALL S4 ;与时间显示的时候一样查看有无切换模式的键按下
JZ KEYSCAN2 ;按下则跳转显示日期
LCALL S12 ;此处为查看有无进入闹钟功能的键按下,有则跳转
JZ MARK1
LCALL S16 ;若无闹钟键按下,查看有无进入调节的键s16按下
CJNE A,#7EH,KEYSCAN1
SMS: LCALL MS ;调节键按下显示需要调节内容
MOV A,COUNT ;与之前的一样把调节参数送入进行调节,此处调姐秒显示的低位
MOV TEMP,A
LCALL KEYADD1
LCALL KEYSUB1
MOV A,TEMP
SUBB A,#60 ;调节不超过60
JC REMAIN4
MOV TEMP,#0
MOV A,TEMP
REMAIN4: MOV
A,TEMP
MOV COUNT,A
LCALL S16 ;查看有无切换调节内容的键s16按下
CJNE A,#7EH,SMS ;没有s16键按下则显示原先调节内容
SSECOND: LCALL SECOND ;有键s16按下则显示进入秒的调节
MOV TEMP,R4 ;参数送入进行调节
LCALL KEYADD2
LCALL KEYSUB2
MOV A,TEMP
SUBB A,#60 ;调节不超过60
JC REMAIN9
MOV TEMP,#0
REMAIN9: MOV R4,TEMP
LCALL S16 ; 再次按下s16键可确定时间调节完成
CJNE A,#7EH,SSECOND ;未按下则继续显示选中的调节内容
AJMP KEYSCAN1
;----------------------------------------
MARK1: LJMP KEYCLK ;地址差跳远无法跳转,此处进行中间跳转到闹钟界面
;----------------------------------------
KEYSCAN2: LCALL SHOWDAY ;此处为日期显示,当切换模式键按下两下后进入显示
LCALL S4 ;与时间显示的时候一样查看有无切换模式的键按下
JZ KEYSCAN3 ;按下则跳转显示年份
LCALL S12 ;此处为查看有无进入闹钟功能的键按下,有则跳转
JZ MARK1
LCALL S16 ;若无闹钟键按下,查看有无进入调节的键s16按下
CJNE A,#7EH,KEYSCAN2
SDAY: LCALL DAY ;调节键按下显示需要调节内容,此处为日
MOV TEMP,R3 ; 把日期寄存器R2的值送入临时变量用于调节
LCALL KEYADD1 ;调用加减按键扫描,按下后进行操作
LCALL KEYSUB1
MOV A,TEMP
SUBB A,#32 ;调节不超过31
JC REMAIN5
MOV TEMP,#0
REMAIN5: MOV R3,TEMP
LCALL S16 ;查看有无切换调节内容的键s16按下
CJNE A,#7EH,SDAY ;没有s16键按下则显示原先调节内容
SSMOUNTH: LCALL MOUNTH ;有键s16按下则显示进入月的调节
MOV TEMP,R2
LCALL KEYADD2
LCALL KEYSUB2
MOV A,TEMP
SUBB A,#13 ;调节不超过12
JC REMAIN6
MOV TEMP,#0
REMAIN6: MOV R2,TEMP
LCALL S16 ; 再次按下s16键可确定时间调节完成
CJNE A,#7EH,SSMOUNTH ;未按下则继续显示选中的调节内容
AJMP KEYSCAN2
;---------------------------------------------
;----------------------------------------------
KEYSCAN3: LCALL SHOWYEAR ;此处为日期显示,当切换模式键按下三下后进入显示
LCALL S4
JZ SHOW0 ;代码的内容除了显示的内容不同其他和以上的一样
LCALL S12
JZ MARK1
LCALL S16
CJNE A,#7EH,KEYSCAN3
SYEAR1: LCALL YEAR1
MOV TEMP,R1
LCALL KEYADD1
LCALL KEYSUB1
MOV A,TEMP
SUBB A,#100 ;调节不超过99
JC REMAIN7
MOV TEMP,#0
REMAIN7: MOV R1,TEMP
LCALL S16 ;
CJNE A,#7EH,SYEAR1
SYEAR2: LCALL YEAR2
MOV TEMP,R0
LCALL KEYADD2
LCALL KEYSUB2
MOV A,TEMP
SUBB A,#100 ;调节不超过99
JC REMAIN8
MOV TEMP,#0
REMAIN8: MOV R0,TEMP
LCALL S16
CJNE A,#7EH,SYEAR2
AJMP KEYSCAN3
;------------------------------------------
MARK: LJMP KEYSCAN ;地址差跳远无法跳转,此处进行中间跳转到时间显示
界面
;------------------------------------------
SHOW0: MOV DMS,#0 ;切换键按下四次后此时切换到运动秒表计时从0开始计时
MOV DMIN,#0
MOV DSECOND,#0
LCALL SHOWDD ; 刚进入运动秒表模式,显示全为0
LCALL S4
JZ MARK
LCALL S16
CJNE A,#7EH,SHOW0 ;运动秒表开始键按下,则计时开始,否则继续显示0
SETB TR1 ;开启定时器1
SHOWD: LCALL SHOWDD ;开始键s16按下后显示变化的数字
LCALL S4 ;查看有无模式显示键的按下
JZ MARK ;按下则跳转显示
LCALL S16 ;查看s16有无按下
CJNE A,#7EH,SHOWD ;再次按下该键s16,停止计时
CLR TR1 ;关闭定时器1
SHOWTING: LCALL SHOWDD ;显示为定时的内容
LCALL S4 ;查看有无模式显示键的按下
JZ MARK
LCALL S16
CJNE A,#7EH,SHOWTING ;再次按下s16,显示继续上次 状态开始计时
SETB TR1 ;再次开启定时器
SHOWTING1: LCALL SHOWDD ;显示定时变化的定时内容
LCALL S4
JZ MARK
LCALL S16
CJNE A,#7EH,SHOWTING1 ;再按一下s16再次进入暂停状态
CLR TR1
SHOWTING2: LCALL SHOWDD
LCALL S4
JZ MARK
LCALL S16
CJNE A,#7EH,SHOWTING2
AJMP SHOW0 ;再按一下s16 内容清零,重新进入初始化运动秒表模式
;---------------------------------------------此段主要为调节、显示的过程内容
;************主程序结束******************************************************************
;--------------出程序结束,一下为各个子函数
;向74hc595发送一个字,并显示数据
;-----------------------------------------------------------------------------------------
SENDBYTE: MOV BYTE,A ;送入需要写入锁存器的参数
MOV A, #1 ;用1来移位选取各个位的数据
ANL A,BYTE ;用与 来选取数据
JNZ SEND
CLR DAT ;与后 结果为0则送入0
CLR SCK ;将写入的数据进行右移
SETB SCK
AJMP LOOP ;跳转 继续重复7次
SEND: SETB DAT ;与后结果不为0,则送入数据1
CLR SCK
SETB SCK ;--------送入第一位数据
LOOP: MOV R7,#7
MOV A, #1
LOOP1: RL A
MOV B,A
ANL A,BYTE
JNZ SEND1
SEND0: CLR DAT ;送0
AJMP SUOCUN
SEND1: SETB DAT ;送1
AJMP SUOCUN
SUOCUN: CLR SCK
SETB SCK
MOV A,B
DJNZ R7,LOOP1
CLR RCK
SETB RCK
RET
;------------------------以上为数据进行输入锁存
DISPLAY: ACALL JISUAN
DISPLAY1: MOV P0,#00H
MOV A,GEWEI
ACALL SENDBYTE
ORL P0,#08H ;给出最左边数码管的位选
MOV R7,#10H
LCALL DLY ;-----------显示最左边的数码管
MOV P0,#00H
MOV R7,#03H
LCALL DLY
MOV A,SHIWEI
ACALL SENDBYTE
ORL P0,#04H ;给出第二
位数码管的位选
MOV R7,#10H
LCALL DLY ;--------------显示第二位数码管
MOV P0,#00H
MOV R7,#03H
LCALL DLY
MOV A,BAIWEI
ACALL SENDBYTE
ORL P0,#02H ;给出第三位数码管的位选
MOV R7,#10H
LCALL DLY ;----------------显示第三位数码管
MOV P0,#00H
MOV R7,#03H
LCALL DLY
MOV A,QIANWEI
ACALL SENDBYTE
ORL P0,#01H ;给出第三位数码管的位选
MOV R7,#10H
LCALL DLY ;-------------------显示第四位数码管
RET
; ------------------------以上为数据显示
;计算各位数的值把要显示的数进行分解
;-----------------------------------------
JISUAN: MOV A,TEMP1
MOV B,#10
DIV AB
MOV TEMP1,B
MOVC A,@A+DPTR
MOV SHIWEI,A
MOV A,TEMP1
MOVC A,@A+DPTR
MOV GEWEI,A
MOV A,TEMP2
MOV B,#10
DIV AB
MOV TEMP2,B
MOVC A,@A+DPTR
MOV QIANWEI,A
MOV A,TEMP2
MOVC A,@A+DPTR
MOV BAIWEI,A
RET ;-----------------以上为计算各个位数
;-----------------------------------------------------------------------------------------
;显示高两位数(用于调节的时候显示)
;----------------------------------------------------------------------------------------
DISPLAY4: ACALL JISUAN
MOV P0,#00H
MOV A,BAIWEI
ACALL SENDBYTE
ORL P0,#02H
MOV R7,#03H
LCALL DLY ;----------------显示第三位数码管
MOV P0,#00H
MOV R7,#03H
LCALL DLY
MOV A,QIANWEI
ACALL SENDBYTE
ORL P0,#01H
MOV R7,#03H
LCALL DLY ;-------------------显示第四位数码管
RET
;------------------------------------------------------------------------------------------
;只显示低两位数(用于调节的时候显示)
;------------------------------------------------------------------------------------------
DISPLAY2: LCALL JISUAN
MOV P0,#00H
MOV A,GEWEI
LCALL SENDBYTE
ORL P0,#08H
MOV R7,#03H
LCALL DLY ;-----------显示最左边的数码管
MOV P0,#00H
MOV R7,#03H
LCALL DLY
MOV A,SHIWEI
LCALL SENDBYTE
ORL P0,#04H
MOV R7,#03H
LCALL DLY ;--------------显示第二位数码管
MOV P0,#00H
MOV R7,#03H
LCALL DLY
RET
;-----------------------------------------------------------------------------------------
;显示时间子程序
;-----------------------------------------------------------------------------------------
HOURMINUTE: MOV TEMP2,R6
MOV TEMP1,R5
LCALL JISUAN
ORL BAIWEI,#01H ;--------第三个数码管显示小数点
LCALL DISPLAY1
RET ;由于
只有四个数码管,此处显示时、分
SHOWSECOND: MOV TEMP2,R4
MOV A,COUNT
MOV TEMP1,A
LCALL JISUAN
ORL BAIWEI,#01H
LCALL DISPLAY1
RET ;此处单独显示秒
SHOWYEAR: MOV TEMP2,R0
MOV TEMP1,R1
LCALL DISPLAY
RET
SHOWDAY: MOV TEMP2,R2
MOV TEMP1,R3
LCALL DISPLAY
RET
SHOWCLK: MOV TEMP2,CLKHOUR
MOV TEMP1,CLKMIN
LCALL JISUAN
ORL BAIWEI,#01H
LCALL DISPLAY1
RET
SHOWCLK1: MOV TEMP2,CLKHOUR
MOV TEMP1,CLKMIN
LCALL JISUAN
ORL BAIWEI,#01H
ORL GEWEI,#01H
LCALL DISPLAY1
RET
;-----------------------------------------------------------------------------------------
;调节时间日期时独立显示每两位(用于调节的时候显示)
;----------------------------------------------------------------------------------------
MS: MOV TEMP1,COUNT
LCALL DISPLAY2
RET
SECOND: MOV TEMP2,R4
LCALL DISPLAY4
RET
MINUTE: MOV TEMP1,R5
LCALL DISPLAY2
RET
HOUR: MOV TEMP2,R6
LCALL DISPLAY4
RET
DAY: MOV TEMP1,R3
LCALL DISPLAY2
RET
MOUNTH: MOV TEMP2,R2
LCALL DISPLAY4
RET
YEAR1: MOV TEMP1,R1
LCALL DISPLAY2
RET
YEAR2: MOV TEMP2,R0
LCALL DISPLAY4
RET
SCLKMIN: MOV TEMP1,CLKMIN
LCALL DISPLAY2
RET
SCLKHOUR: MOV TEMP2,CLKHOUR
LCALL DISPLAY4
RET
;-----------------------------------------------------------------------------------------
;键盘扫描函数
;----------------------------------------------------------------------------------------
;切换调节显示内容键
S16: MOV P2,#0FFH
CLR P2.7
JB P2.0,S16END
MOV R7,#18H
LCALL DLY
JNB P2.0,$ ;当键盘松开时往下执行否则停留在这一步
MOV A,#7EH
S16END: RET
;切换模式显示内容键
S4: MOV P2,#0FFH
CLR P2.7
JB P2.3,S4END
MOV R7,#18H
LCALL DLY
JNB P2.3,$ ;当键盘松开时往下执行否则停留在这一步
MOV A,#0H ;设置扫描标志位A=0
S4END: RET
;设置闹钟键扫描与减法键位同一键s12
S12: MOV P2,#0FFH
CLR P2.7
JB P2.1,S12END
MOV R7,#18H
LCALL DLY
JNB P2.1,$ ;当键盘松开时往下执行否则停留在这一步
MOV A,#0 ;设置扫描标志位A=0
S12END: RET
;用于确定启动闹钟功能的键盘扫描,与加法键位同一个
S8: MOV P2,#0FFH
CLR P2.7
JB P2.2,S8END
MOV R7,#18H
LCALL DLY
JNB P2.2,$ ;当键盘松开时往下执行否则停留在这一步
MOV A,CLKF
CPL A ;设置扫描标志位A=1
MOV CLKF,A
S8END: RET
;单步、连续调节加法键
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------
------------------
KEYADD2: MOV P2,#0FFH
CLR P2.7
JB P2.2,ADDEND2
MOV R7,#18H
LCALL DLY
JT1: JNB P2.2,KT1
INC TEMP
AJMP ADDEND2
KT1: INC KTIME
MOV R7,#10H
LCALL DLY ;用于调节高两位
MOV A,KTIME
CJNE A,#30,JT1
ADD2: INC TEMP
MOV A,TEMP
CJNE A,#99,ON2
MOV TEMP,#0
ON2: MOV R7,TEMP
MOV TEMP2,R7
LCALL DISPLAY4
MOV R7,#30H
LCALL DLY
JNB P2.2,ADD2
ADDEND2: RET
KEYADD1: MOV P2,#0FFH
CLR P2.7
JB P2.2,ADDEND1
MOV R7,#18H
LCALL DLY
JT2: JNB P2.2,KT2
INC TEMP
AJMP ADDEND1 ;用于调节低两位
KT2: INC KTIME
MOV R7,#10H
LCALL DLY
MOV A,KTIME
CJNE A,#30,JT2
ADD1: INC TEMP
MOV A,TEMP
CJNE A,#99,ON3
MOV TEMP,#0
ON3: MOV R7,TEMP
MOV TEMP1,R7
LCALL DISPLAY2
MOV R7,#30H
LCALL DLY
JNB P2.2,ADD1
ADDEND1: RET
;-----------------------------------------------------------------------------------------
;单步、连续调节减法键
KEYSUB2: MOV P2,#0FFH
CLR P2.7
JB P2.1,SUBEND2
MOV R7,#18H
LCALL DLY
JT3: JNB P2.1,KT3
DEC TEMP
AJMP SUBEND2
KT3: INC KTIME
MOV R7,#10H ;用于调节高两位
LCALL DLY
MOV A,KTIME
CJNE A,#30,JT3
SUB2: DEC TEMP
MOV A,TEMP
CJNE A,#0,ON
MOV TEMP,#99
ON: MOV R7,TEMP
MOV TEMP2,R7
LCALL DISPLAY4
MOV R7,#30H
LCALL DLY
JNB P2.1,SUB2
SUBEND2: RET
;-----------------------------------------------------------------------------------------
KEYSUB1: MOV P2,#0FFH
CLR P2.7
JB P2.1,SUBEND1
MOV R7,#18H
LCALL DLY
JT4: JNB P2.1,KT4
DEC TEMP
AJMP SUBEND2
KT4: INC KTIME
MOV R7,#10H ;
LCALL DLY
MOV A,KTIME
CJNE A,#30,JT4
SUB1: DEC TEMP ;用于调节低两位
MOV A,TEMP
CJNE A,#0,ON1
MOV TEMP,#99
ON1: MOV R7,TEMP
MOV TEMP1,R7
LCALL DISPLAY2
MOV R7,#30H
LCALL DLY
JNB P2.1,SUB1
SUBEND1: RET
;蜂鸣器响的子程序
;-----------------------------------------------------------------------------------------
SOUND: CLR BUZZER
MOV R7,#5H
LCALL DLY
SETB BUZZER
MOV R7,#04H
LCALL DLY
RET
;-----------------------------------------------------------------------------------------
;延时子程序
;-----------------------------------------------------------------------------------------
DLY: PUSH 07H
DY1: PUSH 07H
DY2: PUSH 07H
DY3: DJNZ R7,DY3
POP 07H
DJNZ R7,DY2
PO
P 07H
DJNZ R7,DY1
POP 07H
DJNZ R7,DLY
RET
;-----------------------------------------------------------------------------------------
;定时器中断程序:
;-----------------------------------------------------------------------------------------
T0_INT: MOV TH0,#3CH ;定时中断子程序。重装定时常数
MOV TL0,#0B0H ;3CB0=15536;65536-15536=50000
INC COUNT
MOV A,COUNT
CJNE A,#20,T0INTR ;50000*20=1S,未满20次,跳出中断子程序
MOV COUNT,#0 ;中断满20次COUNT清零
INC R4
CJNE R4,#60,T0INTR ;不相等时跳转
MOV R4,#0 ;相等时跳转并R5清0
INC R5
CJNE R5,#60,T0INTR ;不相等时跳转
;整点报时提醒
MOV R5,#0 ;相等时跳转并R5清0
INC R6
CJNE R6,#24,T0INTR ;不相等时跳转
MOV R6,#0 ;相等时跳转并R0清0
CJNE R2,#2,JBOS ;如果不是2月,判断大月or小月
LCALL JLEAP ; 如果是二月,判断闰年or平年
CJNE A,#0,J29
CJNE R3,#28,INCR3 ;平年二月判断28天
MOV R3,#1
INC R2
CJNE R2,#12,T0INTR
MOV R2,#1
INC R0
AJMP T0INTR
J29: CJNE R3,#29,INCR3 ; 闰年二月判断29天
MOV R3,#1
INC R2
CJNE R2,#12,T0INTR
MOV R2,#1
INC R0
AJMP T0INTR
JBOS: LCALL JMOUNTH ;不是二月,判断大小月
MOV A,B
CJNE A,#0,JBIG
CJNE R3,#30,INCR3 ;小月判断30天
MOV R3,#1
INC R2
CJNE R2,#12,T0INTR
MOV R2,#1
INC R0
AJMP T0INTR
JBIG: CJNE R3,#31,INCR3 ;大月判断31天
MOV R3,#1
INC R2
CJNE R2,#12,T0INTR
MOV R2,#1
INC R0
AJMP T0INTR
INCR3: INC R3
T0INTR: RETI
;-----------------------------------------------------------------------------------------
;判断是否为闰年程序
;-----------------------------------------------------------------------------------------
JLEAP: MOV B,#4 ;考虑到实际应用中电子钟不会用到一百年,现在只判断
;后两位能被4整除即为闰年
MOV A,R1
DIV AB
MOV A,B
CJNE A, #0,UNLEAP
MOV A,#1 ;设置闰年标志
AJMP LEAPEND
UNLEAP: MOV A,#0
LEAPEND: RET
;-----------------------------------------------------------------------------------------
;判断大月小月
;-----------------------------------------------------------------------------------------
JMOUNTH: MOV A,R2
CJNE A,#4,JMOUNTH6
AJMP SMOUNTH
JMOUNTH6: CJNE A,#6, JMOUNTH9 ;判断是否是4.
6.9.11 其中一月
AJMP SMOUNTH
JMOUNTH9: CJNE A,#9,JMOUNTH11
AJMP SMOUNTH
JMOUNTH11: CJNE A,#11, BMOUNTH
AJMP SMOUNTH
BMOUNTH: MOV B,#1 ;设置大小月标志
AJMP JEND
SMOUNTH: MOV B,#0
JEND: RET
;-----------------------------------------------------------------------------------------
;用于运动秒表的定时器1
;-----------------------------------------------------------------------------------------
T1_INT: MOV TH1, #0D8H
MOV TL1, #0F0H
INC DMS
MOV A,DMS
CJNE A,#100,T1_INTEND
MOV DMS,#0
INC DSECOND
MOV A,DSECOND
CJNE A,#60,T1_INTEND
MOV DSECOND,#0
INC DMIN
MOV A,DMIN
CJNE A,#10,T1_INTEND
MOV DMIN,#0 ;计时最多只记10分钟
T1_INTEND: RETI
;-----------------------------------------------------------------------------------------
;运动秒表显示功能
;----------------------------------------------------------------------------------------
SHOWDD: MOV A,DMS
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV GEWEI,A
MOV A,DSECOND
MOV B,#10
DIV AB
MOV TEMP,B
MOVC A,@A+DPTR
MOV BAIWEI,A
MOV A,TEMP
MOVC A,@A+DPTR
ORL A,#01H
MOV SHIWEI,A
MOV A,DMIN
MOVC A,@A+DPTR
ORL A,#01H
MOV QIANWEI,A
LCALL DISPLAY1
RET
;-----------------------------------------------------------------------------------------
;----------------------------------------------------------------------------------------
TABLE: DB 0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6 ; 显示数字0~9
END