DIS0 EQU 30H DIS1 EQU 31H DIS2 EQU 32H DIS3 EQU 33H DIS4 EQU 34H DIS5 EQU 35H TIME1 EQU 36H TIME2 EQU 37H ORG0000H LJMP ZHU ORG001BH LJMP TT ORG 0030H ZHU:MOVSP,#6FH;堆栈指针 MOVTMOD,#10H;计数器工作方式 MOVTH1,#3CH;赋初值 MOVTL1,#B0H SETB EA;开中断 SETB ET1;开定时器T1中断 SETB TR1;启动T1 MOV50H,#20;定时1秒循环次数 MOV51H,#60;定时一分循环次数 MOV52H,#60;定时一小时循环次数 MOV53H,#24;定时一天循环次数 MOV54H,#7 CLRF0;清标志位 OO:LCALL MOD;调显示子程序 LCALL START;调整子程序 LJMP OO TT:MOVTH1,#3CH;重赋初值 MOVTL1,#B0H DJNZ 50H,TT1;未到一秒继续循环 MOV50H,#20 INC55H;到一秒,秒计数单元加1 MOVA,55H MOVB,#10 DIVAB;分离秒计数单元个位十位 MOVDIS4,A;秒十位存储 MOVDIS5,B;秒个位存储 MOVA,51H; CJNE A,55H,TT1;未到一分继续循环 INC56H;到一分,分计数单元加1 MOVA,56H MOVB,#10 DIVAB;分离分计数单元个十们 MOVDIS2,A;分十位存储 MOVDIS3,B;分个位存储 MOV55H,#00H;到一分秒计数单元清0 MOVA,52H CJNE A,56H,TT1;未到一小时继续循环 INC57H;到一小时小时计数单元加1 MOVA,57H MOVB,#10 DIVAB;分离小时计数单元个位十位 MOVDIS0,A;存小时高十位 MOVDIS1,B;存小时个位 MOV56H,#00H;到一小时分计数单元清0 MOVA,53H CJNE A,57H,TT1;未到一天继续循环 MOV57H,#00H;一天,小时清0 TT1:RETI MOD:PUSH ACC;保护现场 PUSH DPH PUSH DPL MOVR0,#DIS0;指向显示缓冲区首单元 MOVR6,20H;选中最左数码管 MOVR7,00H;显示延时值 MOVA,#00H;位选口清0 MOVP2,A DIR:MOVA,R0;取要显示的数 MOVDPTR,#WEI;指向字形表首址 MOVC A,@A+DPTR;查表得字形码 MOVP0,A;送字形码 MOVA,R6;取位选字 MOVP2,A;送位选字 YAN:DJNE R7,YAN;显示延时 INCR0;更新显示单元 CLRC MOVA,R6;取位选字 RRCA;位选字右移 MOVR6,A;更新位选单元 JNZDIR;A不等于0继续循环 POPDPL;恢复现场 POPDPH POPACC RET START:CLRC MOV A,#0FFH;置输入方式 MOVP1,A MOVA,P1;键状态输入 MOVR4,#0;初始键号 LP:RRCA JNCN1;C等于0,有键按下 INCR4 DJNZ 54H,LP1 MOVR4,#00H;过7清0 MOV54H,#7 LP1:SJMP LP N1:LCALL DLY-6MS JC NEXT JB F0,GAI;叛别是第几次按下功能键,第一次顺序执行 CJNE R4,#00H,NEXT;叛别是否第一功能键按下,IF否则转 MOVDIS0,#00H;清秒计数单元为0 SETB F0;置标志位 CLRET1;关中断 CLRTR1;关定时 LJMP NEXT GAI:CJNE R4,#00H,L1;第二次按键转到此,如不是功能键则转 LJMP RES L1:CJNE R4,#01H,L2;如按键为分加一键,则顺序执行 INC56H;分计数单元加1 MOVA,56H CJNE A,#60,NEXT MOV56H,#00H LJMP NEXT L2:CJNE R4,#02H,NEXT INC57H MOVA,57H CJNE A,#24,NEXT MOV57H,#00H LJMP NEXT RES:CLRF0 SETB TR1 SETB ET1 NEXT:RET DLY-6MS:MOVTIME1,#10 L3:MOVTIME2,#120 L4:NOP NOP DJNZ TIME2,L4 DJNZ TIME1,L3 RET WEI:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0,1,2,3,4,5,6,7,8,9, END
作者:yl520 2008-1-23 10:52:00 |