实验一矩阵键盘检测docx.docx
- 文档编号:9481614
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:35
- 大小:108.15KB
实验一矩阵键盘检测docx.docx
《实验一矩阵键盘检测docx.docx》由会员分享,可在线阅读,更多相关《实验一矩阵键盘检测docx.docx(35页珍藏版)》请在冰豆网上搜索。
实验一矩阵键盘检测docx
实验一矩阵键盘检测
一、实验目的:
1、学习非编码键盘的工作原理和键盘的扫描方式。
2、学习键盘的去抖方法和键盘应用程序的设计。
二、实验设备:
51/AVR实验板、USB连接线、电脑
三、实验原理:
键盘接口电路是单片机系统设计非常重要的一环,作为人机交互界面里最常用的输入设备。
我们可以通过键盘输入数据或命令来实现简单的人机通信。
1、按键的分类
一般来说,按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。
前者造价低,后者寿命长。
目前,微机系统中最常见的是触点式开关按键(如本学习板上所采用按键)。
按键按照接口原理又可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。
编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别。
全编码键盘由专门的芯片实现识键及输出相应的编码,一般还具有去抖动和多键、窜键等保护电路,这种键盘使用方便,硬件开销大,一般的小型嵌入式应用系统较少采用。
非编码键盘按连接方式可分为独立式和矩阵式两种,其它工作都主要由软件完成。
由于其经济实用,较多地应用于单片机系统中(本学习板也采用非编码键盘)。
2、按键的输入原理
在单片机应用系统中,通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。
也就是说,它能提供标准的TTL逻辑电平,以便与通用数字系统的逻辑电平相容。
此外,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据。
当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能。
因此,键信息输入是与软件结构密
切相关的过程。
对于一组键或一个键盘,通过接口电路与单片机相连。
单片机可以采用查询或中断方式了解有无按键输入并检查是哪一个按键
按下,若有键按下则跳至相应的键盘处理程序处去执行,若无键按下则继续执行其他程序。
3、按键的特点与去抖
机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随
有一定时间的触点机械抖动,然后其触点才稳定下来。
其抖动过程如图1
(a)所示,抖动时间的长短与开关的机械特性有关,一般为5-10ms。
从图中可以看出,在触点抖动期间检测按键的通与断状态,可能导致判
断出错。
即按键一次按下或释放被错误地认为是多次操作,这种情况是
不允许出现的。
为了克服按键触点机械抖动所致的检测误判,必须采取
去抖动措施,可从硬件、软件两方面予以考虑。
一般来说,在键数较少
时,可采用硬件去抖,而当键数较多时,采用软件去抖。
(本学习板采用
硬件电容去抖
按键去抖流程图
从按键的去抖流程图我们可以知道,检测到有键按下时,应延时等
待一段时间(可调用一个5ms~10ms的延迟子程序),然后再次判断按键是否被按下,若此时判断按键仍被按下,则认为按键有效,若此时判断按键没有被按下,说明为按键抖动或干扰,应返回重新判断。
键盘真正被按下才可进行相应的处理程序,此时基本就算实现了按键输入,进一步的话可以判断按键是否释放。
四、实验步骤
P3A
I~~OO~ι
Γ"⅛ΞEf)-
Γ⅛SE,P-
P3.0
P35
ST.
--W-1
S6_
1γ⅛e,P~H
*JΓ⅛se"
-W-1
S3
1Γ⅛eL
1P3!
P3.6
SlL
SiL
SiL——ES⅞⅛∕
tP3.2
R3.7
513M
Po—»
314
k
*J"⅛sfP"H
SlL
1P33
P34
K2
6
YO-
PrT
FTT
K3_
iYO
肩D独立键盘
上面的图的意思是P3.1~P3.3跟P3.4~P3.7不一样的,他们是相互连接(当按下键时),组成4*4=16个键的。
如果给P3一个扫描初值的话:
如OXoF,则没有键按下时为:
P3.1~P3.3为1P3.4~P3.7为0如果有键按下,贝『情况发生变化:
高电平接入低电平:
女口P3.3与P3.7连接
的键按下,则P3.3与P3.7为0,即接地了。
则P3此时为:
00000111,
这时如果用P3&0x0F,则高四位为0低四位保留,可以得到低四位的内容了。
通过去抖操作,即一个delay,可以得到低四位内容。
这里设为:
h=P3&0x0F;如果再得到高四位内容,则可以组成一个数,来定位哪个
键了。
程序框图:
C语言源程序:
#include
Sbitbeep=P2^3;
SbitduIa=P2^6;
SbitWeIa=P2^7;
UnSignedChari=100;
UnSignedCharj,k,temp,key;voiddelay(unsignedChari){
for(j=i;j>0;j--)for(k=125;k>0;k--);
code
}
UnSignedChar
table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};display(unsignedcharnum){
P0=table[num];
dula=1;
dula=0;
P0=0xc0;
wela=1;
wela=0;
}
voidmain()
{
dula=0;
wela=0;
while
(1)
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xee:
key=0;
break;
case0xde:
key=1;break;
case0xbe:
key=2;break;
case0x7e:
key=3;break;
}while(temp!
=0xf0)
{temp=P3;temp=temp&0xf0;beep=0;
}beep=1;display(key);
P1=0xfe;}
}
P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!
=0xf0)
{delay(10);if(temp!
=0xf0)
{temp=P3;switch(temp)
{case0xed:
key=4;break;
case0xdd:
key=5;break;
case0xbd:
key=6;break;
case0x7d:
key=7;break;
}while(temp!
=0xf0)
{temp=P3;temp=temp&0xf0;beep=0;
}beep=1;display(key);
}}
P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!
=0xf0)
{
delay(10);if(temp!
=0xf0)
{temp=P3;switch(temp)
{
case0xeb:
key=8;
break;
case0xdb:
key=9;
break;
case0xbb:
key=10;break;
case0x7b:
key=11;
break;
}while(temp!
=0xf0)
{
temp=P3;temp=temp&0xf0;beep=0;
}
beep=1;display(key);
}
}
P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!
=0xf0)
{delay(10);if(temp!
=0xf0)
{temp=P3;switch(temp)
{
case0xe7:
key=12;break;
case0xd7:
key=13;
break;
case0xb7:
key=14;break;
case0x77:
key=15;
break;
}while(temp!
=0xf0)
{
temp=P3;temp=temp&0xf0;beep=0;
}
beep=1;display(key);
}
}
}
}
汇编程序:
dulabitP2.0;
welabitP2.1;
KEYBUFEQU30H
ORG00H
START:
MOVKEYBUF,#2
WAIT:
MOVP3,#0FFH
CLRP3.4
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY1
LCALLDELY10MS
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY1
MOVA,P3
ANLA,#0FH
CJNEA,#0EH,NK1
MOVKEYBUF,#0movp1,#11111110b
LJMPDK1
NK1:
CJNEA,#0DH,NK2
MOVKEYBUF,#4movp1,#11111100b
LJMPDK1
NK2:
CJNEA,#0BH,NK3
MOVKEYBUF,#8movp1,#11111000b
LJMPDK1
NK3:
CJNEA,#07H,NK4
MOVKEYBUF,#12movp1,#11110000b
LJMPDK1
NK4:
NOP
DK1:
;等待释放
calldisplay
DK1A:
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JNZDK1A
NOKEY1:
MOVP3,#0FFH
CLRP3.5
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY2
LCALLDELY10MS
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY2
MOVA,P3
ANLA,#0FH
CJNEA,#0EH,NK5
MOVKEYBUF,#1
movp1,#11111110b
NK5:
LJMPDK2
CJNEA,#0DH,NK6
MOVKEYBUF,#5
movp1,#11111100b
NK6:
LJMPDK2
CJNEA,#0BH,NK7
MOVKEYBUF,#9
movp1,#11111000b
NK7:
LJMPDK2
CJNEA,#07H,NK8
MOVKEYBUF,#13
movp1,#11110000b
LJMPDK2
NK8:
NOP
DK2:
calldisplay
DK2A:
MOVA,P3;释放
ANLA,#0FH
XRLA,#0FH
JNZDK2A
NOKEY2:
MOVP3,#0FFH
CLRP3.6
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY3
LCALLDELY10MS
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY3
MOVA,P3
ANLA,#0FH
CJNEA,#0EH,NK9
MOVKEYBUF,#2
movp1,#11111110b
NK9:
LJMPDK3
CJNEA,#0DH,NK10
MOVKEYBUF,#6
movp1,#11111100b
LJMPDK3
NK10:
CJNEA,#0BH,NK11
MOVKEYBUF,#10
movp1,#11111000b
LJMPDK3
NK11:
CJNEA,#07H,NK12
MOVKEYBUF,#14
movp1,#11110000b
LJMPDK3
NK12:
NOP
DK3:
calldisplay
DK3A:
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JNZDK3A
NOKEY3:
MOVP3,#0FFH
CLRP3.7
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY4
LCALLDELY10MS
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY4
MOVA,P3
ANLA,#0FH
CJNEA,#0EH,NK13
MOVKEYBUF,#3
movp1,#11111110b
LJMPDK4
NK13:
CJNEA,#0DH,NK14
MOVKEYBUF,#7
movp1,#11111100b
LJMPDK4
NK14:
CJNEA,#0BH,NK15
MOVKEYBUF,#11
movp1,#11111000b
LJMPDK4
NK15:
CJNEA,#07H,NK16movp1,#11110000b
MOVKEYBUF,#15
LJMPDK4
NK16:
NOP
DK4:
calldisplay
DK4A:
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JNZDK4A
NOKEY4:
LJMPWAIT
DELY10MS:
MOVR6,#10
D1:
MOVR7,#248
DJNZR7,$
DJNZR6,D1
RET
display:
MOVA,KEYBUF
MOVDPTR,#TABLE
;查表
MOVCA,@A+DPTR
MOVP0,A
setbdula
clrdula
movP0,#0c0h
setbwela
clrwela
clrp2.3
acallds1ms;延时,以便人眼可以观察到
setbp2.3
;acallds1ms
ret
ds10ms:
movr1,#1
ds1lo:
movr2,#200
ds2lo:
movr3,#200
djnzr3,$
djnzr2,ds2lo
djnzr1,ds1lo
ret;延时返回
TABLE:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB7FH,6FH,77H,7CH,39H,5EH,79H,71H
END
五、实验现象:
当你按下矩阵键盘中的任何一个键,蜂鸣器响一声,并在数码管上显
示相应的键值。
图为实际演示图片
六、实验小结:
本实验介绍了单片机键盘的工作原理并给出了实例,从中我们可以知
道一个完善的键盘控制程序应具备以下功能:
(1)检测有无按键按下,并采取硬件或软件措施,消除键盘按键机械触点抖动的影响。
(2)有可靠的逻辑处理办法。
每次只处理一个按键,其间对任何按
键的操作对系统不产生影响,且无论一次按键时间有多长,系统仅执行一次按键功能程序。
(3)准确输出按键值,以满足按键功能要求。
对于矩阵键盘而言,
必须将行线、列线信号配合起来作适当处理,才能确定闭合键的位置
实验二交通灯
实验目的:
1、了解单片机中断与定时器工作原理,掌握中断与定时器程序结构。
2、理解七段数码管的工作原理,并在此基础上能可以进行简单的数码管驱动操作。
3、可以灵活的用I/O口原理控制LED小灯的亮和灭。
二、实验设备:
51/AVR实验板、USB连接线、电脑。
三、实验原理:
本实验以P1口作为输出。
程序初始化是绿灯先亮,具体顺序为绿-黄-
红-黄-绿-黄-红,重复循环。
其中,红灯与绿灯显示时间均为50s,中间的黄
灯显示时间为15s。
绿灯用八位发光二极管流动闪烁作代表;红灯用八位发光二极管全亮作代表;黄灯用八位发光二极管全亮全灭闪烁作代表。
此外,还用到定时器To作为倒计时使用,Po口作为LED灯的显示。
在实验中利用软件延时的方法来控制红黄绿灯的亮的时间。
考虑到延时
时间较长,所以先用T0产生终端然后计数的方法来实现延时,利用P1口作
∣∣□κυ扎
fb373⅛⅝⅛SIOD⅛POjO-÷07时应FeB网P谱∙⅛ΣX~"
trΓ⅛ff^f÷AE.^Γ∣ΞF3HV7√7-1H片
囂陌Ir严TwE卜以办,肝商^4H<,:
'■1.;-2-二⅛
DUP2.6ft⅛⅛⅛!
⅛∣∣MHC57上^口口丄^口工占BL-口鼻亠口工
WEp37辭Z険杯昭W静赛亠口2』£口J罷口IM口Jj
旧日8|8阿
皿
J*
卜OlMD
WFI
JWll
:
廉
WEi
TS
hIF
]aHC573-lWCC
.toIr丨
STT
∏1Γ
I诃D
:
_L:
≡
LMI-
∏5~57
^IrTr
ΛIn½κn⅞w⅝n
DODb-DDDD
HHCr7JVCC
UT
IQ弱常玛碗MBQ
为红黄绿灯控制端口。
实验模块图1
J4
ΠC.∙.T⅛j∩^T1卄
≤TC83C52
20
1?
IS
1?
Ie
!
4
13
12
11
10
9
E
7
6
5
4
3
2
1
RS-PLDDBL
WR.PLi
FnPl.2C63
123456789
lJ234t松7T.111111■B14■■.1APPPPPPFR
FOPOPOPOPOPOFOPO
10FjXD
11TXD
12IyTro
13Irm
14To
15TI
16WR
17KD
ALE
匹日T
P26
P25
P2.4
P2.3
1*XTAL2P2.2
19XTALlP2.1
20GNDP2Q
O927-65431fl9-T-⅛54321
4Vl-5_J3335333^F4222-222
VCC
£POD
DlFOl
DJFU2
DSP03
D4POJ
D5FOJ
D6PO.6茁P(H
AU
WEP2.7-Etr-FΣΓβ-LClzJENPJ.S
.…F_」•一
PM一刃•丁:
—1SB20F2.2
⅛ħ∙-
p∑o
)5
3
4
5
6
8
9
10
IL
12
13
14
15
16
17
IS
19
20
Pl
L
Db
1
Dl
£
3
D2
D3
c+
C
D4
UJl
Γ5
D6
9
DT-
IOK
日单片机垠小系统
G⅛團上标注的为PCB网络编号*可以对应相关的外部摸块
实验模块图2
四、实验步骤:
1、熟悉单片机内部原理图,掌握各实验模块的使用方法
2、设计实验方案,画出流程图。
开始
1
Γ
绿灯先亮
■R
r
50秒倒计时显示
黄灯亮
15秒倒计时显示
1
r
红灯亮
50秒倒计时显示
3
F
黄灯亮
3
F
15秒倒计时显示
3、根据流程图编写程序。
程序如下:
#include
#defineUCharUnSignedChar
#defineuintunsignedintsbitdula=P2^6;sbitwela=P2^7;sbitbeep=P2^3;unsignedintpp;
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};ucharj,k,l=255;
uchara1,a0;ucharshijian,deng=2;
voiddelay(unsignedinti)
{
for(j=i;j>0;j--)for(k=125;k>0;k--);
}
voiddisplay(unsignedcharsh_c,unsignedcharg_c)
{
dula=0;
P0=table[sh_c];
dula=1;
dula=0;
wela=0;
P0=0xfe;wela=1;wela=0;delay(5);
P0=table[g_c];
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
}
voidmain()
{
TMOD=0x01;
TR0=1;
TH0=(65536-46080)/256;//由于晶振为11.0592,故所记次数应为
TL0=(65536-46080)%256;//46080ET0=1;
EA=1;
while
(1)
{
if(shijian==0)
{
switch(deng)
{
case0:
shijian=50;deng=1;break;
case1:
shijian=15;
的来历,为50000*11.0592/12
//红灯
//黄灯
46080,计时器每隔50000微秒发起一次中断。
deng=2;break;
case2:
shijian=50;deng=3;break;
case3:
shijian=15;deng=0;break;
}
}
if(pp==20)
{pp=0;
shijian--;
}a0=shijian%10;a1=shijian/10;display(a1,a0);switch(deng)
{
case1:
P1=0X00;break;
case2:
//黄灯if(shijian%2==0)P1=0x00;if(shijian%2==1)P1=0xff;break;
case3:
//绿灯if(shijian%2==0)P1=0x55;if(shijian%2==1)P1=0xaa;
//绿灯
//黄灯
//红灯
break;
case0:
if(shijian%2==0)//黄灯
P1=0x00;if(shijian%2==1)P1=0xff;break;
}
}
}
voidtime0()interrupt1
{TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
pp++;
}
4、下载程序到单片机,观察实验现象。
五、实验现象:
上电后,绿灯(八位发光二极管流动闪烁)先亮,数码管50秒倒计时;黄灯(八位发光二极管全亮全灭闪烁)亮,数码管15秒倒计时;接着红灯亮(八位发
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 矩阵 键盘 检测 docx