📄 ioexma1.asm
字号:
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
*
RAMstartAddr equ $0040
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 #%00000010,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口灯
COMA ;取反
STA PTC ;驱动C口灯
STA Light_BC ;保存状态
IO_End:
LDA #$3 ;延时的入口参数
JSR DelaySub
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
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 + -