万年历汇编语言程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
F_S bit 00H ;计时1S的标志位
ORG 0000H
LJMP START
ORG 001BH
LJMP PINTT1
ORG 0003H
LJMP PINT0
ORG 0013H
LJMP PINT1
ORG 0030H
START:
CLR P1.4
MOV SP,#60H
MOV TMOD,#10H ;设置定时器T1方式字
MOV
DPTR,#(65536-50000)
MOV TH1,DPH
MOV TL1,DPL
SETB EA
SETB ET1
SETB TR1 ;启动定时器T1
SETB EX0 ;启动外部中断0
SETB IT0 ;设定外部中断0为下降沿
MOV IP,#01H ;设定外部中断0优先级最高
SETB EX1
SETB IT1
MOV R4,#20
MAIN: JNB F_S,ABCD ; 标志位为0(定时时间为1s),则跳转
CLR F_S ;标志位置零
LCALL JISHI ;调用计时ABCD: MOV 53H,#0FH ;
MOV 40H,#35H
MOV 41H,#00H
MOV 42H,#06H
LCALL DISP ;调用显示程序
;LCALL KEYS
SJMP MAIN
;定时中断程序
PINTT1: MOV DPTR,#(65536-50000)
MOV TH1,DPH ;重新设置初值
MOV TL1,DPL
DJNZ R4,ABC ;是否为1S?,不是则返回
MOV R4,#20 ;重新设置计数初值
SETB F_S ;标志位置1
ABC: RETI
;外部中断0程序,用于调节年月日************************************ *********
PINT0:
CLR EA ;关中断
CLR TR1 ;关定时器
PUSH ACC
PUSH PSW
PUSH 49H
PUSH 40H
PUSH 41H
PUSH 42H
PUSH 43H
;MOV 55H,#00H ;给55H初值,刚进入中断时使显示秒的数码管闪亮MOV 55H,#06H
MOV 40H,#32H
MOV 41H,#06H
MOV 42H,#03H
MOV 43H,#0AH
LOOP:
;灭灯
MOV 54H,#01FH ;设置灭灯定时初值
LOP1: SETB P1.5 ;标志位为1,则表示数码管灭灯
MOV A,55H ;
MOV 53H,A
LCALL DISP
JMP FINDKEY
MIEDNEG:
DJNZ 54H,LOP1 ;灭灯时间
;开灯
MOV 54H,#01FH ;设置灭灯定时初值
LOP2: CLR P1.5 ;标志位为0,则表示数码管开灯
MOV 53H,#0FH
LCALL DISP
JMP FINDKEY
KAIDENG:
DJNZ 54H,LOP2
LJMP LOOP
FINDKEY:;查询按键
JB P1.0,JKEY1 ;消抖查询P1.0
CALL DL
JNB P1.0,KEY0
JKEY1:
JB P1.1,JKEY2 ;消抖查询P1.1
CALL DL
JNB P1.1,KEY1
JKEY2: ;消抖查询P1.2
JB P1.2,JKEY3
CALL DL
JNB P1.2,KEY2
JKEY3: ;消抖查询P1.3
JB P1.3,RETRET
CALL DL
JNB P1.3,JMP333
AJMP RETRET
JMP333:LJMP KEY3
RETRET:
JNB P1.5,KAIDENG
JMP MIEDNEG
;按键处理
;按键0 显示年
KEY0:
;MOV 55H,#04H ;给55H值,使显示年的数码管闪亮
MOV 55H,#0AH
MOV 49H,#06FH ;延时初值
KEY00: CALL DL ;延时防止识别按键多于两次
DJNZ 49H,KEY00
;MOV A,33H
MOV A,30H
ADD A,#01 ;每按一下年加一
CJNE A,#100,KEY01
MOV A,#00H ;
KEY01:
MOV 30H,A
LJMP LOOP
;按键1 显示月
KEY1:
;MOV 55H,#02H
; ;给55H值,使显示月的数码管闪亮
MOV 55H,#08H
MOV 49H,#06FH
;延时初值
KEY11: CALL DL ;延时防止识别按键多于两次
DJNZ 49H,KEY11
MOV A,31H
;31H存储地址值送A
ADD A,#01
;每按一下月份加一
CJNE A,#13,KEY12
MOV A,#01H
;分钟计数到13时清零
KEY12:
;MOV 34H,A
MOV 31H,A
LJMP LOOP
;按键2 显示月
KEY2:
;MOV 55H,#00H
;给55H值,使显示日的数码管闪亮
MOV 55H,#06H
MOV 49H,#06FH
;延时初值
KEY22: CALL DL ;延时防止识别按键多于两次
DJNZ 49H,KEY22
;MOV A,30H
MOV A,32H
ADD A,#01
;每按一下日加一
MOV 48H,A
MOV A,30H
MOV B,#4
DIV AB
MOV A,B
CJNE A,#0H,KEY2201
AJMP KEY2202
;平年
KEY2201: MOV DPTR,#TAB1
MOV A,31H
MOVC A,@A+DPTR
INC A
MOV 47H,A
MOV A,48H
CJNE A,47H, KEY23
MOV A,#1
LJMP KEY23
;闰年
KEY2202: MOV DPTR,#TAB2
MOV A,31H
MOVC A,@A+DPTR
INC A
MOV 47H,A
MOV A,48H
CJNE A,47H,KEY23
MOV A,#1
LJMP KEY23
KEY23:
;MOV 35H,A
MOV 32H,A
LJMP LOOP
;按键3
KEY3: POP 42H
POP 41H
POP 40H
POP 49H
POP PSW
POP ACC
SETB TR1
SETB EA
RETI
;外部中断1,用于调节时分秒************************
PINT1:
CLR EA ;关中断
CLR TR1 ;关定时器
PUSH ACC
PUSH PSW
PUSH 49H
PUSH 40H
PUSH 41H
PUSH 42H
PUSH 43H
MOV 55H,#00H ;给55H初值,刚进入中断时使显示秒的数码管闪亮
MOV 40H,#35H
MOV 41H,#00H
MOV 42H,#03H
MOV 43H,#04H
L11OOP:
;灭灯
MOV 54H,#01FH ;设置灭灯定时初值
L11OP1: SETB P1.5 ;标志位为1,则表示数码管灭灯
MOV A,55H ;
MOV 53H,A
LCALL DISP
JMP F11INDKEY
M11IEDNEG:
DJNZ 54H,L11OP1 ;灭灯时间
;开灯
MOV 54H,#01FH ;设置灭灯定时初值
L11OP2: CLR P1.5 ;标志位为0,则表示数码管开灯
MOV 53H,#0FH
LCALL DISP
JMP F11INDKEY
K11AIDENG:
DJNZ 54H,L11OP2
LJMP L11OOP
F11INDKEY:;查询按键
JB P1.0,J11KEY1
;消抖查询P1.0
CALL DL
JNB P1.0,K11EY0
J11KEY1:
JB P1.1,J11KEY2
;消抖查询P1.1
CALL DL
JNB P1.1,K11EY1
J11KEY2:
;消抖查询P1.2
JB P1.2,J11KEY3
CALL DL
JNB P1.2,K11EY2
J11KEY3:
;消抖查询P1.3
JB P1.3,R11ETRET
CALL DL
JNB P1.3,K11EY3
R11ETRET:
JNB P1.5,K11AIDENG
JMP M11IEDNEG
;按键处理
;按键0
K11EY0:
MOV 55H,#04H ;给55H值,使显示小时的数码管闪亮
MOV 49H,#06FH ;延时初值
K11EY00: CALL DL ;延时防止识别按键多于两次
DJNZ 49H,K11EY00
MOV A,33H
ADD A,#01 ;每按一下小时加一
CJNE A,#24,K11EY01
MOV A,#00H ;小时计数到24时清零
K11EY01:
MOV 33H,A
LJMP L11OOP
;按键1
K11EY1:
MOV 55H,#02H ; ;给55H值,使显示分钟的数码管闪亮
MOV 49H,#06FH
;延时初值
K11EY11: CALL DL ;延时防止识别按键多于两次
DJNZ 49H,K11EY11
MOV A,34H ;小时存储地址值送A
ADD A,#01
;每按一下分钟加一
CJNE A,#60,K11EY12
MOV A,#00H
;分钟计数到60时清零
K11EY12:
MOV 34H,A
LJMP L11OOP
;按键2
K11EY2:
MOV 55H,#00H
;给55H值,使显示秒的数码管闪亮
MOV 49H,#06FH
;延时初值
K11EY22: CALL DL
;延时防止识别按键多于两次
DJNZ 49H,K11EY22
MOV A,35H
ADD A,#01
;每按一下秒加一
CJNE A,#60,K11EY23
MOV A,#00H ;分钟计数到60时清零
K11EY23:
MOV 35H,A
LJMP L11OOP
;按键3
K11EY3: POP 43H
POP 42H
POP 41H
POP 40H
POP 49H
POP PSW
POP ACC
SETB TR1
SETB EA
RETI
; 定时器计数调整************************************ **********
TAB1:DB
0,31,28,31,30,31,30,31,31,30,31,30,31
TAB2:DB
0,31,29,31,30,31,30,31,31,30,31,30,31
JISHI:PUSH ACC
PUSH DPH
PUSH DPL
MOV R0,#35H ;对秒计数
MOV A,@R0
ADD A,#01H
MOV @R0,A
CJNE A,#60, JRET
MOV @R0,#0
DD1: DEC R0 ;对分钟计数
MOV A,@R0
ADD A,#1
MOV @R0,A
CJNE A,#60,JRET
MOV @R0,#0
DD2: DEC R0 ;对时钟计数
MOV A,@R0
ADD A,#1
MOV @R0,A
CJNE A,#24,JRET
MOV @R0,#0
DD3: DEC R0
MOV A,@R0
ADD A,#1
MOV @R0,A
MOV 48H,A
MOV A,30H
MOV B,#4
DIV AB
MOV A,B
CJNE A,#0H,DD30
AJMP DD31
;平年
DD30: MOV DPTR,#TAB1
MOV A,31H
MOVC A,@A+DPTR
INC A
MOV 47H,A
MOV A,48H
CJNE A,47H,JRET
MOV @R0,#1
LJMP DD4
;闰年
DD31: MOV DPTR,#TAB2 MOV A,31H
MOVC A,@A+DPTR
INC A
MOV 47H,A
MOV A,48H
CJNE A,47H,JRET
MOV @R0,#1
DD4: DEC R0
MOV A,@R0
ADD A,#1
MOV @R0,A
CJNE A,#13,JRET
MOV @R0,#1
DD5: DEC R0
MOV A,@R0
ADD A,#1
MOV @R0,A
JRET: POP DPL
POP DPH
POP ACC
RET
;七段数码管段码表(共阴极)TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7F H;0-8
DB 6FH;9
; 显示子程序
DISP:
PUSH DPH
PUSH DPL
PUSH ACC
PUSH PSW
PUSH 49H
SETB RS0
;MOV R1,#32H ;需要显示的初始地址
MOV R1,40H
;MOV R2,#06H ;初始化需要显示的数码管
MOV R2,41H
MOV R5,42H
;MOV R5,#03H ;显示地址次数
DISP1: MOV A,@R1
LCALL ZHUAN
MOV 49H,A ;将十位送临时区域49H
MOV A,B ;将个位送A
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV 52H,A
;52H为中间值,将个位送52H
MOV A,R2
CJNE A,53H,STAA ;位控是否与53H相等,否则显示本地址的个位和十位
INC R2 ;相等则不显示本地址内容,位控左转移两位
INC R2
DEC R1 ;需要显示的地址则转移到下一位
DEC R5 ;显示次数减一
; CJNE
A,#04H,DISP1 ; R2不等于04H,则继续显示
CJNE A,43H,DISP1
JMP DISP2
;R2=04H,则结束
STAA:
MOV A,52H ;个位送A
MOV P2,R2 ;
送位控
MOV P0,A ;个位送P0口
LCALL DL ;调用延时
INC R2
;更改位控
MOV P2,R2
;送位控
MOV A,49H
;十位送A
MOVC A,@A+DPTR
MOV P0,A
;十位送段控
LCALL DL
INC R2 ;更改位控
DEC R1 ;更改段控
DJNZ R5, DISP1
;R5不为0,跳转继续显示
DISP2:
;显示子程序返回
// MOV A,#0FFH
// MOV P2,A
POP 49H
POP PSW
POP ACC
POP DPH
POP DPL
RET
ZHUAN: MOV B,#10
DIV AB
RET
;延时1ms子程序(晶振频率12MHz)DL
DL: MOV 50H, #10
DL1: MOV 51H, #100
DL2: DJNZ 51H, DL2
DJNZ 50H, DL1
RET
END。