4X4矩阵式键盘输入程序.docx
- 文档编号:28885221
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:78
- 大小:463.05KB
4X4矩阵式键盘输入程序.docx
《4X4矩阵式键盘输入程序.docx》由会员分享,可在线阅读,更多相关《4X4矩阵式键盘输入程序.docx(78页珍藏版)》请在冰豆网上搜索。
4X4矩阵式键盘输入程序
4*4键盘程序
readkeyboard:
orla,#0f0h
mova,r2
begin:
acallkey_on
movr6,a
swapa
jnzdelay
cpla
adda,r3
ajmpreadkeyboard
jznext
ret
delay:
acalldelay10ms
ajmpkey_c
key_ccode:
pusha
acallkey_on
next:
mova,r7
swapa
jnzkey_num
jnbacc.7,error
anla,#0fh
ajmpbegin
rla
deca
key_num:
acallkey_p
movr7,a
rla
;行号乘
anla,#0FFh
ajmpl_loop
4
jzbegin
error:
mova,#00h
rla
acallkey_ccode
ret
movr7,a
pusha
key_c:
movr2,#00h
popa
key_off:
acallkey_on
movr3,#00h
anla,#0fh
jnzkey_off
mova,r6
deca
popa
movr5,#04h
adda,r7
ret
again1:
jnbacc.0,out1
ret
key_on:
mova,#00h
rra
delay10ms:
orla,#0fh
incr2
anltmod,#0f0h
movp1,a
djnzr5,again1
orltmod,#01h
mova,p1
out1:
incr2
movth0,#0d8h
orla,#0f0h
mova,r7
movtl0,#0f0h
cpla
movr5,#04h
setbtr0
ret
again2:
jnbacc.4,out2
wait:
jbctf0,over
key_p:
movr7,#0efh
rra
ajmpwait
l_loop:
mova,r7
incr3
clrtr0
movp1,a
mova,p1
djnzr5,again2
out2:
incr3单片机键盘设计
over:
ret
二)从电路或软件的角度应解决的问题
软件消抖:
如果按键较多,硬件消抖将无法胜任,常采用软件消抖。
通常采用软件延时的方法:
在第一次检测到有键按下时,执行一段延时10ms的子程序后,再确认电平是否仍保持闭合状态电平,如果保持闭合状态电平,则确认真正有键按下,进行相应处理工作,消除了抖动的影响。
(这种消除抖动影响的软件措施是切实可行的。
)
2.采取串键保护措施。
串键:
是指同时有一个以上的键按下,串键会引起CPU错误响应。
通常采取的策略:
单键按下有效,多键同时按下无效。
3.处理连击。
连击:
是一次按键产生多次击键的效果。
要有对按键释放的处理,为了消除连击,使得一次按键只产生一次键功能的执行(不管一次按键持续的时间多长,仅采样一个数据)。
否则的话,键功能程序的执行次数将是不可预知,由按键时间决定。
连击是可以利用的。
连击对于用计数法设计的多功能键特别有效。
三、键盘工作方式
单片及应用系统中,键盘扫描只是CPU的工作内容之一。
CPU忙于各项任务时,如何兼顾键盘的输
入,取决于键盘的工作方式。
考虑仪表系统中CPU任务的份量,来确定键盘的工作方式。
键盘的工作方式选取的原则是:
既要保证能及时响应按键的操作,又不过多的占用CPU的工作时间。
键盘的工作方式有:
查询方式(编程扫描,定时扫描方式)、中断扫描方式。
四、键盘电路结构
(一)独立式按键接口设计优点:
电路配置灵活,软件结构简单。
此键盘是用于按键较少或操作速度较高的场合。
也可以用扩展I/O口搭接独立式按键接口电路,可采用8255扩展I/O口,用三态缓冲器扩展。
这两种配接方式,都是把按键当作外部RAM某一工作单元的位来对待,通过读片外RAM的方法,识别按键的工作状态。
上电路中独立式按键电路,各按键开关均采用了上拉电阻,是为了保证在按键断开时,各I/O有确定的
高电平。
如输入口线内部已有上拉电阻,则外电路的上拉电阻可省去。
(二)矩阵式键盘接口设计矩阵式键盘适用于按键数量较多的场合,由行线和列线组成,按键位于行列的交叉点上。
节省I/O口。
矩阵键盘工作原理:
行线通过上拉电阻接到+5V上。
无按键,行线处于高电平状态,有键按下,行线电平状态将由与此行线相连的列线电平决定。
列线电平为低,则行线电平为低;列线电平为高,则行线电平为高。
五、双功能及多功能键设计
在单片机应用系统中,为简化硬件线路,缩小整个系统的规模,总希望设置最少的按键,获得最多的控制功能。
矩阵键盘与独立式按键键盘相比,硬件电路大大节省。
可通过软件的方法让一键具有多功能。
方法:
选择一个
RAM工作单元,对某一个按键进行按键计数,根据不同计数值,转到子程序。
这种计数多功能键最好与显示器结合用,以便知道当前计数值,同时配合一个启动键。
复合键是使用软件实现一键多功能的另一个途径。
所谓复合键,就是两个或两个以上的键的联合,当这些键同
时按下时,才能执行相应的功能程序。
实际情况做不到“同时按下”,他们的时间差别可以长到50ms,解决策略
是:
定义一个或两个引导键,这些引导键按下时没什么意义,执行空操作。
引导键的例子:
微机键盘上的CTRL、
SHIFT、ALT。
缺点:
一是操作变得复杂,二是操作时间变长。
多功能键的利用,应具体情况具体分析。
要求速度的场合最好做一键一功能。
如果系统功能很多,一键一功能不现实,可采取一键多功能。
六、功能开关及拨码盘接口设计
设计原因:
键盘输入灵活性大,操纵方便。
但某些重要功能或数据由键盘输入,误操作将产生一些不良后果。
因此常设定静态开关的方法来执行这些功能或输入数据。
静态开关一经设定,将不再改变,一直维持设定的开关状态。
通常这些开关状态是在单片机系统加电时由CPU读入内存RAM的,以后CPU将不再关注这些开关的状
态,因此,即使加电后,这些开关的状态发生变化,也不会影响CPU的正常工作,只有在下一次加电时,这些新状
态才能生效。
第一,功能开关:
主要是根据开关的状态执行一些重要的功能。
第二,拨码盘:
单片机应用系统中,有时要输入一些控制参数,这些参数一经设定,将维持不变,除非给系统断电后重新设定。
这时使用数字拨码盘既简单直观,又方便可靠。
七、按键介绍
常用的按键有三种:
机械触点式按键、导电橡胶式和柔性按键(又称触摸式键盘)。
机械触点式按键是利用弹性使键复位,手感明显,连线清晰,工艺简单,适合单件制造。
但是触点处易侵入灰尘而导致接触不良,体积相对较大。
导电橡胶按键是利用橡胶的弹性来复位,通过压制的方法把面板上所有的按键制成一块,体积小,装配方便,适合批量生产。
但是时间长了,橡胶老化而使弹力下降,同时易侵入灰尘。
柔性按键是近年来迅速发展的一种新型按键,可以分为凸球型和平面型两种。
凸球型动作幅度触感明显,富有立体感,但制造工艺相对复杂;平面型幅度微小,触感较弱,但工艺简单,寿命长。
柔性按键最大特点是防尘、防潮、耐蚀,外形美观,装嵌方便。
而且外形和面板的布局、色彩、键距可按照整机的要求来设计。
八、单片机系统键盘设计实例
键盘工作方式采用定时扫描方式。
采用定时器T0定时,CPU每隔200ms扫描键盘一次,即通过读取573的
输出数据,识别按键的工作状态。
对于重键(串键:
指同时有一个以上的键按下),采用软件提供保护,当判断为一个以上的键按下,则不处理,返回重新进行监测。
只有监测到一个键按下时,才判断键值,执行相应键处理工作。
在每一页中,键盘对数据的修改是通过
键盘对液晶显示的控制是通过显示画面的页码作为接口参数来完成的。
对按键次数的计算作为接口参数来实现的。
具体例程如下:
voidkeyscan()
/*键盘扫描*/
{oId=newz;
/*
原键值
{ucherdatanewz
,temp,pat;
等于新键值
*/
if(time_out)
keymana();
/*
调键散
{ACC=MJP;
/*读
转程序*/
取573数据*/
}
temp=ACC&0x0f,
/*取低四位*/
if(temp!
=0x0f)
/*有键按
下*/
eIse;
{msec(10);
/
}
*延时10MS*/
eIse;
ACC=MJP;
/*读取
}
573数据*/
eIsr;
temp=ACC&0x0f
oId=temp;
/*原键
if(temp=0x0f)
值不变*/
{newz=temp;
/*读取新键
time_out=0
/*
标志位
值*/
置零*/
pat=newzSId;
/*键值有无变
}
化*/
eseI;
if(pat)>0)
/*有
}
变化*/
4*4键盘程序
;0123--P30
K1:
LCALLDELAY2
PUSHACC
DJNZR5,L7
;4567--P31
LCALLKS
K4:
LCALLDELAY2
RET
;89AB--P32
JNZK2
LCALLKS
TAB:
DB0C0H;0
;CDEF--P33
AJMPKEY
JNZK4
DB0F9H;1
;P34P35P36P37
K2:
MOVR2,#0EFH
POPACC
DB0A4H;2
ORG0000h
MOVR4,#00H
RET
DB0B0H;3
LJMPMAIN
K3:
MOVP3,R2
NEXT:
INCR4
DB099H;4
ORG0030h
L6:
JBP3.0,L1
MOVA,R2
DB092H;5
MAIN:
MOVA,#00H
JNBACC.7,KEY
DB082H;6
MOVDPTR,#TAB
AJMPLK
RLA
DB0F8H;7
LCALLKEY
L1:
JBP3.1,L2
MOVR2,A
DB080H;8
MOVCA,@A+DPTR
MOVA,#04H
AJMPK3
DB090H;9
MOVP0,A
AJMPLK
KS:
MOVP3,#0FH
DB088H;A
CLRP1.3
L2:
JBP3.2,L3
MOVA,P3
DB083H;b
LJMPMAIN
MOVA,#08H
XRLA,#0FH
DB0C6H;C
KEY:
LCALLKS
AJMPLK
RET
DB0A1H;d
JNZK1
L3:
JBP3.3,NEXT
DELAY2:
MOVR5,#08H
DB086H;E
LCALLDELAY2
MOVA,#0cH
L7:
MOVR6,#0FAH
DB08EH;F
AJMPKEY
LK:
ADDA,R4
L8:
DJNZR6,L8
END
4X4矩阵键盘扫描汇编程序
PROC
KEYCHK
NEXT3:
CJNE
A,#0A0H,EXIT
RL
A
KEYNAME
DATA
ORLKEYNAME,
40H
#0E0H
ADD
A,R2
;(b7-b5纪录按键状态,
b4位为有效
WAIT:
MOV
A,KEYRTIME
位,;b3-b0
纪录按键)
JNZ
EXIT
MOV
DPTR,#KE
KEYRTIME
DATA
43H
KEYSCAN:
YTAB
SIGNAL
DATA
50H
MOVR1,#0
MOVC
A,@A+DPTR
KEY
EQU
P3
MOV
R3,#11110111B
ANL
KEYNAME,
#0E0H
KEYPL
EQU
P0.6
LOOP:
MOV
A,R3
ORL
KEYNAME,
RL
A
A
RTIME
EQU
30
MOV
R3,A
MOV
KEYRTIME
#RTIME
KEYCHK:
MOV
KEY,#0FH
MOV
KEY,A
CLR
KEYPL
MOV
A,KEY
MOV
A,KEY
ORL
A,#0F0H
MOV
SIGNAL,#
CJNE
A,#0FH,NE
CJNE
A,#0FFH,NEXT31
10
XT1
EXIT:
MOV
KEY,#0FFH
J
CLR
C
INC
R1
RET
NEXT1:
CJNE
R1,#4,LOOP
KEYTAB:
;//=
按键名称表=
J
SETB
C
DB
1AH
;扫描码
0,对应A
SJMP
EXIT
DB
1BH
;扫描码
1,对应
B
MOV
A,KEYNAM
DB
1CH
;扫描码
2,对应
C
E
NEXT31:
JB
ACC.0,NEXT32
DB
1DH
;扫描码
3,对应
D
ANL
KEYNAME,
MOV
R2,#0
DB
11H
;扫描码
4,对应
1
#1FH
DB
14H
;扫描码
5,对应
4
RRC
A
SJMP
NEXT5
DB
17H
;扫描码
6,对应
7
NEXT32:
JB
ACC.1,NEXT33
DB
1EH
;扫描码
7,对应
E
ANL
A,#0E0H
MOV
R2,#1
DB
12H
;扫描码
8,对应
2
DB
15H
;扫描码
9,对应
5
ORL
KEYNAME,
SJMP
NEXT5
DB
18H
;扫描码
A,对应
8
A
NEXT33:
JB
ACC.2,NEXT34
DB
10H
;扫描码
B,对应
0
CJNE
A,#0C0H,N
MOV
R2,#2
DB
13H
;扫描码
C,对应
3
EXT2
DB
16H
;扫描码
D,对应
6
SJMP
KEYSCAN
SJMP
NEXT5
DB
19H
;扫描码
E,对应
9
NEXT2:
CJNE
A,#0E0H,NEXT3
NEXT34:
MOV
R2,#3
DB
1FH
;扫描码
F,对应
F
SJMP
WAIT
NEXT5:
MOV
A,R1
END
RLA
4X4矩阵式键盘
keyscan:
lcallkeypress;
movp1,#0bfh;
jnbp1.3,$
movr1,#02h
jnzk1
movr0,#02h
movr1,#03h
mova,r0
jmpkeyscan
mova,p1
mova,r0
movb,#4
k1:
lcalldelay
anla,#0fh;
movb,r3
mulab
lcallkeypress
movr2,a
mulab
adda,r1
jnzk2
xrla,#0fh
adda,r1
jmpresponse
jmpkeyscan
jnzk3
jmpresponse
keypress:
movp1,#0fh
k2:
movr0,#00h
movp1,#07fh;
k4:
jnbp1.0,$;
mova,p1
movr1,#00h
movr0,#03h;
movr1,#00h
xrla,#0fh
movp1,#0efh
mova,p1
mova,r0
ret
mova,p1
anla,#0fh;
movb,#4
delay:
movr7,#50
anla,#0fh;
movr2,a
mulab
d1:
movr6,#248
movr2,a
xrla,#0fh
adda,r1
djnzr6,$
xrla,#0fh
jnzk3
jmpresponse
djnzr7,d1
jnzk3
jmpkeyscan
k5:
jnbp1.1,$
ret
movp1,#0dfh
k3:
mova,r2
movr1,#01h
table:
db
movr0,#01h
rrca;
mova,r0
3fh,06h,5bh,4fh;0123
mova,p1
jnck4;
movb,#4
66h,6dh,7dh,07h;4567
anla,#0fh
rrca
mulab
7fh,6fh,77h,7ch;89ab
movr2,a
jnck5;
adda,r1
39h,5eh,79h,71h;cdef
xrla,#0fh
rrca
jmpresponse
end*********
jnzk3
jnck6;
k6:
jnbp1.2,$
4X4
矩阵式键盘
KEYNAMEDATA40H
SJMPEXIT1
INCR5
NEXT25:
MOVA,R5
ORG0000H
NEXT11:
SETBF0
DJNZR7,LOOP1
RLA
LJMPMAIN
EXIT1:
RET
SJMPEXIT2
RLA
ORG0030H
KEYSCAN:
NEXT21:
ADDA,R4
MAIN:
MOVSP,#80H
JNBF0,EXIT2
JNBAcc.4,NEXT22
MOVDPTR,#KEYTAB
CLRF0
MOVR7,#4
MOVR4,#0
MOVCA,@A+DPTR
LOOP:
LCALLKEYCHK
MOVR5,#0
SJMPNEXT25
MOVKEYNAME,A
LCALLKEYSCAN
MOVR6,#01111111B
NEXT22:
EXIT2:
RET
SJMPLOOP
LOOP1:
MOAV,R6
JNBAcc.5,NEXT23
DELAY_10MS:
SETBRS1
KEYCHK:
MOVP1,#0F0H
RLA
MOVR4,#1
SETBRS0
MOVA,P1
MOVR6,A
SJMPNEXT25
MOVR2,#20
CJNEA,#0F0H,$+3
MOVP1,A
NEXT23:
DELAY0:
MOVR3,#250
LCALLDELAY_10MS
MOVA,P1
JNBAcc.6,NEXT24
DJNZR3,$
MOVA,P1
ANLA,#0F0H
MOVR4,#2
DJNZR2,DELAY0
CJNEA,#0F0H,NEXT11
XRLA,#0F0H
SJMPNEXT25
RET
CLRF0
JNZNEXT21
NEXT24:
MOVR4,#3
KEYTAB:
DB0,1,2,3,4,5,6,
7,8,9,10,11,
12,13,14,15
END
4X4键盘输入数码管移位显示
#include
#include
#include
sbitdula=P2A6;
sbitwela=P2A7;
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
ucharkeyscan();
voiddelay(ucharz)
{//10MS延时
uintx;
for(z;z!
=0;z--)
for(x=1250;x!
=0;x--);
}
voidmain()
{
wela=1;
dula=0;
P0=0xc0;
num=17;
P0=0;
wela=0;//所有数码管不亮
dula=1;
while
(1)
{
num1=keyscan();
P0=table[num1-1];
}
}
ucharkeyscan()
{
P3=0xf0;
temp=P3;
while(temp!
=0xf0)
delay
(1);
temp=P3;
while(temp!
=0xf0)
{
P3=0xfe;
1
temp=P3&0xf0;
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xee:
num=1,temp=0xf0;break;
case0xde:
num=2,temp=0xf0;break;
case0xbe:
num=3,temp=0xf0;break;
case0x7e:
num=4,temp=0xf0;break;
//default:
temp=0xf0;
}
}
P3=0xfd;
temp=P3&0xf0;while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xed:
num=5,temp=0xf0;break;
case0xdd:
num=6,temp=0xf0;break;
case0xbd:
num=7,temp=0xf0;break;
case0x7d:
num=8,temp=0xf0;break;
//default:
temp=0xf0;
}
}
P3=0xfb;
temp=P3&0xf0;
while(temp!
=0xf0)
{
te
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- X4 矩阵 键盘输入 程序