这是读取键盘的子程序
主要内容为:如何定义位,如何得到按键状态,防止键盘干扰的方法
以及如何处理读入的键值
思路:首先在某一引脚输出一个电平,然后读入引脚的电平,如果刚好相反
那么可能有按键发生,但是不排除干扰,为了防止干扰,需要软件延时20ms
消除干扰,然后,等待用户释放,否则,可能重复的到某种结果,发生意外情况
应该说键盘输入是单片机外部指令输入的重要途径,因此如何设计键盘以及键盘的工作原理、读键盘的方法、键盘的抗干扰设计等在单电能机系统设计中占有重要地位。这个例子在系统硬件的基础上设计了软件查询程序、软件延时程序(防止干扰),大致讲述了一种查询式键盘的工作原理与读取方式。
下面是汇编语言写的单片机键盘输入程序
**************************************************
led1 bit p1.0 ;LED 显示位定义
led2 bit p1.1
led3 bit p1.2
led4 bit p1.3
led5 bit p1.4
led6 bit p1.5
led7 bit p1.6
led8 bit p1.7
s1 bit p0.0 ;数码管位定义
s2 bit p0.1
s3 bit p0.2
s4 bit p0.3
s5 bit p0.4
s6 bit p0.5
s7 bit p0.6
s8 bit p0.7
led_data equ p2 ;数码管显示数据定义
key1 bit p3.5 ;按键引脚定义
key2 bit p3.6 ;
key3 bit p3.7 ;
key equ 46h ;按键寄存单元
org 00h
jmp main
org 030h
main:mov sp,#30h ;首先定义
lcall REST ;初始化子程序
lp:lcall pro_key ;调用键盘查询子程序
lcall KEYPR ;用来显示所查询到的键值
jmp lp ;反复调用,不断查询
REST:
mov a,#00h
mov b,#00h
mov p0,#0
mov p1,0ffh ;
mov p2,#0
mov key,#00h
mov p2,#255
clr beep
RET
KEYPR:
mov a,key ;键值在累加器KEY中
jz PROEND ;如果 A= 0,表示没有按键,返回
cjne a,#1,k1 ;A= 1 ,用户按了第一个键
mov a,#1 ;处理 A = 1的情况
mov dptr,#tab_nu ;查表
movc a,@a+dptr
mov led_data,a ;显示 "1"
setb s1 ;在第一位
clr s2 ;其余两位不显示
clr s3
jmp PROEND ;处理完成,子程序返回
;以下分别处理KEY = 2,3 的情况
k1:cjne a,#2,k2
mov a,#2
mov dptr,#tab_nu
movc a,@a+dptr
mov led_data,a
clr s1
setb s2
clr s3
jmp PROEND
k2:cjne a,#3, PROEND
mov a,#3
mov dptr,#tab_nu
movc a,@a+dptr
mov led_data,a
clr s1
clr s2
setb s3
PROEND:ret
**** 本内容跟帖回复才可浏览 *****
;************ 定时20 ms *************
delay20ms: push psw ;保存原来的寄存器单元
clr psw.3 ;设置新的寄存器
clr psw.4 ;
mov r0,#2 ;延时参数1
mov r1,#250 ;延时参数2
mov r2,#2 ;延时参数3
dl1:djnz r0,dl1 ;延时循环1
mov r0,#250 ;重新设置循环数据
dl2:djnz r1,dl1 ;开始第二道循环
mov r0,#240 ;
mov r1,#248 ;
dl3:djnz r2,
| 感动 | 同情 | 无聊 | 愤怒 | 搞笑 | 难过 | 高兴 | 路过 |
| Copyright © 2007-2012 China Research and Development Network, All Rights Reserved | ||
| 举报邮箱:co@chnrd.com 鄂ICP备09003885号 | ||