以下是一个60秒倒计时的程序,可以实现,我试过的! 你看看,行不行。 ORG 0000H AJMP MAIN ORG 0030H N EQU 5FH ;定义秒记数器单元,因60H~7FH定义为堆栈区 BCD1 EQU 5EH ;定义个位数缓冲单元 BCD2 EQU 5DH ;定义十位数缓冲单元 CRTN1 EQU 5CH ;定义个位显示码缓冲单元 CRTN2 EQU 5BH ;定义十位显示码缓冲单元 MAIN: MOV SP,#60H ;定义60H~70H为堆栈区 MOV N,#60H ;秒记数器初始位为60 MOV P0,#82H ;"60"的显示码0C0H送十位LED MOV P2,#0C0H DELAY: MOV R7,#4 ;秒延时 DL1: MOV R6,#250 DL2: MOV R5,#250 DL3: NOP NOP DJNZ R5,DL3 JNB P3.2,MAIN3 ;每1ms检测一次P3.2引脚,若为低电平 ;则停止记时 DJNZ R6,DL2 DJNZ R7,DL1 MOV A,N CJNE A,#0H,MAIN1 ;N秒计数器不等于0,转NBCD子程序 SJMP MAIN MAIN1: ACALL NBCD ;N秒计数器到且N值又不等于0时,(N)=(N)-1 ACALL TBFLIN ;BCD码转换成显示码 ACALL DISPLAY ;显示码送LED显示器 AJMP DELAY ;进入新的1S延时 MAIN2: MOV BCD1,#0FH ;N值为0时,显示"FF" MOV BCD2,#0FH MAIN3: ACALL TBFLIN SJMP MAIN3 NBCD: CLR AC CLR C MOV A,N SUBB A,#1 MOV N,A ANL A,#0FH CJNE A,#09H,LOOP1 SJMP L1 LOOP1: JC L1 SUBB A,#06H L1: MOV BCD1,A ;个位送BCD1 MOV A,N SWAP A ANL A,#0FH MOV BCD2,A ;十位送BCD2 SWAP A ADD A,BCD1 MOV N,A RET TBFLIN: MOV A,BCD1 MOV DPTR,#DOT MOVC A,@A+DPTR MOV CRTN1,A MOV A,BCD2 MOVC A,@A+DPTR MOV CRTN2,A RET DOT: DB 0C0H,0F9H,0A4H,0B0H ;0,1,2,3 DB 99H,92H,82H,0F8H ;4,5,6,7 DB 80H,90H,40H,79H ;8,9,A,B DB 24H,30H,86H,8EH ;C,D,E,F DISPLAY:MOV P2,CRTN1 MOV P0,CRTN2 RET END
|