当前位置:文档之家› 时钟日历

时钟日历

Protues 图;程序清单:;设置变量缓冲区SEC EQU 30HMIN EQU 31HHOUR EQU 32HDAY EQU 33HMON EQU 34HYEAR EQU 35H;************************************************************************* ORG 0000HLJMP MAINORG 000BHLJMP INT_T0ORG 0030HMAIN: LCALL CHUSHIMOV TMOD,#01HMOV TH0,#4CHMOV TL0,#00HMOV IE,#82HSETB TR0 ;开启定时器T0MOV 50h,#00H ;启用定时器T0的初始值MOV 37H,#0 ;显示日期和时间的标志MOV 38H,#0 ;12进制和24进制的标志MOV 39H,#23 ;默认时间为24进制CLR F0 ;日历定时0和1的标志LOOP: MOV A,37HJZ SHIJIANMOV R1,#33HLJMP BEGIN1SHIJIAN:MOV R1,#30H ;初始化显示BEGIN1: MOV A,38HJZ JZ24MOV 39H,#11LJMP BEGIN2JZ24: M OV 39H,#23BEGIN2: LCALL DISPLAYLCALL KEY ;扫描键盘CJNE A,#05H,DINGS ;判断键值是否为5号键LCALL DY1MS ;若是,则实现调整LCALL TIAOTLCALL TIAOTLCALL DISPLAYLJMP DOWNDINGS: CJNE A,#06H,QIEH ;判断键值是否为6号键,定时LCALL DY1MS ;若是,则实现调整CPL F0JNB F0,DI0 ;F0=0,定时器0LCALL DISHI1 ;F0=1,定时器1LCALL DISPLAYLJMP DOWNDI0: LCALL DISHI0LCALL DISPLAYLJMP DOWNQIEH: CJNE A,#07H,BIANH ;判断键值是否为7号键,切换LCALL DY1MS ;若是,则切换显示,年月日与时分秒切换LCALL DISPLAYMOV A,37HCPL AMOV 37H,ALJMP DOWNBIANH: CJNE A,#08H,DOWN ;判断是否为八号键,变换进制LCALL DY1MSLCALL DISPLAYMOV A,38HCPL AMOV 38H,ADOWN: LJMP loop;调整子程序********************************************************************** TIAOT: push accCLR PSW.1 ;初始化标志位TOP1: LCALL KEY ;扫描键盘CJNE A,#08H,PANFAN ;判断键值是否为8号键,不是8键,则继续判断CPL PSW.1 ;取反标志位JB PSW.1,TC ;标志位为1,调整时间change0LCALL CHG1 ;标志位为0,调整日期change1LCALL DISPLAYLJMP TOP1TC: CLR TR0LCALL CHG0LCALL DISPLAYPANFAN: CJNE A,#5,TOP1pop accRET;调整时间子程序****************************************************************** CHG0: MOV R1,#30HLCALL DISPLAYLCALL KEYS: CJNE A,#01H,M ;判断键值,是否为1号键MOV R0,#SEC ;键值为01,即1号键调整秒MOV A,@R0 ;进制CJNE A,#59,L0 ;判断秒是否为59MOV SEC,#00 ;若是,秒清零LCALL DISPLAYLJMP CHG0L0: INC AMOV @R0,ALCALL DISPLAYLJMP CHG0M: CJNE A,#02H,H ;判断键值,是否为02HMOV R0,#MIN ;若是,即2号键,则调整分钟MOV A,@R0CJNE A,#59,L2 ;判断分是否为59MOV MIN,#00 ;若是,分钟清零LCALL DISPLAYLJMP CHG0L2: INC AMOV @R0,ALCALL DISPLAYLJMP CHG0H: CJNE A,#03H,K ;判断键值,是否为03HMOV R0,#HOUR ;键值为03,即3号键调整小时MOV A,@R0CJNE A,39H,L4 ;判断小时是否为23MOV HOUR,#00LCALL DISPLAYLJMP CHG0L4: INC AMOV @R0,ALCALL DISPLAYLJMP CHG0K: CJNE A,#04H,CHG0SETB TR0RET;调整日期********************************************************************** CHG1: MOV R1,#33HLCALL DISPLAYLCALL KEYR: CJNE A,#01H,Y ;判断键值,是否为1HMOV R0,#DAY ;键值为01,调整日期MOV A,@R0 ;进制CJNE A,#31,B0 ;判断30MOV DAY,#00LCALL DISPLAYLJMP CHG1B0: INC AMOV @R0,ALCALL DISPLAYLJMP CHG1Y: CJNE A,#02H,N ;判断键值,是否为2MOV R0,#MONMOV A,@R0CJNE A,#12,B1 ;判断月是否12MOV MON,#00LCALL DISPLAYLJMP CHG1B1: INC AMOV @R0,ALCALL DISPLAYLJMP CHG1N: CJNE A,#03H,K1 ;判断键值,是否为FBMOV R0,#YEAR ;键值为3,调整年MOV A,@R0CJNE A,#99,B2MOV YEAR,#0LCALL DISPLAYLJMP CHG1B2: INC AMOV @R0,ALCALL DISPLAYLJMP CHG1K1: CJNE A,#04H,CHG1RET;第一次定时子程序***************************************************************** DISHI0: MOV 40H,SEC ;保存原值MOV 41H,MINMOV 42H,HOURLCALL CHG0 ;调用调整子程序MOV 43H,SECMOV 44H,MINMOV 45H,HOURLCALL DIRET;第二次定时子程序***************************************************************** DISHI1: MOV 40H,SECMOV 41H,MINMOV 42H,HOURLCALL CHG0MOV 46H,SECMOV 47H,MINMOV 48H,HOURLCALL DIRETDI: MOV SEC,40H ;恢复原值MOV MIN,41HMOV HOUR,42HLCALL DISPLAYRET;定时器T0子程序******************************************************************* INT_T0: INC 50hmov r5,50hCJNE R5,#20,DUAN11 ;判断是否到一秒LJMP DUAN12DUAN11: LJMP NEXT0DUAN12: MOV 50h,#0 ;若是,则重新初始化循环次数MOV A,SECCJNE A,#59,DUAN21 ;判断秒是否为59LJMP DUAN22DUAN21: LJMP N0DUAN22: MOV SEC,#00 ;若是则秒清零lcall displayMOV A,MINCJNE A,#59,DUAN31 ;判断分钟是否为59LJMP DUAN32DUAN31: LJMP N1DUAN32: MOV MIN,#00 ;若是,则分钟清零lcall displayMOV A,HOURCJNE A,39H,DUAN41 ;判断小时是否23LJMP DUAN42DUAN41: LJMP N2DUAN42: MOV HOUR,#00 ;若是,小时清零lcall displayMOV A,DAYPUSH ACCMOV A,MONCJNE A,#1,YUE3POP ACCLJMP RR2YUE3: CJNE A,#3,YUE5 ;1,3,5,7,8,10,12月31天POP ACCLJMP RR2YUE5: CJNE A,#5,YUE7POP ACCLJMP RR2YUE7: CJNE A,#7,YUE8POP ACCLJMP RR2YUE8: CJNE A,#8,YUE10POP ACCLJMP RR2YUE10: CJNE A,#10,YUE12POP ACCLJMP RR2YUE12: CJNE A,#12,YUE4POP ACCLJMP RR2YUE4: CJNE A,#4,YUE6 ;4,6,9,11月30天POP ACCLJMP RR1YUE6: CJNE A,#6,YUE9POP ACCLJMP RR1YUE9: CJNE A,#9,YUE11POP ACCLJMP RR1YUE11: CJNE A,#11,YUE2POP ACCLJMP RR1YUE2: MOV A,YEAR ;2月:是闰年29天,是平年28天MOV B,#4DIV ABMOV A,BJZ RYUEPYUE: POP ACCLJMP RR00RYUE: POP ACCLJMP RR01RR00: CJNE A,#28,N3MOV DAY,#1LCALL DISPLAYLJMP RR3RR01: CJNE A,#29,N3MOV DAY,#1LCALL DISPLAYLJMP RR3RR1: CJNE A,#30,N3MOV DAY,#1LCALL DISPLAYLJMP RR3RR2: CJNE A,#31,N3MOV DAY,#1LCALL DISPLAYLJMP RR3RR3: MOV A,MONCJNE A,#12,N4 ;判断月份是否为11MOV MON,#1 ;若是,则月份清零lcall displayMOV A,YEAR ;年份加一CJNE A,#99,N5MOV YEAR,#0lcall displayLJMP NEXT0N0: INC A ;否则,秒加一MOV SEC,Alcall displayLCALL DFGLJMP NEXT0N1: INC A ;分钟加一MOV MIN,Alcall displayLCALL DFGLJMP NEXT0N2: INC A ;小时加一MOV HOUR,Alcall displayLCALL DFGLJMP NEXT0N3: INC A ;日期加一MOV DAY,Alcall displayLJMP NEXT0N4: INC A ;月份加一MOV MON,Alcall displayLJMP NEXT0N5: INC AMOV YEAR,ALCALL DISPLAYNEXT0: MOV TH0,#4CHMOV TL0,#00HRETI;判断是否到定时时间子程序******************************************************* DFG: MOV A,SEC ;判断是否到第一个定时时间CJNE A,43H,DOWN1MOV A,MINCJNE A,44H,DOWN1MOV A,HOURCJNE A,45H,DOWN1CLR P3.6 ;若到第一个定时时间,则亮灯DOWN1: MOV A,SEC ;判断是否到第二个定时时间CJNE A,46H,DOWN2MOV A,MINCJNE A,47H,DOWN2MOV A,HOURCJNE A,48H,DOWN2CLR P3.6 ;若到第二个定时时间,则亮灯DOWN2: LCALL KEYLCALL DY1MS ;扫描键盘CJNE A,#04H,DO ;若键值为4号键,则灭灯setb p3.6DO: LCALL DISPLAYRET;延时1ms ********************************************************************** DY1MS: MOV R5,#0FAHLOOP7: NOPNOPDJNZ R5,LOOP7RET;初始化CHUSHI****************************************************************** CHUSHI: MOV SEC,#0MOV MIN,#0MOV HOUR,#0MOV DAY,#26MOV MON,#1MOV YEAR,#11RET;子程序KSI :判定有无闭合键的************************************************* KSI: MOV A, #00HMOV P1, A ;P2口送00HLCALL DY1MSMOV A,P3CPL AANL A, #03H ;屏蔽高6位RET;键盘扫描********************************************************************** key: LCALL KSI ;检查是否有键闭合JNZ LK1LJMP END1LK1: LCALL DY1MSLCALL KSI ;再检查是否有键闭合JNZ LK2 ;有键闭合转移到LK2LJMP END1 ;无键闭合,延时12ms后转KEY1LK2: MOV A,#0FEHMOV P1,AMOV R3,AMOV R4,#00HLK4: MOV A,P3JB ACC.0, LONE ;ACC.3=1,第一列无键闭合,转LONEMOV A, #01HlJMP LKPLONE: JB ACC.1, NEXT ;ACC.2=1,第二列无键闭合,转LTWOMOV A, #05HlJMP LKPLKP: ADD A, R4 ;计算键码PUSH ACC ;保护键码LK3: lCALL DY1MS ;延时1mslCALL KSI ;检查是否继续闭合,若闭合再延时JNZ LK3POP ACC ;若键起,则键码送ARETNEXT: INC R4MOV A,R3JNB ACC.3,END1RL AMOV R3,AMOV P1,AlJMP LK4 ;进行下一列扫描END1: RET;显示子程序******************************************************************** DISPLAY: push accMOV R3,#03HMOV R2,#0FEHDISLOOP: MOV A,R2MOV P2,AMOV A,@R1MOV B,#10DIV ABMOV 36h,AMOV A,BMOV DPTR,#KEYBOARDMOVC A,@A+DPTRMOV P0,A ;显示低位LCALL DY1MSMOV A,R2RL AMOV R2,AMOV P2,AMOV A,36hMOV DPTR,#KEYBOARDMOVC A,@A+DPTRMOV P0,A ;显示高位LCALL DY1MSMOV A,R2RL AJNB ACC.0,EXITMOV R2,AMOV P2,AMOV A,#10MOV DPTR,#KEYBOARDMOVC A,@A+DPTRMOV P0,ALCALL DY1MSMOV A,R2RL AMOV R2,AINC R1DJNZ R3,DISLOOPEXIT: pop accRET;断码值*********************************************************************** KEYBOARD: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFHEND。

相关主题