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

📄 ioexma1.asm

📁 MC68HC08908GP32微控制器IO实验
💻 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 + -