当前位置:文档之家› 单片机实现日历时钟课程设计

单片机实现日历时钟课程设计

山东科技大学信息与电气工程学院07-1班学生卡号0701100517 lfj;1键——可调日历;2键——结束返回;3键——秒加1/日加1;4键——分加1/月加1;5键——显示24小时制/时加1/年加1;6键——显示12小时制;7键——可调时间;8键——可调日期CLK BIT P1.6 ;时钟信号端DISP BIT P1.7 ;串出锁存端DBUF EQU 30H ;秒的最低位地址KCLK BIT P2.3KEY BIT P3.5PL BIT P1.7LED BIT P1.1CHANGE2 BIT 21H ;加12的标志位AD1 EQU 40H ;秒AD2 EQU 41H ;分AD3 EQU 42H ;小时AD4 EQU 43H ;天AD5 EQU 44H ;月AD6 EQU 45H ;年;定义结束ORG 0000HLJMP MAINORG 000BH ;T0中断入口LJMP INTORG 0030HMAIN: MOV R0,#AD1MOV R7,#06HLOOP0: MOV A,#00HMOV @R0,AINC R0DJNZ R7,LOOP0 ;R0~R7清零MOV IE,#82H ;允许T0中断MOV TMOD,#01H ;T0允许工作MOV TH0,#4CHMOV TL0,#00H ;送入计数初值0.5sMOV R5,#00H;初始化结束SETB TR0 ;T0使能LOOP: LCALL TEST ;扫描键盘CJNE A,#0FEH,NEXTD ;0FEH为1键LCALL DY1MSLCALL KEYDONENEXTD: SJMP LOOP ;扫描键盘看是否需要调整日历DISPLAY: LCALL TEST ;扫描键盘CJNE A,#0DFH,ERSHISI1;0DFH为6键SETB PSW.1 ;显示十二小时LJMP TIMEZHUANERSHISI1:CJNE A,#0EFH,ERSHISI2;0EFH为5键CLR PSW.1 ;显示二十四小时CLR CHANGE2LJMP TIMEZHUANERSHISI2:CJNE A,#0CFH,CHANGE;0CFH为5+6键CLR PSW.1SETB CHANGE2 ;CHANGE2=1表示把十二表示法转换成二十四小时LJMP TIMEZHUANCHANGE: CLR CHANGE2TIMEZHUAN:LCALL TESTCJNE A,#7FH,NEXTL;7FH为8键SETB PSW.5LJMP ZHUAN1NEXTL: CJNE A,#0BFH,ZHUAN1;0BFH为7键CLR PSW.5ZHUAN1: JB PSW.5,DAY ;PSW.5=0 调整时间,为1则调整日期MOV A,AD1 ;调整时间键码分离MOV B,#0AHDIV ABMOV R0,#DBUFMOV @R0,BINC R0MOV @R0,AMOV A,AD2MOV B,#0AHDIV ABINC R0MOV @R0,BINC R0MOV @R0,AJB PSW.1,TIMEZHUAN1LJMP TIMEZHUAN2TIMEZHUAN1: ;判断时间是否大于12MOV A,AD3MOV B,#0CHSUBB A,BJC NORMALTMOV AD3,ALJMP NORMALTTIMEZHUAN2:JNB CHANGE2,NORMALT ;判断是否加12MOV A,AD3ADD A,#12MOV AD3,ACLR CHANGE2NORMALT: MOV A,AD3MOV B,#0AHDIV ABINC R0MOV @R0,BINC R0MOV @R0,ASJMP DDISPDAY: ;调整日期键码分离MOV A,AD4MOV B,#0AHDIV ABMOV R0,#DBUFMOV @R0,BINC R0MOV @R0,AMOV A,AD5MOV B,#0AHDIV ABINC R0MOV @R0,BINC R0MOV @R0,AMOV A,AD6MOV B,#0AHDIV ABINC R0MOV @R0,BINC R0MOV @R0,ADDISP: ;显示,串入并处的方式,上升沿写入MOV R0,#DBUFMOV R7,#06HLOOP2:MOV R6,#08HMOV A,@R0MOV DPTR,#TABMOVC A,@A+DPTR ;显示秒CLR CLOOP3:RRC ACLR CLKMOV DISP,CSETB CLKDJNZ R6,LOOP3INC R0DJNZ R7,LOOP2RETKEYDONE: ;人工手动调整日历AGAINB: LCALL DY250MS ;防抖250msLCALL TESTCJNE A,#7FH,NEXTL1 ;7FH为8键SETB PSW.5LJMP ZHUAN12NEXTL1:CJNE A,#0BFH,ZHUAN12CLR PSW.5 ;以上为扫描键盘并设置PSW.5 ZHUAN12:JB PSW.5,NEXT6B ;判断调整日期还是时间CJNE A,#0FDH,NEXTA ;0FDH为2键,如果按键值为FDH则结束LJMP BACKNEXTA: CJNE A,#0FBH,NEXTB;0FBH为3键INC AD1 ;秒加1MOV A,AD1CJNE A,#3CH,AGAINAMOV AD1,#00HSJMP AGAINANEXTB: CJNE A,#0F7H,NEXTC;0F7H为4键INC AD2 ;分加1MOV A,AD2CJNE A,#3CH,AGAINAMOV AD2,#00HSJMP AGAINANEXTC: CJNE A,#0EFH,AGAINA;0EFH为5键INC AD3 ;时加1MOV A,AD3CJNE A,#18H,AGAINAMOV AD3,#00HNEXTT: SJMP AGAINANEXT6B:CJNE A,#0FDH,NEXTAB;JIESHUJIAN ;0FDH为2键LJMP BACKNEXTAB: CJNE A,#0FBH,NEXTBB;0FBH为3键INC AD4 ;日加1MOV A,AD4CJNE A,#20H,AGAINAMOV AD4,#01HSJMP AGAINANEXTBB: CJNE A,#0F7H,NEXTCB;0F7H为4键INC AD5 ;月加1MOV A,AD5CJNE A,#0DH,AGAINAMOV AD5,#01HSJMP AGAINANEXTCB: CJNE A,#0EFH,AGAINA;0EFH为5键INC AD6 ;年加1MOV A,AD6CJNE A,#64H,AGAINAMOV AD6,#00HAGAINA: LCALL DISPLAYLJMP AGAINBBACK: RETINT: INC R5CJNE R5,#20,NEXTS1 ;循环20次,每次循环为0.5秒,共0.05*20=1秒MOV R5,#00HLCALL DISPLAY ;满一秒后的显示LJMP MENDNEXTS1: LJMP NEXTS ;满一秒后的显示MEND: MOV A,AD1CJNE A,#0AH,LAREMENDSETB LED ;满十秒关灯,否则继续LAREMEND:INC AD1MOV A,AD1CJNE A,#3CH, NEXTS2LJMP MEND1NEXTS2: LJMP NEXTS ;以上为看是否修改秒,满60,分加一否则跳转继续MEND1: MOV AD1,#00HINC AD2MOV A,AD2CJNE A,#3CH,NEXTS3LJMP MEND2NEXTS3: LJMP NEXTS ;以上为看是否修改分,满60,时加一否则跳转继续MEND2: MOV AD2,#00HINC AD3MOV A,AD3CJNE A,#0Ah,ZAIJIANCHAAJMP BAOSHIZAIJIANCHA:CJNE A,#0Bh,ZHENGCHANGBAOSHI: CLR LED ;以上为两个报时开灯ZHENGCHANG:MOV A,AD3CJNE A,#18H,NEXTS4 ;不满二十四小时跳出LJMP MEND3 ;满二十四后跳到清零小时继续加天NEXTS4: LJMP NEXTSMEND3: MOV AD3,#00HINC AD4MOV A,AD5CJNE A,#02H,JIXUTIAN ;判断是否为二月份MOV A,AD6MOV B,#4HDIV ABMOV A,BJZ RUNNIAN ;判断是否为闰年PINGNIAN:MOV A,AD4 ;平年CJNE A,#1DH,NEXTSMOV AD4,#01HAJMP JIXUYUERUNNIAN: MOV A,AD4 ; 闰年CJNE A,#1EH,NEXTSMOV AD4,#01HAJMP JIXUYUEJIXUTIAN: ; 不为二月,再查看是那个月MOV A,AD5CJNE A,#01H,PAN1LJMP SANSHIYIPAN1: CJNE A,#03H,PAN3LJMP SANSHIYIPAN3: CJNE A,#04H,PAN4LJMP SANSHIPAN4: CJNE A,#05H,PAN5LJMP SANSHIYIPAN5: CJNE A,#06H,PAN6LJMP SANSHIPAN6: CJNE A,#07H,PAN7LJMP SANSHIYIPAN7: CJNE A,#08H,PAN8LJMP SANSHIYIPAN8: CJNE A,#09H,PAN9LJMP SANSHIPAN9 : CJNE A,#10H,PAN10LJMP SANSHIYIPAN10: CJNE A,#11H,SANSHIYILJMP SANSHISANSHIYI:MOV A,AD4 ;月份:1,3,5,7,8,10,12CJNE A,#20H,NEXTSMOV AD4,#01HAJMP JIXUYUESANSHI: MOV A,AD4 ; 月份:2,4,6,8,11CJNE A,#1FH,NEXTSMOV AD4,#01HJIXUYUE: INC AD5 ; 满月后加年CJNE A,#0DH,NEXTSMOV AD5,#01HINC AD6MOV A,AD6CJNE A,#64H,NEXTS ; 年满100后清零MOV AD6,#00HNEXTS: ;再赋初值MOV TH0,#4CHMOV TL0,#00HRETIDY250MS: ; 延迟防抖250msMOV R4,#0FAHLOOP8: LCALL DY1MSDJNZ R4,LOOP8RETDY1MS: ; 延迟防抖1msMOV R5,#0FAHLOOP7: MOV R7,#70HDJNZ R5,LOOP7RET;键盘扫描子程序TEST: MOV R7,#08HSETB PLCLR PL ;低电平锁存NOPNOPSETB PL ;高电平输出MOV A,#0FFHAGAIN3: CLR KCLKNOPNOPMOV C,KEY ;把p3.5的状态存入CSETB KCLKRLC A ;键盘状态存入ADJNZ R7,AGAIN3 ;扫描八个按键RETTAB:DB 88H,0EBH,4CH,49H,2BH,19H,18H,0CBH,08H,09H ;子程序功能索引:;TEST——扫描键盘;DDISP——显示;NEXTS——重新赋初值;DY1MS——延迟防抖1msEND。

相关主题