汇编——万年历

这个博客介绍了一段使用汇编语言编写的万年历程序,涵盖了年、月、日、时、分、秒的显示以及闹钟功能。程序通过控制74HC595芯片来驱动数码管显示,并设置了多个工作模式,如显示年份、日期、时间等。同时,程序还包含了按键扫描功能,用于在不同模式下修改日期时间。此外,博客还涉及到了定时器中断和蜂鸣器控制的实现。
摘要由CSDN通过智能技术生成
	RCK BIT P0.5                                                                             ;74HC595控制位地址
	SCK BIT P0.4	   
	DAT BIT P0.7
	RST BIT P0.6
	BUZ BIT P1.3                                                                             ;蜂鸣器位地址
	PATTERN EQU 23H   				 ;工作模式
	TD EQU 24H					 ;进入和退出修改键值
	YEA_UNIT EQU 25H					 ;年份个位
	YEA_TEN EQU 26H					 ;年份十位
	YEA_HUNDRED EQU 27H				 ;年份百位
	YEA_THOUSAND EQU 28H				 ;年份千位
	MON_UNIT EQU 29H				 ;月份百位
	MON_TEN EQU 2AH					 ;月份千位
	DAY_UNIT EQU 2BH					 ;日期个位
	DAY_TEN EQU 2CH					 ;日期十位
	MIN_UNIT EQU 2DH				                 ;分钟个位
	MIN_TEN EQU 2EH		                                                 ;分钟十位
	HOUR_UNIT EQU 41H				 ;小时个位	
	HOUR_TEN EQU 42H                                                                 ;小时十位
	SEC_UNIT EQU 43H				                 ;秒个位
	SEC_TEN EQU 44H				                 ;秒十位
	VALUE_UINT EQU 2FH				 ;用于暂时存放修改的日期时间(个位)
	VALUE_TEN EQU 30H				 ;用于暂时存放修改的日期时间(十位)
	VALUE_HUNDRED EQU 36H			                 ;用于暂时存放修改的日期时间(百位)
	VALUE_THOUSAND EQU 37H			                 ;用于暂时存放修改的日期时间(千位)
	BYTE EQU 31H					 ;传送至74HC595,用以数码管显示的位
	TUBE_UNIT EQU 32H				 ;数码管最右位
	TUBE_TEN EQU 33H					 ;数码管右数第二位
	TUBE_HUNDRED EQU 34H		                                 ;数码管右数第三位
	TUBE_THOUSAND EQU 35H	                                                 ;数码管右数第四位
	CLO_LMIN EQU 45H					 ;闹钟分个位
	CLO_HMIN EQU 46H                                                                 ;闹钟分十位
	CLO_LHOUR EQU 47H				 ;闹钟时个位
	CLO_HHOUR EQU 48H		                                 ;闹钟时十位
	HMIAO EQU 49H                                                                       ;定时器秒十位
	LMIAO EQU 4AH		                                                 ;定时器秒个位
	HFENMIAO EQU 4BH				 ;定时器分秒十位
	LFENMIAO EQU 4CH	                                                 ;定时器分秒个位
	;中断向量表
	ORG 0000H
	AJMP MAIN
	ORG 0003H
	LJMP IINT0					 ;外部中断0
	ORG 000BH
	AJMP EINT0					 ;定时器中断0
	ORG 0013H
	LJMP IINT1					 ;外部中断1
	ORG 001BH
	LJMP EINT1					 ;定时器中断1	  
	
	;主程序
MAIN:
	;设定所有模式下的初值
	MOV YEA_UNIT,#8					 ;日期初值设置为2018年06月17日	
	MOV YEA_TEN,#1
	MOV YEA_HUNDRED,#0
	MOV YEA_THOUSAND,#2                  
	MOV MON_TEN,#0
	MOV MON_UNIT,#6
	MOV DAY_TEN,#1
	MOV DAY_UNIT,#7
	MOV MIN_UNIT,#0                                                                   ;时间初值设置为12:00:00
	MOV MIN_TEN,#0						
	MOV HOUR_UNIT,#2							
	MOV HOUR_TEN,#1
	MOV SEC_UNIT,#0
	MOV SEC_TEN,#0
	MOV PATTERN,#0
	MOV TD,#0
	MOV TMOD,#11H
   	MOV SP,#60H                                                                           ;堆栈上移
	MOV R6,#0
	MOV CLO_LMIN,#9                                                                   ;闹钟初值设置为24:59
	MOV CLO_HMIN,#5
	MOV CLO_LHOUR,#4
	MOV CLO_HHOUR,#2
	MOV HMIAO,#0                                                                                         ;秒表初值设置为00:00
	MOV LMIAO,#0
	MOV HFENMIAO,#0
	MOV LFENMIAO,#0
		
	SETB BUZ						                  ;打开蜂鸣器
	SETB TR0						 	  ;打开定时器0
	SETB ET0							  ;设置定时器0溢出中断允许位
	SETB ET1							  ;设置定时器1溢出中断允许位
	SETB EX0							  ;外部中断0允许
	SETB IT0							  ;外部中断0边沿触发
	SETB EX1		                                                                                  ;外部中断1允许
	SETB IT1		                                                                                  ;外部中断1边沿触发
	SETB EA							  ;全局中断允许
	SETB PT0						                  ;设置中断优先级
	SETB PX0
	SETB PT1
	CLR TR1                                                                                                      ;关闭定时器1
	CLR RST							  ;复位端清零
	
	
START:
	MOV DPTR,#TABLE

	;闹钟的报时程序,若定时器0的时间走到了之前的设定,则蜂鸣器响
	MOV A,CLO_HHOUR                                                                                  ;逐位比较定时器各位的值
	CJNE A,HOUR_TEN, SOUND_EXIT
	MOV A,CLO_LHOUR
	CJNE A,HOUR_UNIT,SOUND_EXIT
	MOV A,CLO_HMIN
	CJNE A,MIN_TEN,SOUND_EXIT
	MOV A,CLO_LMIN
	CJNE A,MIN_UNIT,SOUND_EXIT
	LCALL SOUNDLONG                                                                                  ;各位相同,则响铃
	MOV CLO_HHOUR,#2                                                                                ;恢复初值
	MOV CLO_LHOUR,#4
	MOV CLO_HMIN,#5
	MOV CLO_LMIN,#9
SOUND_EXIT:
	MOV A,PATTERN

	;各个工作模式的设定
PATTERN0:							 ;模式0,显示年份
	CJNE A,#0,PATTERN1
	LCALL SHOW_YEAR                     
	AJMP START
	
PATTERN1:							 ;模式1,显示月份和日期
	CJNE A,#1,PATTERN2
	LCALL SHOW_MON_A_DAY
	AJMP START
		
PATTERN2:							 ;模式2,显示时和分
	CJNE A,#2,PATTERN3
	LCALL SHOW_HOU_A_MIN
	AJMP START
			
PATTERN3:							 ;模式3,显示分和秒
	CJNE A,#3,PATTERN4
	LCALL SHOW_MIN_A_SEC
	AJMP START
			
PATTERN4:							 ;模式4,显示闹钟设定值
	CJNE A,#4,PATTERN5
	LCALL SHOW_ALARM
	AJMP START
	
PATTERN5:							 ;模式5,秒表(即定时器)
		
	LCALL MIAOBIAO
	AJMP START

	;不同的显示函数
SHOW_YEAR:      		                                                                                 ;年份显示函数
	MOV VALUE_UINT,YEA_UNIT				                 ;将对应的数值传送到中间量VALUE
	MOV VALUE_TEN,YEA_TEN
	MOV VALUE_HUNDRED,YEA_HUNDRED
	MOV VALUE_THOUSAND,YEA_THOUSAND
	LCALL SEG_DISPLAY					                 ;调用数码管显示函数
	RET
		
SHOW_MON_A_DAY:                                	                                                 ;月份和日期显示函数
	MOV VALUE_UINT,DAY_UNIT
	MOV VALUE_TEN,DAY_TEN
	MOV VALUE_HUNDRED,MON_UNIT
	MOV VALUE_THOUSAND,MON_TEN
	LCALL SEG_DISPLAY
	RET
		
SHOW_HOU_A_MIN:                      	                                                                 ;时分显示函数
	MOV VAL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值