**------------------------------------------------------------------ ** CPU:MCS-51 ** 語言:匯編 ** Fosc=12M
 <單片機(jī)可調(diào)數(shù)碼鐘仿真圖> ********************************************************************/ /*---------R0自動(dòng)顯示年月日時(shí)長(zhǎng)。 (單位:s)*/ /*---------R1自動(dòng)顯示年時(shí)分秒時(shí)長(zhǎng)。(單位:s)*/ /*---------R6移位標(biāo)志*/ M BIT P1.0 //主鍵 U BIT P1.1 //加1鍵 D BIT P1.2 //減1鍵 O BIT P1.6 //OK鍵 R BIT P1.5 //移位鍵 SS BIT 00H // M鍵按下標(biāo)志 SSSS BIT 01H //閃爍標(biāo)志 SECOND EQU 40H //秒 MINUTE EQU 41H //分 HOUR EQU 42H //小時(shí) TIANSHU EQU 43H //天數(shù) TIME EQU 44H //天 YUE EQU 45H //月 NIAN EQU 46H //年 SSM EQU 47H //閃爍滅記數(shù)單元 SSK EQU 48H //閃爍開記數(shù)單元 ORG 0000H SJMP START //轉(zhuǎn)到主程序 ORG 000BH //T0中斷 TIME0:PUSH ACC MOV TL0,0BFH MOV TH0,03CH INC R4 CJNE R4,#122,CHU MOV R4,#00 INC SECOND INC R0 INC R1 MOV R3,SECOND CJNE R0,#4,WU CLR F0 MOV R0,#00 WU:CJNE R1,#10,WU1 MOV R1,#00 SETB F0 WU1:CJNE R3,#60,CHU MOV SECOND,#00 INC MINUTE MOV R3,MINUTE CJNE R3,#60,CHU MOV MINUTE,#00 INC HOUR MOV R3,HOUR CJNE R3,#24,CHU MOV HOUR,#00 INC TIME MOV A,TIME LCALL TIAN //天數(shù)計(jì)算 CJNE A,TIANSHU,CHU MOV TIME,#00 INC YUE MOV R3,YUE CJNE R3,#12,CHU MOV YUE,#01 INC NIAN MOV R3,NIAN CJNE R3,#100,CHU MOV NIAN,#00 CHU: POP ACC RETI //----------------------------主程序 START: MOV TMOD,01H MOV TL0,0BFH MOV TH0,03CH //可以用kile仿真取值 SETB TR0 //開T0 SETB EA SETB ET0 //允許T0中斷 CLR F0 //F0作TIME與年月日轉(zhuǎn)換顯示(F0=0是顯示TIME,F(xiàn)0=1是顯示年月日) MOV SECOND,#00 //秒 MOV MINUTE,#00 //分 MOV HOUR,#12 //小時(shí) MOV TIME,#7 //日期 MOV YUE,#8 //月份 MOV NIAN,#7 //年 ANJIANSAOMIAO: JNB M,MAIN //主鍵輸入 LCALL SHUMASAOMIAO //數(shù)碼管動(dòng)態(tài)掃描 LJMP ANJIANSAOMIAO //按鍵掃描
MAIN: LCALL DELAY10MS //按鍵去抖 JB M,ANJIANSAOMIAO //如M=1,是抖動(dòng)返回 LCALL KEY_0 SETB SS CLR TR0 CLR F0 WUHUI: LCALL SHUMASAOMIAO //數(shù)碼管動(dòng)態(tài)掃描 JNB O,OK //確定鍵 JNB U,JIA //加一鍵 JNB D,J1 //減一鍵 JNB R,YIWEI //移位鍵 SJMP WUHUI J1:LJMP JIAN //射程太遠(yuǎn)只好加長(zhǎng)轉(zhuǎn)移 YIWEI: //移位處理子程序 LCALL DELAY10MS JB R,WUHUI LCALL KEY_1 // JNB R,$ INC R6 XIA:CJNE R6,#3,XIA1 //LCALL SHUMASAOMIAO//------ SETB F0 //移位到第三位時(shí)顯示年月日(手動(dòng)) XIA1: CJNE R6,#6,HUI MOV R6,#00H CLR F0 //到第6位時(shí)轉(zhuǎn)顯示時(shí)分秒 (手動(dòng)) HUI:LJMP WUHUI OK: //OK鍵處理子程序 LCALL DELAY10MS JB O,WUHUI //去抖 SETB TR0 //開定時(shí)器 MOV R6,#00 //OK鍵按下后重新開始移位 CLR SS LJMP ANJIANSAOMIAO JIA: //加一處理子程序 LCALL DELAY10MS JB U,WUHUI LCALL KEY_2 CJNE R6,#0,MINUTEJIA MOV R3,HOUR //R5作LED0~3的中轉(zhuǎn) CJNE R3,#24,I0 //到十不變返回 MOV HOUR,#00 I0:INC HOUR //沒有到小時(shí)加一 MINUTEJIA:CJNE R6,#1,SECONDJIA MOV R3,MINUTE CJNE R3,#60,I1 MOV MINUTE,#00 I1:INC MINUTE SECONDJIA:CJNE R6,#2,NIANJIA MOV R3,SECOND CJNE R3,#60,I2 MOV SECOND,#00 I2:INC SECOND NIANJIA:CJNE R6,#3,YUEJIA MOV R3,NIAN CJNE R3,#100,I3 MOV NIAN,#01 I3:INC NIAN YUEJIA:CJNE R6,#4,TIMEJIA MOV R3,YUE CJNE R3,#12,I4 MOV YUE,#01 I4:INC YUE TIMEJIA:CJNE R6,#5,GO MOV A,TIME LCALL TIAN //根據(jù)月份判天數(shù) CJNE A,TIANSHU,I5 MOV TIME,#00 I5:INC TIME GO:LJMP WUHUI JIAN: //減一處理子程序 LCALL DELAY10MS // JB D,WUHUI // 射程太遠(yuǎn),不要沒有關(guān)系 LCALL KEY_3 CJNE R6,#0,MINUTEJIAN MOV R3,HOUR CJNE R3,#0,D0 MOV HOUR,#24 D0:DEC HOUR MINUTEJIAN:CJNE R6,#1,SECONDJIAN MOV R3,MINUTE CJNE R3,#0,D1 MOV MINUTE,#60 D1:DEC MINUTE SECONDJIAN:CJNE R6,#2,NIANJIAN MOV R3,SECOND CJNE R3,#0,D2 MOV SECOND,#60 D2:DEC SECOND NIANJIAN:CJNE R6,#3,YUEJIAN MOV R3,NIAN CJNE R3,#0,D3 MOV NIAN,#99 D3:DEC NIAN YUEJIAN:CJNE R6,#4,TIMEJIAN MOV R3,YUE CJNE R3,#00,D4 MOV YUE,#12 D4:DEC YUE TIMEJIAN:CJNE R6,#5,GO1 MOV R3,TIME CJNE R3,#01,D5 LCALL TIAN //根據(jù)月份判天數(shù) MOV TIME,TIANSHU D5:DEC TIME GO1:LJMP WUHUI //--------------顯示 //--------------數(shù)碼管動(dòng)態(tài)掃描子程序 SHUMASAOMIAO: MOV DPTR,#TABLE JNB SS,ZZ INC SSK MOV R3,SSK CJNE R3,#250,YY CLR SSK CLR SSSS INC SSM YY: MOV R3,SSM CJNE R3,#2,ZZ MOV SSM,#00 MOV SSK,#00 SETB SSSS ZZ:MOV A,HOUR JNB F0,YUAN //F0為1時(shí)顯示年,為0時(shí)顯示小時(shí) MOV A,NIAN //--------------///閃爍程序^ SSM -閃爍滅。SSK-閃爍開。
YUAN: MOV B,#10 DIV AB MOVC A,@A+DPTR JNB SS,NEXT0 //-- CJNE R6,#0,NEX0 //-- SJMP XX0 //-- NEX0: CJNE R6,#3,NEXT0 //-- XX0: JNB SSSS,NEXT0 //-- MOV A,#00 //--閃爍程序 NEXT0: MOV P0,A CLR P3.0 LCALL DELAY1MS SETB P3.0 MOV A,B MOVC A,@A+DPTR JNB SS,NEXT //-- CJNE R6,#0,NEX SJMP XX NEX: CJNE R6,#3,NEXT XX: JNB SSSS,NEXT MOV A,#00 //-- 閃爍程序 NEXT:MOV P0,A CLR P3.1 LCALL DELAY1MS SETB P3.1 MOV A,#10 //顯示‘-’ MOVC A,@A+DPTR MOV P0,A CLR P3.2 LCALL DELAY1MS SETB P3.2 MOV A,MINUTE JNB F0,YUAN1 ////F0為1時(shí)顯示月,為0時(shí)顯示分 MOV A,YUE YUAN1:MOV B,#10 DIV AB MOVC A,@A+DPTR JNB SS,NEXT2 //-- CJNE R6,#1,NEX2 //-- SJMP XX2 //-- NEX2: CJNE R6,#4,NEXT2 //-- XX2: JNB SSSS,NEXT2 //-- MOV A,#00 //--閃爍程序 NEXT2: MOV P0,A CLR P3.3 LCALL DELAY1MS SETB P3.3 MOV A,B MOVC A,@A+DPTR JNB SS,NEXT1 ///-- CJNE R6,#1,NEX1 //-- SJMP XX1 //-- NEX1: CJNE R6,#4,NEXT1 //-- XX1: JNB SSSS,NEXT1 //-- MOV A,#00 //-- --閃爍程序 NEXT1:MOV P0,A CLR P3.4 LCALL DELAY1MS SETB P3.4 MOV A,#10 //顯示‘-’ MOVC A,@A+DPTR MOV P0,A CLR P3.5 LCALL DELAY1MS SETB P3.5 MOV A,SECOND JNB F0,YUAN2 ////F0為1時(shí)顯示日,為0時(shí)顯示秒 MOV A,TIME YUAN2:MOV B,#10 DIV AB MOVC A,@A+DPTR JNB SS,NEXT4 //--- CJNE R6,#2,NEX4 //---- SJMP XX4 //--- NEX4: CJNE R6,#5,NEXT4//--- XX4: JNB SSSS,NEXT4 //-- MOV A,#00 //--閃爍程序 NEXT4:MOV P0,A CLR P3.6 LCALL DELAY1MS SETB P3.6 MOV A,B MOVC A,@A+DPTR JNB SS,NEXT5 CJNE R6,#2,NEX5 SJMP XX5 NEX5: CJNE R6,#5,NEXT5 XX5: JNB SSSS,NEXT5 MOV A,#00 NEXT5: MOV P0,A CLR P3.7 LCALL DELAY1MS SETB P3.7 RET //-------------------根據(jù)月份查天數(shù) TIAN:MOV R3,YUE CJNE R3,#1,YUE2 MOV TIANSHU,#31 YUE2:CJNE R3,#2,YUE3 MOV TIANSHU,#28 YUE3:CJNE R3,#3,YUE4 MOV TIANSHU,#31 YUE4:CJNE R3,#4,YUE5 MOV TIANSHU,#30 YUE5:CJNE R3,#5,YUE6 MOV TIANSHU,#31 YUE6:CJNE R3,#6,YUE7 MOV TIANSHU,#30 YUE7:CJNE R3,#7,YUE8 MOV TIANSHU,#31 YUE8:CJNE R3,#8,YUE9 MOV TIANSHU,#31 YUE9:CJNE R3,#9,YUE10 MOV TIANSHU,#30 YUE10:CJNE R3,#10,YUE11 MOV TIANSHU,#31 YUE11:CJNE R3,#11,YUE12 MOV TIANSHU,#30 YUE12:CJNE R3,#12,OVER MOV TIANSHU,#31 OVER:RET //---------------------- TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H,00H //0~9- KEY_0:JB R,KEY_0CHU LCALL SHUMASAOMIAO SJMP KEY_0 //移位等待 (用此等待可以去按鍵按下時(shí)黑屏) KEY_0CHU:RET KEY_1:JB R,KEY_1CHU LCALL SHUMASAOMIAO SJMP KEY_1 //移位等待 KEY_1CHU:RET KEY_2:JB U,KEY_2CHU LCALL SHUMASAOMIAO SJMP KEY_2 //加1等待 KEY_2CHU:RET KEY_3:JB D,KEY_3CHU LCALL SHUMASAOMIAO SJMP KEY_3 //減1等待 KEY_3CHU:RET DELAY10MS:MOV R7,#1 //延時(shí)10MS子程序 L1:NOP DJNZ R7,L1 DELAY1MS:RET END
此可調(diào)數(shù)碼鐘用PS仿真已經(jīng)成功,第一屏顯示時(shí)間第2屏顯示年月
|