MOV TMOD,#11H ;T0模式不变,T1模式1,定时l0ms
LOOP1:MOV TH1,#0ECH ;定时器T1装初值定时10ms
MOV TL1,#78H
SETB TR1 ;开T1
JNB TF1,$ ;等待T1溢出 CLR TF1 ;清除T1溢出位 ACALL DIS ;调用10ms一次数据动态显示子程
序
DJNZ R1,LOOP1 ;循环显示100次 CLR TR1 ;关定时器T1,两个定时器回到初
始模式
MOV TMOD,#51H MOV TL1,#00H MOV TH1,#00H MOV TL0,#0B0H MOV TH0,#3CH
SETB TRl ;开启两定时器 SETB TR0 RETI
显示子程序:
DIS: MOV A,R5
MOV 40H,A ;将个位放入40H单元 MOV A,R4
MOV 39H,A ;将十位放入39H单元 MOV A,R3
MOV 38H,A ;将百位放入38H单元
MOV R0,#40H ;显示数据首地址写入寄存器
R0
DISl: MOV R2,#80H ;位选信号“10000000”写到
R2
MOV A,R2
MOV DPTR,#TAB ;字形表头地址送DPTR JB P1.0,L1 ;判断正反转状态
MOV P2,A ;反转第四个数码管显示 MOV A,#40H ;符号“一”的段码送到P0
口
MOV P0,A
LCALL Dlms ;调用延时1ms子程序
17
LI: MOV R2,#0lH ;正转第四个数码管不显示
MOV A,R2
L2: MOV P2,A ;从倒数第二个数码管开始
TAB: Dlms:DL: DL1:HB2:HB3:显示
MOV A,@R0
MOVC A,@A+DPTR ;取出字形码
MOV P0,A ;送到P0口LED显示 ACALL Dlms ;调用延时1ms子程序 DEC R0 ;数据缓冲区地址向下移一
位
MOV A,R2
JB ACC.2,LP1 ;第一个数码管显示了吗? RL A ;没有,位选左移一位 MOV R2,A
AJMP L2 ;再次动态显示一次 LP1:RET
DB 3FH,06H,5BH,4FH,66H,6DH
DB 7DH,07H,7FH,6FH ;共阴极LED显示字形
编码表
MOV R7,#02H ;1ms延时子程序 MOV R6,#0FFH DJNZ R6,DL1
DJNZ R7,DL RET
CLR A ;二、十进制转换子程序
MOV R3,A MOV R4,A MOV R5,A MOV R2,#l0H
CLR C
MOV A,R7 RLC A MOV R7,A MOV A,R6 RLC A
MOV R6,A
MOV A,R5 ;R5中是个位数字 ADDC A,R5 DA A
18
MOV R5,A
MOV A,R4 ;R4中是十位数字 ADDC A,R4 DA A MOV R4,A
MOV A,R3 ;R3中是百位数字 ADDC A,R3 DA A
MOV R3,A
DJNZ R2,HB3 ;判断是否转换完成 RET
2、程序流程图: 主程序流程图
开始 中断次数10写入B 设定时器、计数器工作方式 定时器T0赋初值,定时为100ms 计数器T1清零 开定时器T0,计数器T1 开中断 等待定时中断 中断服务程序流程图
19
中断程序入口 关闭两定时器T0、T1 开定时器T1 NT1溢出? 计数器T1高八位加入R6,低八位加入R7 Y清除T0溢出位 等待 NB=0?Y重新给B赋值10 调用显示子程序DIS N调用二、十进制转换程序 HB2 R1=0? Y关闭定时器T1 显示循环次数100写入R1 两定时器T0、T1重新赋初值 重新设定工作模式T0不变,T1变为定时模式1,定时10ms 开启两定时器T0、T1 定时器T1设初值,定时为10ms 中断返回
显示子程序流程图:
20

