DJNZ R7,delay1 POP 07 RET
LEDTAB:DB 03H,9FH,25H,0DH;0,1,2,3 DB 99H,49H,41H,1FH;4,5,6,7 DB 01H,09H,11H,0C1H;8,9,A,B DB 63H,85H,61H,71H;C,D,E,F END
2、修改上面的程序,设计一个N秒倒计时器(N为学号后两位)。倒计时时间到后,重新开始计时。 LEDCLK BIT ; LEDDIN BIT ;
LEDDATA DATA P0; DSEG AT 30H dispbuf: ds 8;显示缓冲区 timetick: ds 1 second: ds 1 minute: ds 1 hour: ds 1
TIMECOUNT EQU 50000 CSEG at 0000H SJMP MAIN ORG 000BH LJMP P_T0 P_T0:
ORG 0030H;中断服务程序
PUSH PSW PUSH ACC PUSH DPH PUSH DPL
MOV TH0,#(65535-TIMECOUNT)/256
MOV TL0,#(65535-TIMECOUNT)MOD 256 SETB RS0;后面所使用的R0~r7
DJNZ timetick,P_T01 MOV timetick,#20 dec second MOV A,second
CJNE A,#00,P_T01 MOV SECOND,#33 P_T01: MOV A,second
MOV B,#100 DIV AB MOV R0,#dispbuf+2 MOV @R0,A DEC R0 MOV A,B MOV B,#10 DIV AB MOV @R0,A DEC R0 MOV @R0,B CLR RS0 POP DPL POP DPH POP ACC POP PSW RETI MAIN: mov sp,#60h MOV dispbuf,#0 MOV dispbuf+1,#0 MOV dispbuf+2,#0 MOV dispbuf+3,#0 MOV dispbuf+4,#0 MOV dispbuf+5,#0 MOV dispbuf+6,#0 MOV dispbuf+7,#0 mov timetick,#20 mov second,#33 MOV TH0,#(65535-TIMECOUNT)/256;3CAF MOV TL0,#(65535-TIMECOUNT)MOD 256; MOV TMOD,#01H
SETB ET0;允许T0溢出中断 SETB TR0;启动t0 SETB EA;开启总中断
MAIN1: ACALL DISP SJMP MAIN1 DISP: MOV R6,#8 MOV R0,#dispbuf CLR LEDCLK
CLR LEDDIN NOP
DISP1: SETB LEDCLK MOV A,@R0 MOV DPTR,#LEDTAB MOVC A,@A+DPTR MOV LEDDATA,A; MOV R7,#5 ACALL DelayNms INC R0 SETB LEDDIN CLR LEDCLK DJNZ R6,DISP1
RET; 大延时
DelayNms:
D1: ACALL Delay1ms DJNZ R7,D1
RET; 延时子程序
Delay1ms: push 07 mov R7,#250 delay1: NOP NOP DJNZ R7,delay1 POP 07 RET LEDTAB: DB 03H,9FH,25H,0DH;0,1,2,3 DB 99H,49H,41H,1FH;4,5,6,7 DB 01H,09H,11H,0C1H;8,9,A,B DB 63H,85H,61H,71H;C,D,E,F END
思考题
1、在实验程序基础上编写一个24小时计时时钟。 LEDCLK BIT ; LEDDIN BIT ;
LEDDATA DATA P0; DSEG AT 30H
dispbuf: ds 8;显示缓冲区 timetick: ds 1
second: ds 1 minute: ds 1 hour: ds 1
TIMECOUNT EQU 50000 CSEG at 0000H SJMP MAIN ORG 000BH LJMP P_T0
ORG 0030H;中断服务程序
P_T0:
PUSH PSW PUSH ACC PUSH DPH PUSH DPL
MOV TH0,#(65535-TIMECOUNT)/256
MOV TL0,#(65535-TIMECOUNT)MOD 256 SETB RS0;后面所使用的R0~r7
DJNZ timetick,P_T02 MOV timetick,#20 INC second MOV A,second
CJNE A,#60,P_T01;秒 MOV SECOND,#0 inc minute; MOV A,minute;分 CJNE A,#60,P-T01 INC HOUR;时 MOV A,HOUR CJNE A,#12,P-T01 MOV HOUR,#0
P_T01: MOV A,second MOV B,#100 DIV AB
MOV R0,#dispbuf+2 MOV @R0,A DEC R0 MOV A,B MOV B,#10 DIV AB
MOV @R0,A
DEC R0
MOV @R0,B P_T02: CLR RS0 POP DPL POP DPH POP ACC POP PSW RETI MAIN:
mov sp,#60h MOV dispbuf,#0 MOV dispbuf+1,#0 MOV dispbuf+2,#0 MOV dispbuf+3,#0 MOV dispbuf+4,#0 MOV dispbuf+5,#0 MOV dispbuf+6,#0 MOV dispbuf+7,#0
MOV TH0,#(65535-TIMECOUNT)/256;3CAF MOV TL0,#(65535-TIMECOUNT)MOD 256; MOV TMOD,#01H;设定定时器的工作方式 SETB ET0;允许T0溢出中断 SETB TR0;启动t0 SETB EA;开启总中断 MAIN1:
ACALL DISP SJMP MAIN1 DISP:
MOV R6,#8
MOV R0,#dispbuf CLR LEDCLK CLR LEDDIN NOP
DISP1: SETB LEDCLK MOV A,@R0
MOV DPTR,#LEDTAB MOVC A,@A+DPTR MOV LEDDATA,A; MOV R7,#5
ACALL DelayNms INC R0