📄 ioexma1.asm.bak
字号:
*-----------------------------------------------—----------------*
*文件名:IOEXMA1.ASM *
*硬件连接:PTA7-4接开关,PTA3-0接指示灯 *
* PTB1接指示灯,PTBO接开关 *
* PTC1接指示灯,PTC0接开关 *
*程序描述:1、开关PTA7-4分别控制着指示灯PTA3-0亮灭 *
* 2、开关PTB0、PTC0其中之一闭合指示灯PTB1与PTC1交替亮灭, *
* 若两个均未闭合则指示灯PTB1与PTC1均不亮, *
* 若两个均闭合,则两排指示灯均亮。 *
*目的:I/O口的基本使用方法 *
*说明:供基本教学使用 *
*--------------------------------------------------—-------------*
*映像寄存器地址定义—————————------————————————
DDRA equ $0004 ;A口数据方向寄存器
PTA equ $0000 ;A口数据寄存器
PTAPUE equ $000D ;A口上拉电阻允许寄存器
*
DDRB equ $0005 ;B口数据方向寄存器
PTB equ $0001 ;B口数据寄存器
*
DDRC equ $0006 ;C口数据方向寄存器
PTC equ $0002 ;C口数据寄存器
*
RAMstartAddr equ $0040 ;RAM的起始地址(因芯片不同可以更改)
FlashStartAddr equ $8000 ;程序开始地址(因芯片不同可以更改)
*数据区定义(变量名定义)———————————————
org RAMstartAddr ;RAM的起始地址
TmpVar rmb 1 ;变量TmpVar,缓冲使用
Light_BC rmb 1 ;BC口灯的状态
;---
*==================================================================
*主程序——————————————————————————————
org FlashStartAddr ;程序起始地址
MainInit: ;复位后程序从此开始执行
NOP ;系统初始化
SEI ;禁止所有中断
LDHX #$023F ;堆栈初始化,放入GP32的RAM最高端
TXS
JSR Init0 ;调系统初始化子程序Init0,初始学习时跳过此处
;I/O初始化
LDA #%00001111 ;定义A口7-4为输入,3-0为输出
STA DDRA
LDA #%11110000 ;定义A口7-4有上拉电阻
STA PTAPUE
LDA #%11111110 ;定义A口7-1为输出,0为输入
STA DDRB
STA DDRC ;定义A口6-1为输出,0为输入
MOV #$FF,Light_BC ;BC口的状态赋初值
Start: ;程序总循环入口
NOP
LDA PTA ;读取A口状态
NSA ;A口7-4输入控制A口3-0输出
;刚好为A7-4->A3-0
STA PTA
LDA PTB ;取开关PTB0状态,0不闭合
AND #%00000001 ;剩下PTB0位
STA TmpVar ;放入变量TmpVar
NOP
LDA PTC ;取开关PTC0状态,0不闭合
AND #%00000001 ;剩下PTC0位
NOP
ADD TmpVar ;经过此运算若A=0,两个均闭合
;若A=1,有一个闭合;若A=2,均未闭合
CBEQA #$0,Light0 ;A=0转Light0
NOP
CBEQA #$1,Light1 ;A=1转Light1
NOP ;A=2,两排均不亮
LDA #$FF
STA PTB
STA PTC
BRA IO_End ;转IO_END
Light0:
LDA #$00 ;两排灯均亮
STA PTB
STA PTC
BRA IO_End ;转IO_END
Light1:
LDA Light_BC ;两排灯之一亮
STA PTB ;驱动B口灯
NEGA ;取反
STA PTC ;驱动C口灯
STA Light_BC ;保存状态
IO_End:
LDA #$FE ;延时
Delay1:
LDX #$FC
Delay2:
NOP
NOP
NOP
DBNZX Delay2
DBNZA Delay1
BRA Start ;转开始处
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 + -