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