📄 yuying.txt
字号:
SCL EQU P2.0
DATA EQU P2.1
RST EQU P2.2
QRG 0000H
L JMP MAIN ;转主程序
ORG 0003H ;外部中断0中断服务程序入口地址
LJMP INTA ;转外部中断0中断服务程序
ORG 000BH ;TO定时中断服务程序入口地址
LJMP T0-SEV
ORG 0031H ;外部中断1中断服务程序入口地址
LJMP INTB ; 转外部中断1中断服务程序
ORG 001BH ;T1定时中断服务程序入口地址
LJMP T1_SEV ;转T1中断服务程序
ORG 0030H ;设置主程序起始地址=0030H
MAIN: MOV SP,#60H ;设置堆栈指针
MOV R7,#10H ;系统初始化
MOV R0,#30H
MOV A,#0
MOV @R0,A
INC R0
DJNZ R7,LOP
MOV 35H,#01H ;设置上电后的初始和日期.
MOV 36H,#00H ;”2000年1月1日星期六”
MOV 37H,#00H
MOV 38H,#00H
MOV 3CH,33H
MOV 3DH,34H
MOV 3EH,#01H
MOV 44H,#10H ;LED位选择码
MOV 45H,#20H
MOV 46H,#40H
MOV 47H,#80H
CLR RS1
CLR RS0
MOV R5,#00H
MOV R6,#00H
MOV R7,#06H
LCALL SET1302 ;DS1302时钟芯片初始化
SETB RS1
CLR RS0
MOV R0M,#4AH
MOV TMOD,#10H ;设置T0T1工作方式;定时器,工作方式
MOV TH1,#3CH
MOV TL1,#0B0H
MOV TH0,#40H
MOV TL0,#098H ;T0计数初始值4098H
MOV IP,#00001H ;设置中断有限级
MOV TCON,#01000000 ;启动定时器T1,
MOV IE,#10001101 ;开中断T0和串行中断禁止
LOP: LCALL CHANGE ;当前时间送显示缓冲区
LCALL DISPLAY ;显示当前时间
SETB RS1 ;设置第2组寄存器
SETB RS0
MOV 3AH,@R0 ;判断设置定时时间否?
INC R0
MOV 3BH,@R0
MOV A,3AH
CJNE A,#0,NT
MOV A,3BH
CJNE A,#0,NT
NTM INC R0
INC R0
CJNE R0,#59H,LOP
MOV R0,#4AH
SJMP BBX
NT: MOV A,3BH
CJNE A,34H,NTM
DEC R0
DEC R0
MOV 39H,@R0
INC R0
INC R0
CJNE R0,#59H,NT1
MOV R0,#4AH
NT1: MOV A,39H ;若定时时间到
CJNE A,#05H,BBXX
LCALL YUYIN ;发出语音提示
CLR P2.7 ;启动蜂鸣器发出”嘟嘟嘟:报警信号
SJMP LPG
BBX: SETB P2.7
SJMP LP-0
BBXX: LCALL YUYIN
SJMP LP-0
LP-0: JB P3.0,LP-6 ;扫描键盘,判断切换显示日期按键按下否?
LCALL DISLLAY
JB P3.0,LP-0
LP-1: JNB P3.0,LP-1
SETB P2.7
MOV 5EH,#06H
LP-1A: MOV 3CH,35H
MOV 3DH,36H
LCALL CHANGE
LCALL DISPLAY ;切换显示日、月
LP-1B: JB P3.0,LP-1C
LCALL DISPLAY
JB P3.0,LP-1D
LP-1D: JNB P3.0,LP-1D
SJMP LP-2
LP1C: MOV A,5EH
CJNE A,#00H,LP-1A
LJMP FUZHI
LP-2 MOV 5EH,#06H
LP-3A: MOV 3CH,38H
MOV 3DH,#20H
LCALL CHANGE
LCALL DISPLAY ;切换显示年份
LP-3B JNB P3.0,LP-3C
LCALL DISPLAY
JB P3.0,LP-3B
LP-3D: JNB P3.0,LP-3D
DJMP LP-4
LP-3C: MOV A,5EH
CJNE A,#00H,LP-3A
LJMP FUZHI
LP-4: MOV 5EH,#06H
LP-5A: MOV 3CH,37H
MOV 3DH,#0BBH
LCALL CHANGE
LCALL DISPLAY ;切换显示星期
LP-5B: JB P3.0,LP-5C
LCALL DISPLAY
JB P3.0,LP-5B
LP-5D: JNB P3.0,LP-5D
LJMP FUZHI
LP-5C: MOV A,5EH
CHNE A,#00H,LP-5A
LJMP FUZHI
LP-6: JB P3.1,LP-6A
SJMP LP-6A
LP-6A: LJMP LOP ;切换显示当前时间
LP-6B: LCALL DISPLAY
JB P3.1,LP-6
LP-7: LCALL DISPLAY
JNB P3.1,LP-7
SETB P2.7
MOV 3CH,32H
MOV 3DH,#OFFH
LCALL CHANGE
LCALL DISPLAY
JB P3.1,LP-7
LCALL DIDPLAY
JB P3.1,LP-7
LP-8: LCALL DISPLAY
JNB P3.1,LP-8
FUZHI: MOV 3CH,33H
MOV 3DH,34H
LJMP LOP
CHANGE: MOV A,3DH ; 将当前时间小时、分送显示缓冲区
PUSH A
ANL A,#0FH
MOV 42H,A
POP A
SWAP A
ANL A,#0FH
MOV 43H,A
MOV A,3CH
PUSH A
ANL A,#0FH
MOV 40H,A
POP A
SWAP A
ANL A,#0FH
MOV 41H,A
RET
YUYIN: MOV A,3FH
CJNE A,#0,CC1
CLR P3.4
MOV 3FH,#01H
CC1: RET
;4位LED动态扫描显示子程序
DISPLAY:SETB RS1
SETB RS0
MOV R2,#O4H
MOV R0,#40H
MOV R1,#44H
GO-ON: MOV A,@R1
ADD A,@R0
MOV P1,A
LCALL DELAY1
INC R0
INC R1
DJNZ R2,GO-ON
RET
DELAY1: MOV R3,#14H ;延时1ms子程序
AGAIN: MOV R4,#19H
DELAY: DJNZ R4,DELAY
DJNZ R3,AGAIN
RET
ORG 0030H
;DS1302设置子程序,调整当前时间子程序
SET1302:CLR RST
CLR SCL
SETB RST
MOV B,#8EH ;控制寄存器地址8EH
LCALL RD-BYTE
MOV B,#00H ;写入WP=0,允许写有效
LCALL RD-BYTE
SETB SCL
CLR RST
MOV R0,#32H ;存储当前时间的首地址=32H
MOV R2,#7 ;写入字节数=8
MOV R1,#80H ;写入首地址=80H
SET13021:CLR RST
CLR SCL
SETB RST
MOV B,R1
LCALL RD-BYTE
INC R0
INC R1
INC R1
SETB SCL
CLR RST
DJNZ R2,SET13021
CLR RST
CLR SCL
SETB RST
MOV B,#8EH
LCALL RD-BYTE
MOV B,#80H
LCALL RD-BYTE
SETB SCL
CLR RST
RET
;读当前时间子程序
RD1302: MOV R0,#32H ;读出当前时间存入RAM的首地址32H
MOV R2,#7 ;读出字节数=8
MOV R1,#81H ;读出命令与首地址=81H
LJMP RD1302
RET
RD13021: CLR RST
CLR SCL
SETB RST
MOV B,R1
LCALL RD-BYTE
LCALL WR-BYTE
MOV @R0,A
INC RO
INC R1
INC R1
SETB SCL
CLR RST
DJNZ R2,RD13021
RET
RD-BYTE: MOV R3,#8 ;写DS1302一个字节子程序
NIBIT1: MOV A,B
RRC A
MOV B,A
MOV DATA,C
SETB SCL
CLR SCL
DJNZ R3,INBIT1
RET
WR-BYTE: MOV R4,#8 ;读DS1302一个字节子程序
OUTBIT1: MOV C,DATA
RRC A
SETB SCL
CLR SCL
DJNZ R4,OUTBIT1
RET
;T1定时中断程序,定时1min中断一次,读出当前时间
T1-SEV: MOV TH1,#3CH
MOV TL1,#0B0H
CLR EA
PUSH A ;保护现场
PUSH B
PUSH PSW
CLR RS1 ;选择0组工作寄存器组
CLR RS0
INC R5
CJNZ R5,#14H,EN
MOV RA,#0
DEC 5EH
MOV 0H,33H
LCALL RD1302
MOV A,33H
CJNE A,30H,CLR3FH
SUMP EN1
CLR3FH: MOV 3FH,#0
EN1: MOV 3CH,33H
MOV 3DH,34H
EN: POP PSW
POP B
POP A
SETB EA
RETI
;当前时间、定时时间设置程序
INTB: SETB P3.0
SETB P3.1
CLR TR1
CLR ET1
CLR EX0
CLR EX1
SETB EA
SETB ET0
SETB PT0
PUSH A
PUSH B
PUSH PSW
JB P3.5,TIME;
LJMP ALARM ;否则转向闹钟时间设置程序
TIME: MOV 31J,#02h ;当前时间设置子程序
MOV 29H,#03H
MOV 48H,#03H ;调整位数控制
MOV 3CH,33H
MOV 3DH,34H
LCALL CHANGE ;调用CHANGE程序,使当前时间送显示缓冲区
LP0: JB P3.0,NEXT0
LCALL DISPLAY
JB P3.0,LP0
LP1 LCALL ISPLAY
JNB P3.0,LP1
MOV A,29H
ADD A,#01H ;被调整位+1
DA A ;十进制调整
MOV 29H,A
MOV A,48H
CJNE A,#03H,XX1 ;(48H)=3调整小时、分的值
MOV 3DH,34H
MOV 3CH,33H
LCALL CHANGE
LCALL DISPLAY
LJMP LO1
XX1: CJNE A,#02H,XX2 ;(4811)=2调整月、日的值
MOV 3DH,36H
MOV 3CH,35H
LCALL CHANGE
LCALL DISPLAY
LJMP LO3
XX2: MOV 3DH,38H ;(48H)=1调整年、星期的值
MOV 3CH,37H
LCALL CHANGE
LCALL DISPLAY
LJMP LO5
NEXT0: JNB P3.1,LF1 ;扫描键盘RST键,按下转向LP1
LJMP L1
LF1: LCALL DISPLAY
JB P3.1,NEXT0
LD1: LCALL DISPLAY
JNB P3.1,LD1
MOV A,48H
CJNE A,#03H,X1
MOV 3CH,33H
MOV 3DH,34H
LCALL CHANGE
MOV 29H,33H
DJNZ 31H,LB1
DEC 48H
MOV 31H,#02H
MOV 29H,36H
MOV 3DH,36H
MOV 3CH,35H
LCALL CHANGE
LJMP L1
LB1: LJMP L1
X1: MOV A,48H
CJNE A,#02H,X2
MOV 3CH,35H
MOV 3DH,36H
LCALL CHANGE
MOV 29H,35H
DJNZ 31H,LC1
DEC 48H
MOV 31H,#02H
MOV 29H,38H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -