新手求指教。PC和单片机的串口通信程序,三八译码器位选,数码管显示不正确,错误不知道在哪。程序如下
ORG 0000H
AJMP MAIN
ORG 0023H
AJMP IT_RXD
ORG 0030H
MAIN:
//设置T1为方式2,允许串口中断接收
MOV TMOD,#20H ;0010 0000 定时方式 方式2八位自动重转载
MOV TH1,#0FAH ;22.1184MHZ:208 //12MHZ:230
MOV TH0,#0FAH ;22.1184MHZ:208 //12MHZ:230
SETB TR1 ;开启定时器
MOV R6,#0
MOV SCON,#50H ;串行方式1,允许接受
SETB EA ;开启总开关
SETB ES ;允许串行口中断
MOV DPTR,#TAB1 //字码表首地址
CLR A //清零
MOV R0,#0 //数码管赋初值R0-R3用于数码管赋值 R6计数用于选择数码管
MOV R1,#0
MOV R2,#0
MOV R3,#0
WAIT: //数码管扫描
//数码管1
MOV A,R0 ;R0赋值给A
MOVC A,@A+DPTR ;DPTR地址初始化时指向TAB1,MOVC为偏移赋值,即当A=A+DPTR,A为1时A=3FH,为2时A=06H..以此类推到9
MOV P2,A ;P2输出到数码管
CALL DELAY ;延时5ms
//数码管2
MOV A,R1
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY
//数码管3
MOV A,R2
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY
//数码管4
MOV A,R3
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY
SJMP WAIT
IT_RXD://串口发送及接收中断程序
JB RI,AD_R6 ;判断RI是否为1,为1则说明是串口接收中断进入AD_R6,否则是发送中断则不做处理。
RET_IT_RXD: RETI
DELAY: MOV R4,#10
D1: MOV R5,#80 ;1US
DJNZ R5,$ ;2US (80*2+1)*2*40+1+1
DJNZ R4,D1
RET
CLEAR_R://串口发送过来的是S则清零
MOV R0,#0
MOV R1,#0
MOV R2,#0
MOV R3,#0
MOV R6,#0
JMP RET_IT_RXD
VALUE_R:
MOV B,R7
CLR A
ANL B,#0FH //保留低八位,高八位清零
CJNE R6,#1,TWO //R6=1跳ONE,不等跳TWO
JMP ONE
JMP RET_IT_RXD
//每进入一次接收中断选择赋值给R0还是R1还是R2还是R3,当R6=1时赋值给R0,R6=2时赋值类推。。
ONE: MOV R0,B //B赋给寄存器R0,中断返回
JMP RET_IT_RXD
TWO: CJNE R6,#2,THREE //r6=2将B付给寄存器R1并返回中断,否则跳THREE
MOV R1,B
JMP RET_IT_RXD
THREE:CJNE R6,#3,FOUR //R6=3, 将B付给寄存器R2并返回中断 否则跳FOUR
MOV R2,B
JMP RET_IT_RXD
FOUR: CJNE R6,#4,RET_IT_RXD //R6=4, 将B付给寄存器R3并返回中断 否则直接中断返回
MOV R3,B
MOV R6,#0
JMP RET_IT_RXD
AD_R6: INC R6
CLR RI
MOV R7,SBUF ;将串口接收的数据赋值给R7
MOV A,R7
MOV P1,A //p1连三八译码器
ADD A,#01H ;将串口接收的数据加一重新发送给PC
MOV SBUF,A
CLR A
CJNE R7,#83,VALUE_R ;判断字符是否为S,是的话则进入CLEAR_R清零,不是的话就进入VALUE_R给R0-R3赋值
JMP CLEAR_R
JMP RET_IT_RXD
TAB1:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH
END