软件:proteus 8/keil5
P3.1实现加一、P3.3实现减一
ORG 0000H
AJMP MAIN
MAIN: LCALL CSH
MAIN1: LCALL KEY ;按键处理
LCALL BCD ;30`33H分别保存数码管1~4显示的数字
LCALL XS ;一个数码管工作时
JMP MAIN1
CSH: MOV R7,#125 ;设定初始值为125
RET
KEY: JB P3.1,KEY2 ;P3.1连接按键低电平有效,高电平则检测P3.3按键状态
JNB P3.1,$ ;等待按键松开
INC R7 ;数码管显示加1
CJNE R7,#250,KEY2 ;由于16位寄存器只有DPTR、PC,所以单寄存器存取数时,只
MOV R7,#250 ;有256个数的范围波动
KEY2: JB P3.3,KEY3
JNB P3.3,$
DEC R7 ;数码管显示减1
CJNE R7,#100,KEY3
MOV R7,#100
KEY3: RET ;LCALL与RET相对应
BCD: MOV 30H,#0 ;通过DIV指令,将该数个、十、百位存放在33H、32H、31H
MOV A,R7
MOV B,#100
DIV AB
MOV 31H,A
MOV A,B
MOV B,#10
DIV AB
MOV 32H,A
MOV 33H,B
RET
XS: MOV R6,#4 ;有4个数码管
MOV R5,#0FEH ;设定第一位数码管位选
MOV R0,#30H
MOV DPTR,#TAB
LOOP: MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A ;通过这三个指令,找到千位0所对应的段选
MOV P2,R5 ;送位选
LCALL DELAY
MOV P2,#0FFH ;消隐
MOV A,R5
RL A
MOV R5,A ;通过A寄存器,将位选左移,变为第二个数码管
;的位选
INC R0
DJNZ R6,LOOP
RET
DELAY: MOV R4,#20
DJNZ R4,$
RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END