問題: 按一下開關數字加一,按到00062時亂碼,再按到00065時自動復位00000.
更改: SP,#30 ,加到00102時亂碼,00105時自動復位00000.
問題已糾結了一段時間,能力所限未能解決,懇請師兄師姐相助,感激不盡.
單片機源程序如下:
;20201202
;STC15W202S
;5位數LCD 加數器
;I/O口直接輸出
;SEG=P3.0~P3.3,P3.6~P3.7,P1.1
;COM1~COM5=P1.3~P1.5,P5.4,P5.5
;計數開關=P1.2
;RC:11.0592MHz
P1M1 EQU 0x91
P1M0 EQU 0x92
P3M1 EQU 0xB1
P3M0 EQU 0xB2
P5M1 EQU 0xC9
P5M0 EQU 0xCA
P5 EQU 0C8H
;------------------------------------------------
ORG 0000H
AJMP SETTING
ORG 100H
;------------------------------------------------
SETTING: MOV SP, #80H
;設定SEG推挽輸出
;設定COM高阻抗
MOV P3M1,#00000000B
MOV P3M0,#11111111B
MOV P1M1,#11111000B
MOV P1M0,#00000001B
MOV P5M1,#11111111B
MOV P5M0,#00000000B
;------------------------------------------------
;R0=個位數,R1=十位數....
;預載入 "00000"
MOV R0,#0
MOV R1,#0
MOV R2,#0
MOV R3,#0
MOV R4,#0
;------------------------------------------------
;等P1.2高電位(通過開關)
WAIT_SW_H: ACALL DISP_ALL;掃瞄顯示全部
JNB P1.2,WAIT_SW_H;P1.2=0,JMP
;等P1.2低電位(通過開關)
WAIT_SW_L: ACALL DISP_ALL;掃瞄顯示全部
JB P1.2,WAIT_SW_L;P1.2=1,JMP
ACALL DISP_ALL
CALC: CJNE R0,#9,INC_R0;R0少於9,跳轉R0+1
MOV R0,#0;R0=9,清0
CJNE R1,#9,INC_R1
MOV R1,#0
CJNE R2,#9,INC_R2
MOV R2,#0
CJNE R3,#9,INC_R3
MOV R3,#0
CJNE R4,#9,INC_R4
AJMP CALC;累加至"99999"後停止
;------------------------------------------------
;個位數加1
INC_R0: INC R0
AJMP WAIT_SW_H
;十位數加1
INC_R1: INC R1
AJMP WAIT_SW_H
;百位數加1
INC_R2: INC R2
AJMP WAIT_SW_H
;千位數加1
INC_R3: INC R3
AJMP WAIT_SW_H
;萬位數加1
INC_R4: INC R4
AJMP WAIT_SW_H
;------------------------------------------------
;顯示全部
DISP_ALL:
;顯示個位數
MOV A,R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P3,A
RLC A
RLC A
RLC A
MOV P1.0,C
MOV P5M1,#11011111B
MOV P5M0,#00100000B
SETB P5.5
ACALL DELAY_1MS
ACALL COM_HI_IMPEDANCE
MOV A,R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR
CPL A
MOV P3,A
RLC A
RLC A
RLC A
MOV P1.0,C
MOV P5M1,#11011111B
MOV P5M0,#00100000B
CLR P5.5
ACALL DELAY_1MS
ACALL COM_HI_IMPEDANCE
; 顯示十位數
MOV A,R1
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P3,A
RLC A
RLC A
RLC A
MOV P1.0,C
MOV P5M1,#11101111B
MOV P5M0,#00010000B
SETB P5.4
ACALL DELAY_1MS
ACALL COM_HI_IMPEDANCE
MOV A,R1
MOV DPTR,#TABLE
MOVC A,@A+DPTR
CPL A
MOV P3,A
RLC A
RLC A
RLC A
MOV P1.0,C
MOV P5M1,#11101111B
MOV P5M0,#00010000B
CLR P5.4
ACALL DELAY_1MS
ACALL COM_HI_IMPEDANCE
;顯示百位數
MOV A,R2
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P3,A
RLC A
RLC A
RLC A
MOV P1.0,C
MOV P1M1,#11011000B
MOV P1M0,#00100001B
SETB P1.5
ACALL DELAY_1MS
ACALL COM_HI_IMPEDANCE
MOV A,R2
MOV DPTR,#TABLE
MOVC A,@A+DPTR
CPL A
MOV P3,A
RLC A
RLC A
RLC A
MOV P1.0,C
MOV P1M1,#11011000B
MOV P1M0,#00100001B
CLR P1.5
ACALL DELAY_1MS
ACALL COM_HI_IMPEDANCE
;顯示千位數
MOV A,R3
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P3,A
RLC A
RLC A
RLC A
MOV P1.0,C
MOV P1M1,#11101000B
MOV P1M0,#00010001B
SETB P1.4
ACALL DELAY_1MS
ACALL COM_HI_IMPEDANCE
MOV A,R3
MOV DPTR,#TABLE
MOVC A,@A+DPTR
CPL A
MOV P3,A
RLC A
RLC A
RLC A
MOV P1.0,C
MOV P1M1,#11101000B
MOV P1M0,#00010001B
CLR P1.4
ACALL DELAY_1MS
ACALL COM_HI_IMPEDANCE
;顯示萬位數
MOV A,R4
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P3,A
RLC A
RLC A
RLC A
MOV P1.0,C
MOV P1M1,#11110000B
MOV P1M0,#00001001B
SETB P1.3
ACALL DELAY_1MS
ACALL COM_HI_IMPEDANCE
MOV A,R4
MOV DPTR,#TABLE
MOVC A,@A+DPTR
CPL A
MOV P3,A
RLC A
RLC A
RLC A
MOV P1.0,C
MOV P1M1,#11110000B
MOV P1M0,#00001001B
CLR P1.3
ACALL DELAY_1MS
ACALL COM_HI_IMPEDANCE
RET
;------------------------------------------------
;COM1~COM5=設定高阻抗
COM_HI_IMPEDANCE:
MOV P1M1,#11111000B
MOV P1M0,#00000001B
MOV P5M1,#11111111B
MOV P5M0,#00000000B
RET
;------------------------------------------------
DELAY_1MS:
MOV R7,#10
DL1_1MS: MOV R6,#10
DL2_1MS: MOV R5,#26
DL3_1MS: DJNZ R5,DL3_1MS
DJNZ R6,DL2_1MS
DJNZ R7,DL1_1MS
RET
;------------------------------------------------
TABLE:
DB 008H,0BDH,054H,094H,0B1H,092H,02H,0BCH,010H,090H;0~9
;------------------------------------------------
END
|