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
汇编——万年历
最新推荐文章于 2024-06-27 10:30:58 发布
这个博客介绍了一段使用汇编语言编写的万年历程序,涵盖了年、月、日、时、分、秒的显示以及闹钟功能。程序通过控制74HC595芯片来驱动数码管显示,并设置了多个工作模式,如显示年份、日期、时间等。同时,程序还包含了按键扫描功能,用于在不同模式下修改日期时间。此外,博客还涉及到了定时器中断和蜂鸣器控制的实现。
摘要由CSDN通过智能技术生成