单片机。键盘中断模块编程实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
KB_lnit:
P SHA LDA STA LDA STA LDA STA
#$00 ;
KB_P #%00001111 KB_D #%11110000 KB PUE
保护A 复位相应
寄存器
定义7-4为输入,3-0为输出 定义输入引脚有内部上拉电阻 屏蔽键盘中断(IMASK=1) 允许输入引脚的中断可进入 BSET 1,INTKBSCR ; LDA #%11110000 ;
STA INTKBIER BSET 2,INTKBSCR ; PULA ;
RTS
*KB_Scan:扫描读取键值子程序 扫描4*4键盘,读取键值 ->A,无按键,为$FF 无
A=键值
清除键盘中断请求(ACKK=1) 恢复
A
*功能 *入口
*出口
* 堆栈深度:2+2=4 *
* KB_Scan:
AIS #-!2 ;
LDA #%11111110 STA !1,S P LDA #$04
; STA !2,S P KB_Scan1: LDA KB P ;
开辟临时变量
使第一根行线为0(低电平) 将扫描4根行线
取 KB P->A
9.2 汇编语言键盘中断模块编程实例
(2)键盘编程汇编语言子程序
下面给出有关键盘编程的汇编语言子程序。
它们是:键盘中断初始化子程序、 扫描法读
取键值子程序、键值转为定义值子程序。 即使不使用中断方式识别按键, 三个子程序仍然需
要使用。只不过键盘初始化子程序中改为不允许中断进入。 扫描法读取键值与键值转为定义
值两个子程序在键盘编程中通常需要使用的。
KBsub.ASM
*
*文件描述 :包含3个键盘子程序,分别为
:
* (1) 键盘初始化子程序
(KB_Init)
* (2)
扫描读取键值子程序 (KB_Scan) * (3)
*
键值转为定义值子程序 (KB_Def)
KB_P EQU PTA ; KB_D EQU DDRA ; KB_PUE EQU PTAPUE ; *KB_Init:
键盘初始化子程序
*功能:初始化键盘中断的引脚,但未开放键盘中断 *入口 :无
*出口 :无 *堆栈深度:2
*
:以下为子程序源代码========== ; 键盘接在PTA 口上
相应的方向寄存器
相应的上拉电阻允许寄存器
台匕
ORA #%00001111 ;KB P.7-4 保留,KB P.3-0 为 1
AND $1,S P ; 令KB_P.n=0,n=0、1、2、3
STA KB_P
NOP
NOP
LDA KB_P ; 看第n行是否有键按下
AND #%11110000 ;KE LP.7-4 保留,令低4位=0
CBEQA #$F0,KB_Scan2 ; 本行无键按下,转KB_Scan2
LDA KB_P ; 本行有键按下
BRA KB_Scan_Exit
KB_Scan2:
SEC ;C=1
ROL $1,S P ; 使下一个行线为0
DBNZ !2,S P,KB_Scan1 ; 对行线循环
LDA #$FF ; 没有键被按下返回$FF
KB_Scan_Exit:
AIS #!2 ; 释放临时变量
RTS
*KB_Def:键值转为定义值子程序----------------- * *功能:键值转为键盘定义值*
*入口:A=键值* *出口:A=键定义值*
*堆栈深度:2+3=5 * *
*
KB_Def:
P SHH ; 保护HX
P SHX
AIS #-!1 ; 开辟临时变量
STA !1,S P ; 把键值存入(!1,SP)
LDHX #KB_Table ; 取键盘定义表首地址
KB_Def1:
LDA ,X
CMP #$00 ; 与0(定义表结束标志)相比较
BEQ KB_Def3 ;=0, 表示即表中无次定义值
CMP $1,S P ; 与键值相比较
BNE KB_Def2 ; 不等,未找到转KB_Def2
AIX #!1 ; 找到
LDA ,X ; 取键定义值-〉A
BRA KB_DefR
KB_Def2:
AIX #!2 ; 指向下一个键值
BRA KB_Def1 ; 继续判断
KB_Def3:
LDA #$FF ; 无此定义,用FF标志
KB_DefR:
AIS #!1 ; 释放临时变量
P ULX ; 恢复HX
P ULH
RTS
;键盘定义表
KB_Table FCB $EE,"1",$DE,"2",$BE,"3",$7E,"A"
FCB $ED,"4",$DD,"5",$BD,"6",$7D,"B"
FCB $EB,"7",$DB,"8",$BB,"9",$7B,"C"
FCB $E7,"*",$D7,"0",$B7,"#",$77,"D"
FCB $00
922键盘中断编程举例
下面给出的实例程序的功能是, 当按下键盘上任何一个键, 产生键盘中断,在键盘中断 程序中,通过串行口发送“键值”及“键定义值”
。PC 机方程序,接收它们,并显示。
(1)键盘中断编程汇编主程序
实例编号:A03路径:\ASM\ A03_键盘实验(Keyboard.asm)
键盘实验
*[头文件]
$include "GP 32ASM.H" *[两个起始地址] RAMstartAddr equ $0040 ;RAM 的起始地址 FlashStartAddr equ $8000 ; 程序开始地址
KB Int:
SEI ; 关总中断
P SHH
;
保护H
BSET 1,INTKBSCR ;
禁止键盘中断
JSR KB_Scan ; 扫描键盘,读取键值->A JSR SCISend1 ; 发送键值 JSR KB_Def ; 转成键定义值->A JSR SCISend1 ;
发送键定义值 JSR KB_Init
BCLR 1,INTKBSCR ; 开放键盘中断(IMASKK=0) P ULH
; 恢复H CLI
;
开总中断
RTI
*文件名:Keyboard.asm
*硬件连接: *程序描述: *目 *注
的:
意:
PTA.7-4接键盘4根列线,PTA.3-0 接键盘 按下键盘按键,串口发送对应的键值 键盘扫描,键盘中断,键
值识别,键盘编码 如果键盘插在实验板的上排插孔,无须连线 插孔,需手工接线 * --《嵌入式应用技术基础教程》教学实例
4根行线 * ,若插在下排*
*[主程序]
org FlashStartAddr ; MainInit:
;
;[ 系统初始化]
SEI
;
LDHX #$023F TXS JSR JSR
JSR
程序起始地址 复位后程
序从此开始执行 关中断
GP 32Init SCIInit KB Init
调系统初始化子程序 GP 32Init 调串行口初始化子程序 SCIInit 调键盘初始化子程序
开放键盘中断(IMASK=0) 开中断
BCLR 1,INTKBSCR CLI ;
;[
程序总循环入口,无中断时空操作
MainLo op:
NOP NOP
BRA MainLoo p
*==================以下为子程序存放处 *KB_Int:
键盘中断处理程序 ------------
*功能:键盘中断程序,把键定义值从串口发送出去 *调用子程序:(1)扫描法读取键值子程序 *
(2)
键值转为定义值子程序 (KB_Scan)
(KB_Def)