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

📄 sy3.asm

📁 利用键盘中断编写程序完成以下功能: (1)在LCD上排显示"TJU EIE05 xxxxxx"
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;实验内容 
;根据硬件连线,利用键盘中断编写程序完成以下功能:
;(1)在LCD上排显示"TJU EIE05 xxxxxx",其中xxxxxx表示学号,下排右端显示按键的键号1~9。
;(2)1键对下排左端显示的内容进行加1操作,2键对下排左端显示的内容进行减1操作,数的变化范围在0~8之间,初始值为0。



*------口地址定义------------------------------------------------------
PTA     equ  $0000              ;A口数据寄存器
DDRA    equ  $0004              ;A口数据方向寄存器
PTAPUE  equ  $000D              ;A口上拉电阻允许寄存器
DDRB    equ  $0005              ;B口数据方向寄存器   (PTB口接开关作为从机号)
PTB     equ  $0001              ;B口数据寄存器
PTC     equ  $0002              ;C口数据寄存器
DDRC    equ  $0006              ;C口数据方向寄存器

LCD-RS  equ  0                  ;LCD寄存器选择信号接PTC0
LCD-RW  equ  1                  ;读写信号接PTC1
LCD-E   equ  2                  ;LCD使能信号接PTC2

INTKBSCR       equ  $001A         ;键盘状态和控制寄存器
INTKBIER       equ  $001B         ;键盘中断允许寄存器

RAMstartAddr   equ  $0040       ;RAM的起始地址(因芯片不同可以更改)
FlashStartAddr equ  $8000       ;程序开始地址(因芯片不同可以更改)
*-----变量定义--------------------------------------------------------
      org RAMstartAddr
LCD_Buffer  rmb  16             ;第一行显示缓冲器(16字节)
Key_Buffer  rmb  1              ;键盘值
value      rmb    16             ;第二行显示缓冲器
TmpVar1    rmb     1            ;变量TmpVar1,缓冲使用
KB_value   rmb     1            ;键盘按键值
**********************************************************************
      org FlashStartAddr
MainInit:                       ;复位后程序从此开始执行 
        ;系统初始化
        SEI                     ;禁止所有中断
        LDHX #$023F             ;堆栈初始化,放入GP32的RAM最高端
        TXS
        JSR  Init0              ;调系统初始化子程序Init0,初始学习时跳过此处
        ;I/O初始化
        NOP
        JSR  KB_Init
        LDA  #%11111111         ;B口为输出
        STA  DDRB
        LDA  #%00010111         ;C口的PTC0-2为输出
        STA  DDRC
        LDA  #$30
        STA  value
        CLI
        LDHX #$00
Display1:                       ;把要显示的16个初始字符放入LCD-Buffer中
        LDA  DisplayBytes,X
        STA  LCD_Buffer,X
        AIX  #1
        CPHX #$10
        BNE  Display1            ;循环16次
        BRA  Start
DisplayBytes  FCB  "TJU EIE05 052633"

;主程序循环
Start:
        JSR  Init-LCD            ;LCD初始化   
        JSR  Show-LCD-Buffer     ;LCD显示
        LDA  #$4
        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       

*---INIT-LCD(LCD初始化子程序)----------------------------------------*
*入口:无                                                             *
*功能:初始化LCD(HD44780)                                             *
*调用子程序:LCDCOMMAND(LCD命令执行子程序)                            *
*占用CPU内部寄存器:A,X                                               *
*--------------------------------------------------------------------*
Init-LCD:
        BCLR LCD-RS,PTC         ;令LCD的RS=0,R/W=0,进行LCD初始化
        BCLR LCD-RW,PTC
        LDA  #%00111000         ;功能设置:8位数据接口,2行显示,5*7点阵模式
        JSR  LCDCommand
        LDA  #%00001000         ;显示开关控制:关显示,关光标显示,不闪烁
        JSR  LCDCommand
        LDHX #$0020             ;等待40us
        DBNZX *
        BCLR LCD-RS,PTC         ;RS,RW清零开始清屏
        BCLR LCD-RW,PTC
        LDA  #%00000001          ;清屏指令
        JSR  LCDCommand
        LDHX #$2DF              ;等待清屏完毕,时间>1.6ms
Clr-LCD-2-MS:                   ;延时
        AIX #-1
        CPHX #0
        BNE Clr-LCD-2-MS
        LDA #%00000110          ;输入方式设置:数据读写操作后,AC自动增1                           
                                ;显示不动,光标左移
        JSR LCDCommand
        LDA #%00010100          ;光标移位设置:光标右移一个字符位,AC自动加1
        JSR LCDCommand
        LDA #%00001100          ;显示开关设置:开显示,关光标显示,不闪烁
        JSR LCDCommand
        RTS

***********************************************************************
*----LCDCommand(LCD命令执行子程序)------------------------------------*
*入口:A                                                               *
*功能:对A中指令使用PORTA作为输出口,到LCD进行命令执行或字符显示        *
*占用CPU内部寄存器:A                                                  *
*----------------------------------------------------------------------
LCDCommand:
        PSHH                     ;保护现场
        PSHX
        LDHX #$0020              ;等待40us
        DBNZX *
        STA PTB                  ;把指令码送到B口
        NOP
        NOP
        BSET LCD-E,PTC           ;LCD开始接受数据,置使能位为1
        NOP
        NOP
        BCLR LCD-E,PTC           ;LCD结束接受数据,置使能位为0
        LDHX #$0020              ;等待40us
        DBNZX *
        PULX                     ;恢复现场
        PULH
        RTS

***********************************************************************
*----Show-LCD-Buffer(LCD显示子程序)-----------------------------------*
*入口:内存LCD-Buffer开始的16个地址中存放要显示的字符编码、value       *
*功能:显示内存LCD-Buffer开始的16字节数据在第一行,value中容在第二行   *     
*调用:LCDCommand子程序                                                *
*占用CPU内部寄存器:A,HX                                               *
*---------------------------------------------------------------------*
Show-LCD-Buffer:                ;进行显示数据寄存器(DD RAM)地址设置
        BCLR LCD-RS,PTC
        BCLR LCD-RW,PTC         ;设置前8个字符首DD RAM地址
        LDA  #%10000000
        JSR  LCDCommand
        LDHX #$00                ;显示前16个字符
Show-First-16Byte:
        BSET LCD-RS,PTC         ;令LCD的RS=1,R/W=0,写入数据到DD RAM中
        BCLR LCD-RW,PTC
        LDA  LCD_Buffer,X        ;将{LCD-BUFFER+X}的数据放入A作为入口
        JSR  LCDCommand
        AIX  #1
        CPHX #$10
        BNE  Show-First-16Byte
        BCLR LCD-RS,PTC
        BCLR LCD-RW,PTC
        LDA  #%11000000          ;设置后1个字符首DD RAM地址
        JSR  LCDCommand
        LDHX #$00               ;显示后1个字符
Show-Next-16Byte:
        BSET LCD-RS,PTC         ;令LCD的RS=1,R/W=0,写入数据到DD RAM中
        BCLR LCD-RW,PTC
        LDA  value              ;将value的数据放入A作为入口
        JSR  LCDCommand
        ldhx #$1C
kongge:      
        aix #-1
        lda $20
        JSR  LCDCommand
        dbnzx kongge
        JSR  KB_A                                              

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -