📄 sy3.asm
字号:
;实验内容
;根据硬件连线,利用键盘中断编写程序完成以下功能:
;(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 + -