用两个动态数码管从0显示到60,由89C51的P1口输出,不加译码器,直接连接数码管,注意是动态数码管,不是两个单独的静态数码管。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机汇编语言源码:
ORG 0000H LJMP MAIN ORG 0100H MAIN: ;开始初始化 MOV DPTR,#TAB ;表首址送DPTR MOV R1, #0 MOV R2, #0 ;------------------------------------------------------- M1: MOV R0, #50 LOOP: CALL DIS DJNZ R0, LOOP ;循环显示80遍,约用1.6s ;------------------------------------------------------- MOV A, R3 ;这是计数值 ADD A, #1 DA A ;变成 BCD 码,即:00~99H CJNE A, #60H, SSS CLR A SSS: MOV R3, A ;计数值分解. MOV B, #16 DIV AB ;分成高、低四位 MOV R2, A ;准备去显示 MOV R1, B SJMP M1 ;转到前面,显示80遍 ;------------------------------------------------------- DIS: ;显示程序. MOV A, R2 ;显示十位. MOVC A, @A+DPTR CLR P2.1 MOV P1, A SETB P2.0 ;十位的位选. CALL DLY
MOV A, R1 ;个位显示. MOVC A, @A+DPTR CLR P2.0 ;关闭十位的显示. MOV P1, A SETB P2.1 ;个位的位选. CALL DLY RET ;------------------------------ TAB: DB 0xc0,0xf9,0xa4,0xb0,0x99 ;共阳极段码 0~4 DB 0x92,0x82,0xf8,0x80,0x90 ;共阳极段码 5~9 ;------------------------------------------------------- DLY: MOV R6, #20 ;10ms延时. D1: MOV R7, #248 DJNZ R7, $ DJNZ R6, D1 RET
|