51單片機學習可調數碼鐘!
/******************************************************************
** 文件名:51學習可調數碼鐘!
** 創建人: 謝軍洋
** 日 期: 2008/01/22
** 修改人: 劉力
** 日 期: 2008/01/25
** Copyright (c) : http://www.zg4o1577.cn會員原創作品
**
** 版 本: 1.2
**------------------------------------------------------------------
** CPU:MCS-51
** 語言:匯編
** Fosc=12M
<單片機可調數碼鐘仿真圖>
********************************************************************/
/*---------R0自動顯示年月日時長。 (單位:s)*/
/*---------R1自動顯示年時分秒時長。(單位:s)*/
/*---------R6移位標志*/
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鍵按下標志
SSSS BIT 01H //閃爍標志
SECOND EQU 40H //秒
MINUTE EQU 41H //分
HOUR EQU 42H //小時
TIANSHU EQU 43H //天數
TIME EQU 44H //天
YUE EQU 45H //月
NIAN EQU 46H //年
SSM EQU 47H //閃爍滅記數單元
SSK EQU 48H //閃爍開記數單元
ORG 0000H
SJMP START //轉到主程序
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 //天數計算
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與年月日轉換顯示(F0=0是顯示TIME,F0=1是顯示年月日)
MOV SECOND,#00 //秒
MOV MINUTE,#00 //分
MOV HOUR,#12 //小時
MOV TIME,#7 //日期
MOV YUE,#8 //月份
MOV NIAN,#7 //年
ANJIANSAOMIAO:
JNB M,MAIN //主鍵輸入
LCALL SHUMASAOMIAO //數碼管動態掃描
LJMP ANJIANSAOMIAO //按鍵掃描
MAIN:
LCALL DELAY10MS //按鍵去抖
JB M,ANJIANSAOMIAO //如M=1,是抖動返回
LCALL KEY_0
SETB SS
CLR TR0
CLR F0
WUHUI:
LCALL SHUMASAOMIAO //數碼管動態掃描
JNB O,OK //確定鍵
JNB U,JIA //加一鍵
JNB D,J1 //減一鍵
JNB R,YIWEI //移位鍵
SJMP WUHUI
J1:LJMP JIAN //射程太遠只好加長轉移
YIWEI: //移位處理子程序
LCALL DELAY10MS
JB R,WUHUI
LCALL KEY_1
// JNB R,$
INC R6
XIA:CJNE R6,#3,XIA1
//LCALL SHUMASAOMIAO//------
SETB F0 //移位到第三位時顯示年月日(手動)
XIA1: CJNE R6,#6,HUI
MOV R6,#00H
CLR F0 //到第6位時轉顯示時分秒 (手動)
HUI:LJMP WUHUI
OK: //OK鍵處理子程序
LCALL DELAY10MS
JB O,WUHUI //去抖
SETB TR0 //開定時器
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的中轉
CJNE R3,#24,I0 //到十不變返回
MOV HOUR,#00
I0:INC HOUR //沒有到小時加一
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 //根據月份判天數
CJNE A,TIANSHU,I5
MOV TIME,#00
I5:INC TIME
GO:LJMP WUHUI
JIAN: //減一處理子程序
LCALL DELAY10MS
// JB D,WUHUI // 射程太遠,不要沒有關系
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 //根據月份判天數
MOV TIME,TIANSHU
D5:DEC TIME
GO1:LJMP WUHUI
//--------------顯示
//--------------數碼管動態掃描子程序
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時顯示年,為0時顯示小時
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時顯示月,為0時顯示分
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時顯示日,為0時顯示秒
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
//-------------------根據月份查天數
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 //移位等待 (用此等待可以去按鍵按下時黑屏)
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 //延時10MS子程序
L1:NOP
DJNZ R7,L1
DELAY1MS:RET
END
此可調數碼鐘用PS仿真已經成功,第一屏顯示時間第2屏顯示年月