4X4矩阵式键盘输入程序.docx

上传人:b****8 文档编号:28885221 上传时间:2023-07-20 格式:DOCX 页数:78 大小:463.05KB
下载 相关 举报
4X4矩阵式键盘输入程序.docx_第1页
第1页 / 共78页
4X4矩阵式键盘输入程序.docx_第2页
第2页 / 共78页
4X4矩阵式键盘输入程序.docx_第3页
第3页 / 共78页
4X4矩阵式键盘输入程序.docx_第4页
第4页 / 共78页
4X4矩阵式键盘输入程序.docx_第5页
第5页 / 共78页
点击查看更多>>
下载资源
资源描述

4X4矩阵式键盘输入程序.docx

《4X4矩阵式键盘输入程序.docx》由会员分享,可在线阅读,更多相关《4X4矩阵式键盘输入程序.docx(78页珍藏版)》请在冰豆网上搜索。

4X4矩阵式键盘输入程序.docx

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

#includeucharnum,num1,temp;

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模板 > 节日庆典

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1