芯片型号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
|