📄 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 + -