⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ioexma1.asm

📁 Motorola 单片机 掌握I/O口的基本使用方法
💻 ASM
字号:
*-----------------------------------------------—----------------*
*文件名:IOEXMA1.ASM                                               *
*硬件连接:PTA7-4接开关,PTA3-0接指示灯                             *
*         PTB1接指示灯,PTBO接开关                                *
*         PTC1接指示灯,PTC0接开关                                *
*程序描述:1、开关PTA7-4分别控制着指示灯PTA3-0亮灭                 *
*         2、开关PTB0、PTC0其中之一闭合指示灯PTB1与PTC1交替亮灭, *
*            若两个均未闭合则指示灯PTB1与PTC1均不亮,             *
*            若两个均闭合,则两排指示灯均亮。                     *       
*目的:I/O口的基本使用方法                                         *
*说明:供基本教学使用                                              *
*注意:由于液晶显示模块的引脚与PTB复用,故会影响实验现象。为使现象*
*      不受干扰,应把液晶显示模块拔下来或插在下排插孔。           *
*--------------------------------------------------—-------------*

*映像寄存器地址定义—————————------————————————
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 #%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)----------------------------------*
*功能:系统初始化                                             *
*入口:无                                                     *
*出口:                                                       *
*占用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 + -