51单片机学习可调数码钟!
/******************************************************************
** 文件名:51学习可调数码钟!
** 创建人: 谢军洋
** 日 期: 2008/01/22
** 修改人: 刘力
** 日 期: 2008/01/25
** Copyright (c) : http://www.51hei.com会员原创作品
**
** 版 本: 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屏显示年月