单片机。键盘中断模块编程实例

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

相关文档
最新文档