?? sci_pc.asm
字號:
*-----------------------------------------------------------------*
*文件名:SCI_PC.ASM *
*硬件連接:單片機PTA定義為輸出,與OUT模塊的8個LED連接,用于顯示 *
* 其中A0作為運行指示不受其它數據控制 *
* PTB與與電位器相連連接作為AD輸入,PTB口作為模擬量輸入口 *
* PTC的(C0-C4)與IN模塊的5位撥位開關連接 *
* 串行口與微機串行口相接(9600,N,8,1),駐留程序已定義 *
*程序描述:1、緩沖區接收8個模擬量與一位開關量 *
* 2、以86為握手信號與PC機通信,PC機接收到握手信號后回送 *
* 一個握手信號,然后單片機向PC機發送緩沖區內數據, *
* PC機接收并顯示 *
*說明:此程序用于實現PC機與MCU的通信 *
*-----------------------------------------------------------------*
*---------口地址定義-----------------------------------------------
PTA equ $0000 ;A口寄存器
PTB equ $0001 ;B口寄存器
PTC equ $0002 ;C口寄存器
PTD equ $0003 ;D口寄存器
DDRA equ $0004 ;A口方向寄存器
DDRB equ $0005 ;B口方向寄存器
DDRC equ $0006 ;C口方向寄存器
DDRD equ $0007 ;D口方向寄存器
PTE equ $0008 ;E數據寄存器
*========SCI===============================================SCI寄存器
SCSR equ $0016 ;SCI狀態寄存器
b_TDRF equ 7 ;發送緩沖區空標志位
b_TC equ 6 ;發送完成標志位
b_RDRF equ 5 ;接收器滿標志位
SCDR equ $0018 ;SCI數據寄存器
*----------A/D------------------------------------------------------
ADSCR equ $003C ;A/D轉換狀態和控制寄存器
b_COCO equ 7 ;轉換完成標志位
ADR equ $003D ;A/D轉換數據寄存器
ADCLK equ $003E ;A/D轉換輸入時鐘寄存器
*
RAMstartAddr equ $0040 ;RAM的起始地址(因芯片不同可以更改)
FlashStartAddr equ $8000 ;程序開始地址(因芯片不同可以更改)
*--------數據區定義(變量名定義)-----------------------------------
org RAMstartAddr
INBUF rmb 1 ;1字節存放5位開關量
ADBUF rmb 8 ;8字節存放8路A/D轉換結果
OnOff rmb 1 ;1字節存放從PC的數據
*========主程序入口=================================================
org FlashStartAddr ;程序起始地址
MainInit: ;復位后程序從此開始執行
;系統初始化
SEI ;禁止所有中斷
LDHX #$023F ;堆棧初始化,放入GP32的RAM最高端
TXS
JSR Init0 ;調系統初始化子程序Init0,初始學習時跳過此處
NOP
LDA #$3E ;A/D初始化2分頻、使用內部總線時鐘
STA ADCLK
LDA #$FF ;定義PTA輸出
STA DDRA
LDA #$00
STA PTA
STA OnOff
LDA #$00 ;定義PTB,PTC作為輸入
STA DDRB
STA DDRC
*-------A/D轉換-------------------------------------------------------
MAIN: ;循環獲得8路AD值
NOP
LDHX #$0 ;初始H:X=0
GA_Repeat:
TXA ;X寄存器送到累加器
STA ADSCR ;選定一路A/D,啟動轉換
BRCLR b_COCO,ADSCR,* ;等待A/D轉換完成
LDA ADR ;A/D轉換結果給A
STA ADBUF,X ;A給{ADBUF+X},儲存數據
AIX #1 ;下一存儲單元
CPX #$08 ;判斷8路轉換是否完成
BNE GA_Repeat ;循環8次轉換8個通道模擬量
Get_IN:
LDA PTC ;5位開關量采集
STA INBUF ;暫放INBUF中
NOP
LDA #$56 ;把86(16進制數56)為握手信號送出到PC中
BRCLR b_TDRF,SCSR,* ;等待以前數據全部發出,SCTE置1,發送緩沖區空
STA SCDR ;發送緩沖區空時,可向SCI數據寄存器送數
*----串行通信輸入---------------------------------------------------
NOP
LDHX #0
WS_Repe1:
BRSET b_RDRF,SCSR,WS_Rece1 ;測試SCRF位,判斷接收緩沖器是否滿
NOP
AIX #1 ;延時等待
CPHX #$DFFF
BNE WS_Repe1
BRA DISP1 ;超時退出
WS_Rece1:
LDA SCDR ;讀取收到的數據
CMP #$56 ;判斷是否為確認信號86
BNE DISP1 ;不是退出,是就開始通信
NOP
LDHX #0
WS_Repe2:
BRSET b_RDRF,SCSR,WS_Rece2 ;測試SCRF位,判斷接收緩沖器是否滿
NOP
NOP
AIX #1 ;延時等待
CPHX #$6688
BNE WS_Repe2
BRA DISP1 ;超時退出
WS_Rece2:
LDA SCDR ;讀取收到的數據
NOP
AND #$FE ;A0=0
PSHA
LDA OnOff
AND #%00000001 ;留下A.0
STA OnOff
PULA
ORA OnOff ;處理接收的數據,放在A中
STA OnOff ;儲存接收數據在ONOFF中
NOP
*--把在INBUF和ADBUFF的數據送PC機輸出-------------------------------
LDHX #$0
SA_Repeat:
LDA INBUF,X ;第一個數據為開關量,緊接著8個A/D轉換值
BRCLR b_TDRF,SCSR,* ;SCTE為1,則發送緩沖區空,可以重新發數據
STA SCDR ;A給SCDR,發送出去
AIX #1
CPX #$09 ;9個數據輸出
BNE SA_Repeat
Disp1:
NOP
LDA OnOff
EOR #$1 ;把原A.0取反,使燈閃爍
STA OnOff
STA PTA
BRA MAIN
*------以下為子程序存放處----------------------------------------
*----系統初始化子程序(Init0)----------------------------------*
*功能:系統初始化 *
*入口:無 *
*出口: *
*占用CPU內寄存器:A *
*-------------------------------------------------------------*
Init0: ;系統初始化Init0子程序
LDA #%00000001 ;初始化CONFIG2
STA $001E
LDA #%00111101 ;初始化CONFIG1
STA $001F
CLR $0036 ;初始化PTCL
MOV #$01,$0036
MOV #$01,$0038
MOV #$2C,$0039
MOV #$80,$003A
BSET 5,$0036
BSET 7,$0037
BSET 4,$0036
RTS
*-------------------------------------------------------------------
ORG $FFFE ;復位矢量
DW MainInit
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -