实验一矩阵键盘检测Word文档格式.docx

上传人:b****2 文档编号:5901998 上传时间:2023-05-05 格式:DOCX 页数:56 大小:24.66KB
下载 相关 举报
实验一矩阵键盘检测Word文档格式.docx_第1页
第1页 / 共56页
实验一矩阵键盘检测Word文档格式.docx_第2页
第2页 / 共56页
实验一矩阵键盘检测Word文档格式.docx_第3页
第3页 / 共56页
实验一矩阵键盘检测Word文档格式.docx_第4页
第4页 / 共56页
实验一矩阵键盘检测Word文档格式.docx_第5页
第5页 / 共56页
实验一矩阵键盘检测Word文档格式.docx_第6页
第6页 / 共56页
实验一矩阵键盘检测Word文档格式.docx_第7页
第7页 / 共56页
实验一矩阵键盘检测Word文档格式.docx_第8页
第8页 / 共56页
实验一矩阵键盘检测Word文档格式.docx_第9页
第9页 / 共56页
实验一矩阵键盘检测Word文档格式.docx_第10页
第10页 / 共56页
实验一矩阵键盘检测Word文档格式.docx_第11页
第11页 / 共56页
实验一矩阵键盘检测Word文档格式.docx_第12页
第12页 / 共56页
实验一矩阵键盘检测Word文档格式.docx_第13页
第13页 / 共56页
实验一矩阵键盘检测Word文档格式.docx_第14页
第14页 / 共56页
实验一矩阵键盘检测Word文档格式.docx_第15页
第15页 / 共56页
实验一矩阵键盘检测Word文档格式.docx_第16页
第16页 / 共56页
实验一矩阵键盘检测Word文档格式.docx_第17页
第17页 / 共56页
实验一矩阵键盘检测Word文档格式.docx_第18页
第18页 / 共56页
实验一矩阵键盘检测Word文档格式.docx_第19页
第19页 / 共56页
实验一矩阵键盘检测Word文档格式.docx_第20页
第20页 / 共56页
亲,该文档总共56页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

实验一矩阵键盘检测Word文档格式.docx

《实验一矩阵键盘检测Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验一矩阵键盘检测Word文档格式.docx(56页珍藏版)》请在冰点文库上搜索。

实验一矩阵键盘检测Word文档格式.docx

3、按键的特点与去抖

机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随

有一定时间的触点机械抖动,然后其触点才稳定下来。

其抖动过程如图1(a)所示,抖动时间的长短与开关的机械特性有关,一般为5-10ms。

从图中可以看出,在触点抖动期间检测按键的通与断状态,可能导致判

断出错。

即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。

为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。

一般来说,在键数较少

时,可采用硬件去抖,而当键数较多时,采用软件去抖。

(本学习板采用软件去抖方式)。

按键抖动状态图

硬件电容去抖

有按键信号?

Y

延时等待十秒

N

仍有按键信

号?

键盘处理

按键释放?

按键去抖流程图

从按键的去抖流程图我们可以知道,检测到有键按下时,应延时等

待一段时间(可调用一个5ms~10ms的延迟子程序),然后再次判断按

键是否被按下,若此时判断按键仍被按下,则认为按键有效,若此时判

断按键没有被按下,说明为按键抖动或干扰,应返回重新判断。

键盘真

正被按下才可进行相应的处理程序,此时基本就算实现了按键输入,进

一步的话可以判断按键是否释放。

四、实验步骤

上面的图的意思是P3.1~P3.3跟P3.4~P3.7不一样的,他们是相互

连接(当按下键时),组成4*4=16个键的。

如果给P3一个扫描初值的

话:

如0x0F,则没有键按下时为:

P3.1~P3.3为1P3.4~P3.7为0如果

有键按下,则情况发生变化:

高电平接入低电平:

P3.3

P3.7

连接

的键按下,则

为0,即接地了。

P3

此时为:

00000111

这时如果用P3&

0x0F,则高四位为0低四位保留,可以得到低四位的内容

了。

通过去抖操作,即一个delay,可以得到低四位内容。

这里设为:

h=P3&

0x0F;

如果再得到高四位内容,则可以组成一个数,来定位哪个

键了。

程序框图:

P3=FFH,P3.0=0

P3=FFH,P3.2=0

有键按下吗?

延时10ms

真得有键按下吗?

根据当前状态识别按键

P3=FFH,P3.1=0

P3=FFH,P3.3=0

C语言源程序:

#include<

reg51.h>

sbitbeep=P2^3;

sbitdula=P2^6;

sbitwela=P2^7;

unsignedchari=100;

unsignedcharj,k,temp,key;

voiddelay(unsignedchari)

{

for(j=i;

j>

0;

j--)

for(k=125;

k>

k--);

}

Unsignedcharcodetable[]={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()

while

(1)

P3=0xfe;

temp=P3;

temp=temp&

0xf0;

if(temp!

=0xf0)

delay(10);

switch(temp)

case0xee:

key=0;

break;

case0xde:

key=1;

case0xbe:

key=2;

case0x7e:

key=3;

while(temp!

beep=0;

beep=1;

display(key);

P1=0xfe;

P3=0xfd;

case0xed:

key=4;

case0xdd:

key=5;

case0xbd:

key=6;

case0x7d:

key=7;

P3=0xfb;

case0xeb:

key=8;

case0xdb:

key=9;

case0xbb:

key=10;

case0x7b:

key=11;

P3=0xf7;

case0xe7:

key=12;

case0xd7:

key=13;

case0xb7:

key=14;

case0x77:

key=15;

汇编程序:

dulabitP2.0;

welabitP2.1;

KEYBUFSTART:

WAIT:

EQU30H

ORG00H

MOVKEYBUF,#2

MOVP3,#0FFH

CLRP3.4

MOVA,P3

ANLA,#0FH

XRLA,#0FH

JZNOKEY1

LCALLDELY10MS

CJNEA,#0EH,NK1

MOVKEYBUF,#0

movp1,#11111110b

LJMPDK1

NK1:

CJNEA,#0DH,NK2

MOVKEYBUF,#4

movp1,#11111100b

NK2:

CJNEA,#0BH,NK3

MOVKEYBUF,#8

movp1,#11111000b

NK3:

CJNEA,#07H,NK4

MOVKEYBUF,#12

movp1,#11110000b

NK4:

NOP

DK1:

calldisplay

DK1A:

;

等待释放

JNZDK1A

NOKEY1:

CLRP3.5

JZNOKEY2

CJNEA,#0EH,NK5

MOVKEYBUF,#1

LJMPDK2

NK5:

CJNEA,#0DH,NK6

MOVKEYBUF,#5

NK6:

CJNEA,#0BH,NK7

MOVKEYBUF,#9

NK7:

CJNEA,#07H,NK8

MOVKEYBUF,#13

NK8:

DK2:

DK2A:

MOVA,P3;

释放ANLA,#0FH

JNZDK2A

NOKEY2:

CLRP3.6

JZNOKEY3

CJNEA,#0EH,NK9

LJMPDK3

NK9:

CJNEA,#0DH,NK10

MOVKEYBUF,#6

NK10:

CJNEA,#0BH,NK11

MOVKEYBUF,#10

NK11:

CJNEA,#07H,NK12

MOVKEYBUF,#14

NK12:

DK3:

DK3A:

MOVA,P3

JNZDK3A

NOKEY3:

CLRP3.7

JZNOKEY4

CJNEA,#0EH,NK13

MOVKEYBUF,#3

LJMPDK4

NK13:

CJNEA,#0DH,NK14

MOVKEYBUF,#7

NK14:

CJNEA,#0BH,NK15

MOVKEYBUF,#11

NK15:

CJNEA,#07H,NK16

MOVKEYBUF,#15

NK16:

DK4:

DK4A:

JNZDK4A

NOKEY4:

LJMPWAIT

DELY10MS:

D1:

MOVR6,#10

MOVR7,#248

DJNZR7,$

DJNZR6,D1

RET

display:

MOVA,KEYBUFMOVDPTR,#TABLEMOVCA,@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

TABLE:

ret;

延时返回

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。

绿灯用八位发光二极管流动闪烁作代表;

红灯用八位发光

二极管全亮作代表;

黄灯用八位发光二极管全亮全灭闪烁作代表。

此外,还用到定时器T0作为倒计时使用,P0口作为LED灯的显示。

在实验中利用软件延时的方法来控制红黄绿灯的亮的时间。

考虑到延时

时间较长,所以先用T0产生终端然后计数的方法来实现延时,利用P1口作

为红黄绿灯控制端口。

实验模块图1

实验模块图2

四、实验步骤:

1、熟悉单片机内部原理图,掌握各实验模块的使用方法。

2、设计实验方案,画出流程图。

开始

绿灯先亮

50秒倒计时显示

黄灯亮

15秒倒计时显示

红灯亮

3、根据流程图编写程序。

程序如下:

#defineucharunsignedchar

#defineuintunsignedint

sbitbeep=P2^3;

unsignedintpp;

unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

ucharj,k,l=255;

uchara1,a0;

ucharshijian,deng=2;

voiddelay(unsignedinti)

voiddisplay(unsignedcharsh_c,unsignedcharg_c)

P0=table[sh_c];

P0=0xfe;

delay(5);

P0=table[g_c];

P0=0xfd;

TMOD=0x01;

TR0=1;

TH0=(65536-46080)/256;

//由于晶振为11.0592,故所记次数应为

46080,计时器每隔50000微秒发起一次中断。

TL0=(65536-46080)%256;

//46080的来历,为50000*11.0592/12

ET0=1;

EA=1;

if(shijian==0)

switch(deng)

case0:

shijian=50;

//红灯

deng=1;

case1:

shijian=15;

//黄灯

deng=2;

case2:

//绿灯

deng=3;

case3:

deng=0;

if(pp==20)

{pp=0;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2