51smz.asm

来自「51单片机学习可调数码钟外加单片机可调数码钟仿真图」· 汇编 代码 · 共 383 行

ASM
383
字号
51单片机学习可调数码钟!
/****************************************************************** 
** 文件名:51学习可调数码钟! 
**------------------------------------------------------------------ 
** 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屏显示年月

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?