实验六 串口通信实验(基于STC15W4K58S4芯片的汇编语言开发)
·
芯片: STC15W4K58S4
实验代码:
ORG 0000H
AJMP MAIN
ORG 0023H
AJMP SIRIAL_ISR
AUXR DATA 8EH
ORG 0500H
MAIN:
P4 DATA 0C0H
P5 DATA 0C8H
P0M0 DATA 94H
P0M1 DATA 93H
P4M0 DATA 0B4H
P4M1 DATA 0B3H
P5M0 DATA 0CAH
P5M1 DATA 0C9H
MOV 50H , #00H
MOV 60H , #00H
MOV 70H , #00H
MOV 71H , #00H
MOV DPTR , #5000H
MOV P0 , #00H
MOV P4 , #00H
MOV P5 , #00H
MOV P0M0 , #00H
MOV P0M1 , #00H
MOV P4M0 , #00H
MOV P4M1 , #00H
MOV P5M0 , #00H
MOV P5M1 , #00H
LCALL UARTINIT
LOOP:
LCALL BUTTON_JUDGE
LCALL DYNAMIC_DISPLAY_1
LCALL DYNAMIC_DISPLAY_2
AJMP LOOP
UARTINIT: ;9600bps@12.000MHz
MOV SCON,#50H ;8位数据,可变波特率
ANL AUXR,#0BFH ;定时器1时钟为Fosc/12,即12T
ANL AUXR,#0FEH ;串口1选择定时器1为波特率发生器
ANL TMOD,#0FH ;设定定时器1为16位自动重装方式
MOV TL1,#0E6H ;设定定时初值
MOV TH1,#0FFH ;设定定时初值
CLR ET1 ;禁止定时器1中断
SETB TR1 ;启动定时器1
SETB ES
SETB EA
RET
SIRIAL_ISR:
CLR EA
CLR RI
PUSH ACC
PUSH DPH
PUSH DPL
MOV A,SBUF
MOV 70H , #0FH
ANL 70H , A
MOV 71H , #0F0H
ANL 71H , A
MOV A , 71H
SWAP A
MOV 71H , A
POP DPL
POP DPH
POP ACC
SETB EA
RETI
BUTTON_JUDGE:
MOV P0 , #0F0H
MOV A , P0
CJNE A , #0F0H , Button_Debouncing
AJMP RETURN_BUTTON
Button_Debouncing:
LCALL DELAY10MS
MOV A , P0
CJNE A , #0F0H ,JUDGE_X
AJMP RETURN_BUTTON
JUDGE_X:
JNB ACC.4 , ROW_X_3
JNB ACC.5 , ROW_X_2
JNB ACC.6 , ROW_X_1
JNB ACC.7 , ROW_X_0
ROW_X_3:
MOV 60H , #0
AJMP JUDGE_Y
ROW_X_2:
MOV 60H , #4
AJMP JUDGE_Y
ROW_X_1:
MOV 60H , #8
AJMP JUDGE_Y
ROW_X_0:
MOV 60H , #12
AJMP JUDGE_Y
JUDGE_Y:
MOV P0 , #0FH
LCALL DELAY1MS
MOV A , P0
MOV R4 , #01H
JNB ACC.3 , ROW_Y_3
JNB ACC.2 , ROW_Y_2
JNB ACC.1 , ROW_Y_1
JNB ACC.0 , ROW_Y_0
AJMP RETURN_BUTTON
ROW_Y_3:
MOV A , P0
JNB ACC.3 , ROW_Y_3
MOV A , 60H
ADD A , #3
MOV 60H , A
MOV SBUF , A
LCALL CHECK_TI_OK
AJMP RETURN_BUTTON
ROW_Y_2:
MOV A , P0
JNB ACC.2 , ROW_Y_2
MOV A , 60H
ADD A , #2
MOV 60H , A
MOV SBUF , A
LCALL CHECK_TI_OK
AJMP RETURN_BUTTON
ROW_Y_1:
MOV A , P0
JNB ACC.1 , ROW_Y_1
MOV A , 60H
ADD A , #1
MOV 60H , A
MOV SBUF , A
LCALL CHECK_TI_OK
AJMP RETURN_BUTTON
ROW_Y_0:
MOV A , P0
JNB ACC.0 , ROW_Y_0
MOV A , 60H
ADD A , #0
MOV 60H , A
MOV SBUF , A
LCALL CHECK_TI_OK
AJMP RETURN_BUTTON
RETURN_BUTTON:
RET
CHECK_TI_OK:
JNB TI , CHECK_TI_OK
CLR TI
RET
DYNAMIC_DISPLAY_1:
MOV A , 70H
MOVC A , @A+DPTR
MOV 50H , A
MOV R1 , 50H
MOV R2 , #00H
LCALL DIGITAL_TUBE_DISPLAY
RET
DYNAMIC_DISPLAY_2:
MOV A , 71H
MOVC A , @A+DPTR
MOV 50H , A
MOV R1 , 50H
MOV R2 , #01H
LCALL DIGITAL_TUBE_DISPLAY
RET
DIGITAL_TUBE_DISPLAY:
LCALL SELECT_LED
LCALL SELECT_DISPLAY_NUMBER
SETB P5.4
LCALL DELAY5US
CLR P5.4
RET
SELECT_LED:
MOV R3 , #00H
MOV A , R2
FOR_LED:
CJNE R3 , #08H ,AGAIN_LED
MOV R3 , #00H
AJMP RETURN
AGAIN_LED:
MOV 40H , R3
CJNE A , 40H , NEXT_LED
CLR P4.0
LCALL PULSE
INC R3
AJMP FOR_LED
NEXT_LED:
SETB P4.0
LCALL PULSE
INC R3
AJMP FOR_LED
RET
SELECT_DISPLAY_NUMBER:
MOV R3 , #00H
MOV A , R1
FOR_DISPLAY:
CJNE R3 , #08H , AGAIN_DISPLAY
MOV R3 , #00H
AJMP RETURN
AGAIN_DISPLAY:
JB ACC.7 , NEXT_DISPLAY
CLR P4.0
LCALL PULSE
INC R3
RL A
AJMP FOR_DISPLAY
NEXT_DISPLAY:
SETB P4.0
LCALL PULSE
INC R3
RL A
AJMP FOR_DISPLAY
RET
RETURN:
RET
PULSE:
SETB P4.3
LCALL DELAY5US
CLR P4.3
RET
DELAY10MS: ;@12.000MHz
NOP
PUSH 30H
PUSH 31H
MOV 30H,#94
MOV 31H,#93
NEXT_10:
DJNZ 31H,NEXT_10
DJNZ 30H,NEXT_10
POP 31H
POP 30H
RET
DELAY1MS: ;@12.000MHz
NOP
PUSH 30H
PUSH 31H
MOV 30H,#10
MOV 31H,#81
NEXT_1:
DJNZ 31H,NEXT_1
DJNZ 30H,NEXT_1
POP 31H
POP 30H
RET
DELAY5US: ;@12.000MHz
NOP
NOP
NOP
NOP
PUSH 30H
MOV 30H,#8
NEXT:
DJNZ 30H,NEXT
POP 30H
RET
ORG 5000H
TABLE:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
END
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)