;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SECOND EQU 20H ;当前秒
MINUTE EQU 21H ;当前分
HOUR EQU 22H ;当前时
ALAMINU EQU 23H ;闹钟分钟
ALAHOUR EQU 24H ;闹钟小时
DAY EQU 25H ;当前日
MONTH EQU 26H ;当前月
YEAR EQU 27H ;当前年
WEEK EQU 29H ;星期
STATE EQU 30H ;状态
INTNUM EQU 31H ;中断次数
MONTHDAYS EQU 32H ;月所对应的天数
ALAON EQU 33H ;闹钟开关状态
TEMP EQU 34H ;临时变量
ALARM EQU 35H ;实事报时,该处存放的变量为1时报时
;液晶模块的寄存器地址
LCD_CMD_WR EQU 0
LCD_DATA_WR EQU 1
LCD_BUSY_RD EQU 2
LCD_DATA_RD EQU 3
;显示命令
LCD_CLS EQU 1 ;清楚屏幕并且置AC为0
LCD_HOME EQU 2 ;显示返回到原始位置
LCD_SETMODE EQU 4 ;设置模式
LCD_SETVISIBLE EQU 8 ;开关控制
LCD_SHIFT EQU 16 ;光标移位
LCD_SETFUNCTION EQU 32 ;功能设置
LCD_SETCGADDR EQU 64 ;设置CGRAM
LCD_SETDDADDR EQU 128 ;设置DDRAM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
LJMP MAIN ;跳往主程序
ORG 0003H
LJMP KEYDOWN ;键盘中断
ORG 000BH
LJMP TIMER ;定时中断
MAIN:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;月份所对应的天数表
DAYNUM: DB 1FH,1CH,1FH,1EH,1FH,1EH,1FH,1FH,1EH,1FH,1EH,1FH
;显示星期字符串
MON: DB 'MON',0
TUE: DB 'TUE',0
WED: DB 'WED',0
THU: DB 'THU',0
FRI: DB 'FRI',0
SAT: DB 'SAT',0
SUN: DB 'SUN',0
ON : DB 'ON' ,0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV SP ,#40H
MOV TMOD,#01H ;设置为T0
LCALL INITIAL ;初始化内存数据
LCALL DIS_INI ;液晶显示初始化
MOV A,#38H
LCALL WRCMD
SETB ET0 ;允许TO中断
SETB EX0 ;允许INTRO中断
MOV IP,#02H ;设置定时器的中断优先于键盘中断
SETB EA ;CPU 开中断
MOV TH0,#3CH ;装初始值
MOV TL0,#0B0H
SETB TCON.4 ;启动T0
HERE:
LCALL DISPLAY ;根据模式不同在LCD上显示
LJMP HERE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;初始化子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INITIAL:
PUSH ACC
MOV INTNUM,#0AH ;装入中断次数
CLR A ;初始化时间:00:00:00
MOV SECOND,A
MOV MINUTE,A
MOV HOUR ,A
MOV ALAMINU ,A
MOV ALAHOUR ,A
MOV DAY ,#4 ;初始化日期为:2007-7-4 星期3
MOV MONTH,#7
MOV YEAR,#7H
MOV WEEK ,#3H
MOV STATE ,#0H ;初始化状态为0
MOV ALAON,#00H ;初始化闹钟关闭
MOV ALARM,#00H ;初始化不报时
POP ACC
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;键盘中断程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEYDOWN:
PUSH ACC
MOV A,P1 ;读键盘的状态
ANL A,#1FH ;屏蔽高三位
MOV TEMP,A
LCALL D_10MS ;延时10ms
MOV A,P1 ;再次读入按键状态
ANL A,#1FH
CJNE A,TEMP,RET_KEY ;两次不等,则是抖动引起的
CJNE A,#1EH,KEYDOWN1
LCALL KEY_0
AJMP RET_KEY
KEYDOWN1:
CJNE A,#1DH,KEYDOWN2
LCALL KEY_1
AJMP RET_KEY
KEYDOWN2:
CJNE A,#1BH,KEYDOWN3
LCALL KEY_2
AJMP RET_KEY
KEYDOWN3:
CJNE A,#17H,KEYDOWN4
LCALL KEY_3
AJMP RET_KEY
KEYDOWN4:
CJNE A,#0FH,RET_KEY
LCALL KEY_4
AJMP RET_KEY
RET_KEY:
POP ACC
RETI
;;;;;延时程序10MS
D_10MS:
MOV R5,#0FFH
D_10MS1:
MOV R6,#0EEH
D_10MS2:
NOP
DJNZ R6,D_10MS2
DJNZ R5,D_10MS1
RET
;;;;;;功能键按下,设置状态
KEY_0:
PUSH ACC
MOV P0,#00H
MOV A,STATE
INC A
CJNE A,#05H,KEY_0_RET
MOV A,#00H
KEY_0_RET:
MOV STATE,A
POP ACC
RET
;;;;;;;;;;;;;;;
KEY_1:
;MOV P0,#01H
MOV R7,#01H ;设置为增加(子程序的入口参数)
MOV A,STATE
CJNE A,#00H,KEY_1_1
AJMP KEY_1_RET ;状态0下无作用
KEY_1_1:
CJNE A,#01H,KEY_1_2
LCALL INC_DEC_HOUR ;状态1下小时加一
A