|
本帖最后由 dvga 于 2018-1-6 18:58 编辑
P1口段选,P2口位选 ORG 00H JMP MAIN
ORG 0BH
JMP TIM0
MAIN:
MOV IE,#82H ;使能定时器中断
MOV TMOD,#01H ;设置计数初始值,设置为4ms中断一次
MOV TH0,#0F0H
MOV TL0,#60H
MOV R0,#00H ;1秒钟计数器,250次后为1s
MOV 30H,#00H ;秒分时初始值00
MOV 31H,#00H
MOV 32H,#00H
MOV R1,#00H ;位选累计器
SETB TR0
LOOP: ;按键设置时分秒,循环扫描按键,否则执行中断程序
JB P3.0,NOPRESS2
CALL FILTER
MOV A,30H
ADD A,#01H
DA A
MOV 30H,A
CJNE A,#60H,NOPRESS1;等于60则清零
MOV 30H,#00H
NOPRESS1:
JNB P3.0,$
CALL FILTER
NOPRESS2:
JB P3.1,NOPRESS4
CALL FILTER
MOV A,31H
ADD A,#01H
DA A
MOV 31H,A
CJNE A,#60H,NOPRESS3;等于60则清零
MOV 31H,#00H
NOPRESS3:
JNB P3.1,$
CALL FILTER
NOPRESS4:
JB P3.2,LOOP
CALL FILTER
MOV A,32H
ADD A,#01H
DA A
MOV 32H,A
CJNE A,#24H,NOPRESS5;等于24则清零
MOV 32H,#00H
NOPRESS5:
JNB P3.2,$
CALL FILTER
JMP LOOP
TIM0:
PUSH ACC
CJNE R0,#250,SCAN ;等于250时说明到1秒,未满则继续扫描显示
MOV A,#30H
ADD A,#01H
DA A
MOV 30H,A
CJNE A,#60H,INCSEC ;等于60时说明到一分
MOV A,31H
ADD A,#01H
DA A
MOV 31H,A
CJNE A,#60H,INCMIN ;等于60时说明到一小时
MOV A,32H
ADD A,#01H
DA A
MOV 32H,A
CJNE A,#24H,INCHR ;等于24说明到一天,清零时分秒寄存器
MOV 30H,#00H
MOV 31H,#00H
MOV 32H,#00H
INCSEC:
JMP INCTIM
INCMIN:
MOV 30H,#00H ;满60秒,清零秒存储器
JMP INCTIM
INCHR:
MOV 30H,#00H ;满60分,清零分寄存器,秒存储器
MOV 31H,#00H
INCTIM:
MOV R0,#00H ;秒存储器清零
SCAN:
CJNE R1,#6,DISPLAY ;6位数码管扫描值为6,则完成一次扫描
MOV R1,#00H ;清零扫描计数器,继续扫描
JMP SCAN
DISPLAY:
CJNE R1,#0,CHK1 ;秒低位显示
MOV A,30H
ANL A,#0FH
MOV P2,#0DFH
JMP RELOAD
CHK1:
CJNE R1,#1,CHK2 ;秒高位显示
MOV A,30H
SWAP A
ANL A,#0FH
MOV P2,#0EFH
JMP RELOAD
CHK2:
CJNE R1,#2,CHK3 ;分低位显示
MOV A,31H
ANL A,#0FH
MOV P2,#0F7H
JMP RELOAD
CHK3:
CJNE R1,#3,CHK4 ;分高位显示
MOV A,31H
SWAP A
ANL A,#0FH
MOV P2,#0FBH
JMP RELOAD
CHK4:
CJNE R1,#4,CHK5 ;时低位显示
MOV A,32H
ANL A,#0FH
MOV P2,#0FDH
JMP RELOAD
CHK5:
CJNE R1,#5,RELOAD ;时高位显示
MOV A,32H
SWAP A
ANL A,#0FH
MOV P2,#0FEH
RELOAD:
MOV P1,A ;扫描显示
INC R0
INC R1
MOV TH0,#0F0H
MOV TL0,#60H
POP ACC
RETI
FILTER:
MOV R6,#60H
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
END,P3.0-3.3调秒分时。供电后,程序似乎卡住,求解
|
-
-
数字表.PDF
52.32 KB, 下载次数: 5, 下载积分: 黑币 -5
仿真图
-
-
运行时的图片.pdf
165.3 KB, 下载次数: 3, 下载积分: 黑币 -5
运行失败图
|