芯片型號iap15f2k61s2,程序見下,按下s1,計數功能正常,按下s2發送數據,串口接收緩存區無顯示,重新按下s1,計數功能不工作,請問如何解決
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV SP, #70H ; 設置堆棧指針
ACALL INIT_UART ; 初始化串口
MOV R5, #0 ; 初始化計數器
ACALL DISPLAY ; 初始顯示00
MAIN_LOOP:
ACALL KEY_SCAN ; 掃描按鍵
SJMP MAIN_LOOP ; 主循環
INIT_UART:
ANL PCON, #7FH ; 波特率不倍速 (SMOD=0)
MOV TMOD, #20H ; 定時器1模式2 (自動重裝)
MOV TH1, #0FDH ; 波特率9600 (11.0592MHz晶振)
MOV TL1, #0FDH
SETB TR1 ; 啟動定時器1
MOV SCON, #50H ; 串口模式1,允許接收
CLR TI ; 清除發送中斷標志
RET
; 數碼管顯示
DISPLAY:
MOV A, R5 ; 讀取計數值
MOV B, #10 ; 除以10分離十位和個位
DIV AB
MOV R6, A
MOV R7, B
; P0顯示十位
MOV DPTR, #TABA
MOV A, R6
MOVC A, @A+DPTR
MOV P0, A
; P2顯示個位
MOV DPTR, #TAB
MOV A, R7
MOVC A, @A+DPTR
MOV P2, A
RET
; 按鍵掃描
KEY_SCAN:
; 檢測S1按鍵 (P3.2)
JNB P3.2, KEY_S1_PRESSED
; 檢測S2按鍵 (P3.3)
JNB P3.3, KEY_S2_PRESSED
RET
KEY_S1_PRESSED:
ACALL DELAY_10MS ; 延時消抖
JB P3.2, EXIT_S1 ; 確認按鍵按下
; 等待按鍵釋放
WAIT_S1_RELEASE:
ACALL DISPLAY ; 保持顯示更新
JNB P3.2, WAIT_S1_RELEASE
; 計數器加1 (00-99循環)
INC R5
MOV A, R5
CJNE A, #100, UPDATE_DISPLAY
MOV R5, #0 ; 達到100則歸零
UPDATE_DISPLAY:
ACALL DISPLAY ; 更新顯示
EXIT_S1:
RET
KEY_S2_PRESSED:
ACALL DELAY_10MS ; 延時消抖
JB P3.3, EXIT_S2 ; 確認按鍵按下
; 等待按鍵釋放
WAIT_S2_RELEASE:
ACALL DISPLAY ; 保持顯示更新
JNB P3.3, WAIT_S2_RELEASE
; 發送當前計數值 (ASCII格式)
MOV A, R5
MOV B, #10
DIV AB ; A=十位, B=個位
ADD A, #30H ; 十位轉ASCII
ACALL SEND_CHAR ; 發送十位
MOV A, B
ADD A, #30H ; 個位轉ASCII
ACALL SEND_CHAR ; 發送個位
; 發送換行符便于查看
MOV A, #0DH ; 回車
ACALL SEND_CHAR
MOV A, #0AH ; 換行
ACALL SEND_CHAR
EXIT_S2:
RET
; 串口發送函數
SEND_CHAR:
MOV SBUF, A ; 發送字符
JNB TI, $ ; 等待發送完成
CLR TI ; 清除發送標志
RET
; 10ms延時消抖
DELAY_10MS:
MOV R0, #20
DL1:
MOV R1, #250
DL2:
DJNZ R1, DL2
DJNZ R0, DL1
RET
; 數碼管段碼表
; P2段碼表 (用于個位顯示)
TAB: DB 88H,0EBH,4CH,49H,2BH,19H,18H,0CBH,08H,09H
; P0段碼表 (用于十位顯示)
TABA: DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H
END
|