?? temp.asm
字號:
;*************************************************************************
; main.asm
; 串行口通信方式3例程
;*************************************************************************
;*************************************************************************
;定義全局變量
;*************************************************************************
SIZE EQU 40 ;定義接收緩沖區大小
UartBuf DATA 0x30 ;定時接收緩沖區
BufP1 DATA 0x30+SIZE ;定義接收緩沖區下標變量
BufP2 DATA 0x30+SIZE+1
_TI_ BIT 0x20.0 ;定義發送輔助標志
;*************************************************************************
;復位入口
;*************************************************************************
ORG 0x0000
LJMP PreMain
;*************************************************************************
;串行口中斷入口
;*************************************************************************
ORG 0x0023
LJMP UartINTSVC
;*************************************************************************
;進入主程序之前的初始化
;*************************************************************************
PreMain:
MOV SP, #(0x2F+SIZE+2) ;設置堆棧起始位置
LJMP main
;*************************************************************************
;函數:void UartInit()
;功能:串行口初始化
;*************************************************************************
UartInit:
PUSH 0x02
CLR EA
CLR A
MOV BufP1, A
MOV BufP2, A
MOV R2, A
MOV R0, #UartBuf
UartInit_for:
MOV @R0, A
INC R0
INC R2
CJNE R2, #SIZE, UartInit_for
CLR TR1
SETB RXD
SETB TXD
SETB _TI_
MOV SCON, #0xD0 ;串行口方式3(9位Uart),允許接收
ORL PCON, #0x80 ;波特率加倍
ANL TMOD, #0x0F
ORL TMOD, #0x20 ;設置T1為8位自動重裝定時器
MOV A, #0xFA
MOV TH1, A
MOV TL1, A ;設置波特率為9600
SETB TR1 ;啟動定時器T1
SETB ES ;使能串行口中斷
SETB EA
POP 0x02
RET
;*************************************************************************
;函數:void UartINTSVC() interrupt 4
;功能:串行口中斷服務函數
;*************************************************************************
UartINTSVC:
;保護寄存器
PUSH ACC
PUSH PSW
PUSH 0x00
PUSH 0x02
;處理接收中斷
JNB RI, UartINTSVC_TI
MOV R2, SBUF
CLR RI
MOV A, R2 ;開始判斷校驗位
MOV C, P
JNB RB8, UartINTSVC_next
CPL C
UartINTSVC_next:
JC UartINTSVC_TI
MOV A, #UartBuf ;校驗通過,保存數據
ADD A, BufP1
INC BufP1
MOV R0, A
MOV A, R2
MOV @R0, A
MOV A, BufP1
CLR C
SUBB A, #SIZE
JC UartINTSVC_TI
MOV BufP1, #0
;處理發送中斷
UartINTSVC_TI:
JNB TI, UartINTSVC_end
CLR TI
SETB _TI_
;恢復寄存器
UartINTSVC_end:
POP 0x02
POP 0x00
POP PSW
POP ACC
;中斷返回
RETI
;*************************************************************************
;函數:void UartSendChar(unsigned char c)
;功能:通過串行口發送單個字節
;參數:
; c:被發送的字節數據,取值0x00~0xFF
;*************************************************************************
;c = R7
UartSendChar:
JNB _TI_, $
CLR _TI_
MOV A, R7
MOV C, P
MOV TB8, C
MOV SBUF, A
RET
;*************************************************************************
;函數:void main()
;功能:主函數
;*************************************************************************
main:
LCALL UartInit
main_for:
MOV A, BufP2
XRL A, BufP1
JZ main_endif
MOV A, #UartBuf
ADD A, BufP2
INC BufP2
MOV R0, A
MOV A, @R0
MOV R7, A
LCALL UartSendChar
MOV A, BufP2
CLR C
SUBB A, #SIZE
JC main_endif
MOV BufP2, #0
main_endif:
SJMP main_for
;*************************************************************************
;程序結束
;*************************************************************************
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -