P1是位选,p2是段选.
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP INT
MAIN: MOV TMOD,#01H
MOV TH0,#0
MOV TL0,#1
SETB EA
SETB ET0
SETB TR0
MOV R6,#0 ;------------- R6用于存储1~9
MOV R4,#44H ; 刚上电时让第四个数码管显示0
;--------------R1~R4用于存放四个数码管对应的段码---------
DISPLAY: MOV A,R6
MOV DPTR,#TAB2
MOVC A,@A+DPTR
MOV R1,A
MOV A,R6
MOV DPTR,#TAB3
MOVC A,@A+DPTR
MOV R2,A
PLAY: MOV P1,#0FFH
MOV R7,#100 ;关非正常微亮
DJNZ R7,$
MOV A,R4
MOV P1,#7FH
MOV P2,A
MOV R7,#100 ;调节亮度
DJNZ R7,$
MOV P1,#0FFH
MOV R7,#100 ;关非正常微亮
DJNZ R7,$
MOV A,R1
MOV P1,#0EFH
MOV P2,A
MOV R7,#100 ;调节亮度
DJNZ R7,$
MOV P1,#0FFH
MOV R7,#100 ;关非正常微亮
DJNZ R7,$
MOV A,R2
MOV P1,#0DFH
MOV P2,A
MOV R7,#100 ;调节亮度
DJNZ R7,$
LJMP DISPLAY
;----------------------------------------------------------
DELAY: MOV R7,#100
MOV R3,#100
LAY: MOV R2,#20
DJNZ R2,$
DJNZ R3,LAY
DJNZ R7,LAY
RET
;***********扫描键盘子程序*************************
KEYSCAN:
MOV P1,#0FH
JB P1.3,OFF
MOV R7,#100
DJNZ R7,$
JNB P1.3,SCAN
RET
SCAN: MOV A,#07FH
CONTINUE: MOV P1,A
JNB P1.3,RECORD
RR A
CJNE A,#0FEH,CONTINUE
RECORD: MOV R0,A ;R0用于存储键码
KEYDEAL: MOV A,R0
CJNE A,#7FH,OFF
LCALL K4
OFF: MOV P1,#0FFH
RET
K4: INC R6
LCALL DELAY
MOV A,R6
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV R4,A
CJNE R6,#10,RETURN
MOV R6,#0
RETURN: RET
;----------------------------------------------------
INT: LCALL KEYSCAN ; 键盘扫描放定时器中断里面
MOV TH0,#0
MOV TL0,#1
RETI
;------------------------------------------------------
TAB1: DB 44H,0DEH,62H,52H,0D8H,51H,41H,0D6H,40H,50H
TAB2: DB 44H,44H,44H,44H,0DEH,62H,52H,0D8H,41H,040H
TAB3: DB 44H,0DEH,0D8H,50H,41H,51H,41H,50H,0D8H,0DEH
END
注意:如果你使用的是STC5608单片机 运行此程序可能会出现的情况:
1,数码管闪烁显示;2,数码管显示1、4、7时会卡死或者只有1、4、7可以正常显示 ,
如果遇到以上情况建议换用STC5204或换质量较高的电源线然后一切就会正常了。