📄 sy3.asm
字号:
JSR KB_def ;把定义后的字符asc放入a
JSR LCDCommand ;让下排右边显示按键值
RTS
*----键盘中断初始化子程序(KB_Init)-------------------------*
*功能:对被定义为键盘中断的引脚进行初始化,但未开放键盘中断*
*占用CPU内寄存器:A *
*----------------------------------------------------------*
KB_Init:
LDA #%00 ;定义A口之前复位PTA
STA PTA
LDA #%11111000 ;定义A口2-0为输入,5-3为输出
STA DDRA
LDA #%00000111 ;定义A口2-0有上拉电阻
STA PTAPUE
;BSET 0,INTKBSCR ;按要求2,则不执行本语句;按要求3,则执行本语句
BSET 1,INTKBSCR ;屏蔽键盘中断(IMASK=1)
LDA #%00000111 ;允许KBIE2-0pin中断进入
STA INTKBIER
BSET 2,INTKBSCR ;清除键盘中断请求(ACKK=1)
BCLR 1,INTKBSCR
RTS
*----扫描读取键值(KB_A)---------------------------------------*
*功能:扫描一次接在PTA口的4*4键盘(PTA7-4 接4根键盘行线,PTA3-0 *
* 接4根键盘列线)上的按键,读取键值->A,若无按键,A中WZ为 *
* $FF *
*入口:无 *
*占用内存:TmpVar1(缓冲使用) *
*出口:A=键值 *
*-------------------------------------------------------------*
KB_A:
MOV #%11110111,TmpVar1 ;使第一根列线为0(低电平)
LDX #$03 ;将扫描3根行线
KB_A1:
LDA PTA ;取PTA->A
ORA #%11111000 ;PTA2-0保留原态,PTA5-3令为1
AND TmpVar1 ;令PTAn=0,n=3\4\5
STA PTA
NOP
NOP
LDA PTA ;看第n列是否有键按下
AND #%00000111 ;PTA7-4保留原态,令低4为=0
CBEQA #$07,KB_A2 ;A等于$F0,说明本列线上没有键家按下,在转KB_A2
;A不等于$F0,找到了被按下得键
;取键值-〉A
LDA PTA
BRA KB_A3
KB_A2:
SEC ;令C=1
ROL TmpVar1 ;使下一个列线为0
DBNZX KB_A1 ;对列线循环
LDA #$FF ;没有键被按下为$FF
KB_A3:
RTS
*----键值转为定义值子程序(KB_def)-----------------------------*
*功能:键值转为键盘表面定义的字符或符号代表值 *
*入口:内存第0页中KB_value中为键值,使用键值编号表 *
*占用CPU寄存器:X *
*出口:A=键定义值 *
*-------------------------------------------------------------*
KB_Def:
LDHX #$0000
KB_Def1:
LDA KB_Table,X
BEQ KB_Def3 ;=0,表示表中未定义此键值
CMP KB_value ;与入口键值相比较
BNE KB_Def2 ;不等,未找到转KB_key2
INCX ;找到
LDA KB_Table,X ;取键定义值-〉A
BRA KB_DefR
KB_Def2:
INCX ;(HX)+1->(HX),跳过键定义
INCX ;(HX)+1->(HX),跳过对应键上的数字定义
BRA KB_Def1 ;转去判断是不是下一个键
KB_Def3:
LDA #$FF ;未定义键用FF标志
KB_DefR:
RTS
KB_Table FCB %11110110,"1",%11101110,"2",%11011110,"3"
FCB %11110101,"4",%11101101,"5",%11011101,"6"
FCB %11110011,"7",%11101011,"8",%11011011,"9"
FCB $00
*----键盘中断子程序(KB_Int)-----------------------------------*
*功能:键盘中断程序,键值放入内存KB_value中 *
*调用子程序:扫描法读取键值子程序(KB_A) *
*出口:第0页内存单元KB_value中为键值 *
*-------------------------------------------------------------*
KB_Int:
PSHH ;保护H(其他CPU寄存器已自动保护)
SEI
BSET 1,INTKBSCR ;禁止键盘中断
;--以下为键盘中断程序任务-------------------
JSR KB_A ;调子程序KB_A取得键值-〉A
STA KB_value ;放内存KB_value中
JSR KB_def ;转为键定义值
STA Key_Buffer ;根据键定义值进行相应的处理,1、2执行加减,其余显示键号
CMP #$31
BNE KB_Int1
LDA value
INCA
CMP #$39
BHS KB_Int2
STA value
BRA KB_Int4
KB_Int1:
LDA Key_Buffer
CMP #$32
BNE KB_Int4
LDA value
DECA
CMP #$2F
BLS KB_Int3
STA value
BRA KB_Int4
KB_Int2:
LDA #$30
STA value
BRA KB_Int4
KB_Int3:
LDA #$38
STA value
BRA KB_Int4
KB_Int4:
JSR Init-LCD ;LCD初始化
JSR Show-LCD-Buffer ;把LCD-BUFFER中的16个字符送LCD显示
LDA #$8
JSR DelaySub
;-----以上为键盘中断程序任务-------------------
PULH ;H出栈(其他CPU寄存器已自动保存)
;----------------------------------------------
JSR KB_Init ;执行键盘初始化程序
BCLR 1,INTKBSCR ;开放键盘中断(IMASKK=0)
CLI
RTI
*----程序延时子程序(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 $FFE0 ;键盘中断矢量
FDB KB_Int
ORG $FFFE ;复位矢量
FDB MainInit
;BSET 0,INTKBSCR ;按要求2,则不执行本语句;按要求3,则执行本语句
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -