📄 mcn_sy4.asm
字号:
*-----------------------------------------------------------------*
;硬件接线
;(1) PTA7~0接指示灯D7-D0,PTB3作为模拟量输入口接电位器中间输出端,PTC0接开关K0。
;(2)串行口与微机串行口相接(已连好)。
;实验内容
;(1)通过开关K0合上与断开控制A/D转换的开始和停止,当开始A/D转换后,每秒对连接到PTB3的模拟量采样一次,结果送指示灯D7~D0显示。
;(2)采样结果同步通过串行接口发送到PC机(38400bps,N,8,1),显示格式为“The signal is:x.xV”(满量程为5.0V)。
;(3)开关K0合上后,MCU与PC先建立握手信号,握手信号为$68(MCU端发送)、$69(PC端回送),当握手成功后再开始工作。(选做内容)
*---------口地址定义-----------------------------------------------
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串行通信口地址------------------------------------------------
SCC1 equ $0013 ;SCI控制寄存器1
SCC2 equ $0014 ;SCI控制寄存器2
SCSR equ $0016 ;串行通信接口状态寄存器地址
SCDR equ $0018 ;串行通信接口数据寄存器地址,scdr是接受和发送数据的最终平台,从pc收数据,即从scdr收,发数据即
;发给scdr
SCBR equ $0019 ;SCI波特率寄存器
b_TDRF equ 7 ;发送缓冲区空标志位
b_TC equ 6 ;发送完成标志位
b_RDRF equ 5 ;接收器满标志位
*----------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 18 ;18个字符放“The signal is:x.xV”
ADBUF rmb 1 ;1字节存放8路A/D转换结果
OnOff rmb 1 ;1字节存放从PC的数据
hwei rmb 1 ;h的暂存位
*========主程序入口=================================================
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
*----串行口初始化------------------------------------------------------
LDA #%01000000 ;D6(ENSCI)=1,允许SCI,其它位为0,正常码输出,8位
;数据,无检验
STA SCC1
LDA #%00001100 ;允许发送器,允许接收器,不允许发送与接收中断
STA SCC2
LDA #%00000000 ;波特率为38400bps
STA SCBR
LDHX #$00
Display1: ;把要显示的18个初始字符放入inbuf中
LDA DisplayBytes,X
STA inbuf,X
AIX #1
CPHX #$12
BNE Display1 ;循环18次
BRA MAIN
DisplayBytes FCB "The signal is:x.xV"
MAIN:
onoroff:
lda ptc
and #%00000001
cbeqa #%00000001,onoroff
LDHX #$00
*-------A/D转换-------------------------------------------------------
NOP
lda #$3 ;初始a=3,取ptb3
STA ADSCR ;选定ptb3 进行A/D,启动转换
BRCLR b_COCO,ADSCR,* ;等待A/D转换完成,b_COCO是adscr的第5位,1表示转换结束,0表示正在转换
LDA ADR ;A/D转换结果给A,adr 用来存放ad中的数据,在每一次A/D转换后adr自动更新
STA ADBUF ;A给{ADBUF},储存数据,adbuf中的内容就是ptb3进行ad转化后的内容
lda adbuf
sta pta ;把adbuf中的内容给到pta即给到LED
lda adbuf
ldx #$32
mul
stx hwei
ldhx hwei
ldx #$ff
div ;00-$ff的ad量变成00-$32(50b)
clrh
ldx #$a
div
add #$30
sta {inbuf+!14}
sthx hwei
lda hwei
add #$30
sta {inbuf+!16}
*--把在ADBUFF的数据送PC机输出,以“The signal is:x.xV”形式-------------------------------
LDHX #$0
SA_Repeat:
LDA INBUF,X ;第一个数据为开关量,紧接着8个A/D转换值
BRCLR b_TDRF,SCSR,* ;SCTE为1,则发送缓冲区空,可以重新发数据
STA SCDR ;A给SCDR,发送出去
AIX #1
CPX #$12 ;18个数据输出
BNE SA_Repeat
LDA #$1 ;延时
JSR DelaySub
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
*----程序延时子程序(DelaySub)---------------------------------*
*功能:程序方法延时,延时长短由入口A中的数值决定 *
*入口:A=延时长度 *
*注:最小延时0.1秒,最大延时A=$FF ,255*0.1=25.5秒 *
*占用CPU内寄存器:HX,A *
*-------------------------------------------------------------*
DelaySub: ;延时0.1秒
PSHH ;保据寄存器HX
PSHX
DelaySub1:
LDHX #$FFFF
DelaySub2:
PSHA ;保护寄存器A
LDA #$FF
DelaySub3:
DBNZA DelaySub3
PULA
DBNZX DelaySub2
DBNZA DelaySub1
PULX
PULH
RTS
*-------------------------------------------------------------------
ORG $FFFE ;复位矢量
DW MainInit
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -