电子密码锁 代码 报警 LED 矩阵键盘

电子密码锁 代码 报警 LED 矩阵键盘
电子密码锁 代码 报警 LED 矩阵键盘

课程:电子综合设计实验

项目:电子密码锁

学期:2011-2012第二学期

学院:电子信息与自动化学院

专业:电子信息及自动化

班级:

姓名:

学号:

指导教师:

电工电子技术实验中心

摘要 (2)

1 项目任务及设计要求 (3)

2 系统概述

2.1 系统方框图 (4)

2.2 方案设计

2.2.1 显示模块 (4)

2.2.2 输入模块 (5)

2.2.3 单片机 (5)

2.2.4 继电器 (5)

3 单元电路设计及分析

3.1 输入模块 (6)

3.2 显示模块 (6)

3.3 报警提示电路 (8)

3.4 继电器 (9)

4 程序设计及分析

4.1 主程序流程图 (10)

4.2 键盘扫描流程 (11)

4.3 数码管显示流程 (12)

4.4 修改密码流程 (13)

4.5 判定密码流程 (13)

4 电路测试记录及结果分析

4.1 电路测试 (14)

4.2 测试结果分析 (15)

5 实验心得体会 (16)

附录 (17)

参考文献 (17)

源程序 (18)

随着人们生活水平的提高和安全意识的加强,对安全的要求也就越来越高。锁自古以来就是把守护门的铁将军,人们对它要求甚高,既要安全可靠的防盗,又要使用方便,这也是制锁者长期以来研制的主题。随着电子技术的发展,各类电子产品应运而生,电子密码锁就是其中之一。据有关资料介绍,电子密码锁的研究从20世纪30年代就开始了,在一些特殊场所早就有所应用。这种锁是通过键盘输入一组密码完成开锁过程。研究这种锁的初衷,就是为提高锁的安全性。由于电子锁的密钥量(密码量)极大,可以与机械锁配合使用,并且可以避免因钥匙被仿制而留下安全隐患。电子锁只需记住一组密码,无需携带金属钥匙,免除了人们携带金属钥匙的烦恼,而被越来越多的人所欣赏。本论文详细描述了一种电子密码锁的构成及工作原理。

关键字:AT89C51、4*4矩阵键盘、7段八位数码管、继电器

1项目任务及设计要求(1)总共可设置4位密码;(2)用户自行设定和修改密码;(3)若密码不正确,报警5秒;(4)连续错3次,报警一分钟;(5)锁由继电器模拟。

2 系统概述

2.1 系统方框图

图2.1 系统方框图

通过输入模块矩阵键盘,输入指令信息以及密码,在显示模块显示输入的信息,单片机对信息进行核对处理,控制报警模块报警或者继电器打开门。

2.2 方案设计

2.2.1 显示模块

显示模块我考虑了三个方案。

方案一:采用点阵显示器,这种显示器可以在界面上显示信息,提示用户可以选择的操作,比较直观,但是在程序上实现比较复杂。

方案二:采用7段四位数码管,这与实验要求的四位密码相符,程序实现也比较简单。

方案三:采用7段八位数码管,这种数码管可以实现本实验要求的显示4位密码,虽然多了4位,但是与实验室使用的数码管相符,程序上实现与四位数码管相似。

相比较以上方案,密码锁操作步骤简单,可以不需要提示,因此不选用点阵显示器,而为了和实验室使用的数码管相符,我选择使用7段八位数码管作为显

单片机

显示模块

输入模块

报警模块

继电器(锁)

示模块。

2.2.2 输入模块

对于输入模块的选择,我考虑了两个方案。

方案一:采用两键输入模块,及用两个按键来分别控制整个密码锁的输入与功能选项。这个方案节约成本,只需要两个按键,但是相对来说程序上实现比较比复杂,在操作上输入比较繁琐,需要多次按键,容易出错。

方案二:采用4*4矩阵键盘作为输入,数字显示比较明了,操作简单,节约输入时间,程序上也比较容易实现。

相比较两个方案,密码锁需要着重在于操作简单、迅速,因此我选择了4*4矩阵键盘作为输入模块。

2.2.3 单片机

市场有很多单片机可以实现这个密码锁的功能,但是这里我采用平时经常使用,也是最熟悉的AT89C51单片机。

2.2.4 继电器

根据实验要求,采用继电器来模拟开锁过程。

3 单元电路设计及分析

3.1 输入模块

输入模块4*4矩阵键盘扫描电路如图3.1所示:

图3.1 4×4矩阵键盘电路图

用P3端口扫描矩阵键盘的输入。

P3^0到P3^3端口分别扫描矩阵键盘的一至四行,P3^4到P3^7端口分别扫描矩阵键盘的一至四列。当有按键按下时,对应的端口由高电平变为低电平,单片机收到信息,根据电平信息识别按键坐标,对应程序代码记录输入信息。3.2 显示模块

7段八位数码管结构如图3.2所示:

图3.2 段八位数码管结构

从图上可以看出控制7段八位数码管显示的是位选信号和段选信号。

显示模块电路图3.3:

图3.3 显示模块电路图

根据上图可以看出,P2端口控制位选信号,P0端口控制段选信号。对于段选信号,通过前面已经了解到,因为只显示8,且本实验用的是共阴极数码管,所以当段选信号通过P0端口输出时P0^0至P^7端口输出电平11111110。

段选信号,当输入第一个数字时从左往右第八位显示,因为为共阴极数码管,所以段选信号低电平有效,P2^0到P2^3端口控制高四位,P2^4到P2^7端口控制低四位,端口输出电平11111110,转换为十六进制代码为0xfe,当输入第二个数字时,第七位与第八位显示,输出电平11111100,十六进制代码为0xfc,同理输入第三第四位数时输出电平为11111000、11110000,十六进制代码为0xf8、0xf0。本实验只需要显示四位密码,因此只显示第四位即可,不再考虑高八位。

3.3报警提示电路

报警提示电路模块如图3.4所示:

图3.4 报警提示电路

图中两个LED灯,D2为P1^5控制的开门指示灯,D3为P1^4控制的修改密码提示灯。当输入密码正确时,P1^5输出低电平D2亮灯,1秒后熄灭。当在初始状态或正确输入密码后按下“#”键时,P1^4输出低电平D3亮,表示此时可以输入密码,密码设置成功后,D3自动熄灭。

BUZ1为蜂鸣器,通过PNP三极管对输出信号进行放大来促使发声。当输入密码正确时,发出“嘀”声,当密码输入错误时发出三秒“嘀、嘀”声,当连续三次密码错误时,发出持续一分钟“嘀、嘀”声,期间如果有按键按下,则从新计时警报。

3.4 继电器

继电器电路如图3.5所示:

P1^6

图3.5 继电器(模拟锁)

继电器控制电压通过运放放大到12V用以驱动继电器工作。当电流通过线圈时,产生磁场吸引开关RL1偏置,导通L1,使L1发光。

4程序设计及分析

4.1主程序流程图

图 4.1 主程序流程图

系统初始状态时按下“*”键LED黄灯亮,表示可以设置密码,期间可按下“#”键清除并重新输入,输入第四位后自动保存并熄灭数码管和LDE灯。如果没有按下“*”键及输入密码,系统自动锁定,无法设置密码,需要复位系统重新设置。

设置密码成功后,输入正确密码,开门指示灯亮,锁打开,蜂鸣器发出“嘀”声。输入密码错误,蜂鸣器发出“嘀、嘀”三秒报错声,连续三次输入密码错误,蜂鸣器发出一分钟“嘀、嘀、嘀”警报声,期间如果有按键输入则重新计时。输入密码期间可按“#”清除,重新输入。

修改密码方法:在正确输入密码后,按下“*”键开始修改密码,按下任意数字键视为放弃修改机会,系统密码不改变。

4.2键盘扫描流程

图4.2 键盘扫描流程图

本系统,行对应单片机管脚P3^0-P3^3,列对应P3^4-P3^7。

表4.1 行列对应扫描表

P3^0 P3^1 P3^2 P3^3

P3^4 1 2 3

P3^5 4 5 6

P3^6 7 8 9

P3^7 * 0 #

表4.1 行列对应扫描表

例如:按下1时,端口P3^0与P3^4变为低电平,P3端口低四位P3^3,

P3^2,P3^1,P3^0对应电平1110,高四位P3^7,P3^6,P3^5,P3^4对应电平1110,对应十六进制坐标代码0xee。根据程序定义,记录为1。

扫描代码对应坐标表:

表4.2扫描代码对应坐标表

e d b 7

e 1 2 3

d 4 5 6

b 7 8 9

7 * 0 #

4.3 数码管显示流程

图 4.3 数码管显示流程图

数码管显示对应表4.3:

表4.3数码管显示对应表

数字

1 2 3 4 对应管脚电平 11111110

10110000

11101101

11111001

10110011

数字

5

6 7 8 9 对应管脚电平 11011011

11011111

11110000

11111111

11111011

本实验为电子密码锁,要求保密性,因此所有输入信息均显示为8,这里也就只讨论输入为8的段选信号以及位选信号。

段选:当输入为8时,需要点亮的段为,DP 、a 、b 、c 、d 、e 、f 对应的二进制为11111110,高四位对应管脚P0^4-P0^7,低四位对应管脚P0^0-P0^3,程序中用的是十六进制,因此转换为十六进制代码为0x7f 。

位选:当输入数时,系统变量i 开始计数,按键一次计数一次i=1,数码管第一位亮,第二次i=2,数码管前两位亮,一次类推。当i=4时或者检测到“#”号键按下时,i 清零且数码管熄灭。

4.4 修改密码流程

图4.4 修改密码流程图

输入

段选

输出

位选

输入

i 计数加1

i<4

i=4

保存密码,修改成功

清除 i 清零

初始i=0,当键盘有输入时,i 开始计数加1,判断i 小于4,则继续输入,期间有“#”键按下则i 清零,重新输入。当i 判断等于4时,自动保存密码且i 清零。

4.5 判定密码

图 4.5 判定密码流程图

输入阶段与修改密码相同。当输入完毕后,开始比对密码,若密码正确则开门,密码错误则i 清零,重新输入密码。

输入

i 计数加1

i<4

i=4

清除

i 清零

判定密码

正确

错误

开门

5电路测试记录及结果分析

5.1 电路测试

打开proteus软件,调入程序电路图。

打开电源,系统进入初始模式。

系统测试表:

表5.1 系统测试流程表

输入修改密

码灯

清除

(Y/N)

报警三秒

(Y/N)

报警一分

钟(Y/N)

开门

(Y/N)

开锁指

示灯

数码管清

零(Y/N)

当前

密码

* 亮

123 亮

# 亮Y Y

1234 灭Y 1234 456 1234 # Y Y 1234 4567 Y Y 1234 1111 Y Y 1234 1374 Y Y 1234 1234 Y Y Y 1234 非*键1234 * 灭1234 1234 Y Y Y 1234 * 亮1234 1111 灭Y 1111 1234 Y Y 1111 1111 Y Y Y 1111 按下“*”号键,修改密码指示灯亮,进入修改密码模式,输入密码123,

按下“#”号键,7位八段数码管清零,再次输入密码1234,输入完毕后,系统

自动保存,7段八位数码管清零,指示灯熄灭。

输入错误密码456,按下“#”号键,数码管清零。输入错误密码4567,数码管清零,报警3秒,期间随意按下按键,3秒重新计时。输入错误密码1111,数码管清零,报警3秒。再次输入错误密码1374,数码管清零,报警一分钟,期间按下任意按键,一分钟重新计时。

输入正确密码1234,开锁指示灯亮,继电器灯亮(锁模拟灯),提示开锁声。一秒后指示灯熄灭,继电器关闭。按下任意键一次,再按“*”号键,修改密码指示灯不亮。重复输入正确密码1234,再“*”号键,修改密码指示灯亮,进入修改密码模式,输入新密码1111。

再次输入密码1234,提示密码错误。输入1111,提示密码正确。

至此所有功能测试完毕。

5.2 测试结果分析

上述测试结果显示,系统实现所有本实验要求的功能。

本系统对于修改密码,只使用了一次输入即可确认的方法。对于四位密码,且有LED显示的情况下,用户可以通过对应输入与LED显示,很准确的记住输入的密码不会造成误操作。

6实验心得体会

本次实验让我巩固了之前学习的C语言以及各种软件的使用方法。在程序编辑与调试的过程中,逐个解决实验要求的内容,让我体会到了成功的快乐,从而提高了对实验的兴趣,和完成实验的信心。整个过程中,虽然有很多地方不懂,但是在解决这些问题的过程中让我学到了更多的知识,了解到更多关于本专业技术的应用。

附录

参考文献

【1】.万文略. 单片机原理及应用.重庆大学出版社.2010

【2】.纪纲.C程序设计应用教程.中国铁道出版社.2010

【3】.胡辉.单片机原理与应用.北京中国水利水电出版社.2007 【4】.王东锋.董冠强.单片机C语言应用100例.电子工业出版社.2009

源程序

#include

/*设置初始密码*/

int a4;

int a3;

int a2;

int a1;

//int set[]={0,0,0,0};

/*定义数组用来接收输入的数用于与初始密码比较*/

int num[]={0,0,0,0};

unsigned int count,i,flag,certain,count2,flag2,s,k,xg,xg1; sbit beep=P1^7;/*蜂鸣器*/

sbit deng=P1^6;/*灯泡*/

sbit openled=P1^5;/*指示灯*/

sbit xgdeng=P1^4;

/*0-9*/

code unsigned char tab[]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0 x07,0x7f,0x6f,0x00};

/*数码管位选*/

code unsigned char tab2[]=

{0xfe,0xfc,0xf8,0xf0};

void delay(unsigned int n)

{

unsigned int i,j;

for(i=0;i

// {

// for(j=0;j<121;j++)

{;}

// } }

void delay1(unsigned int x)

{

while(x--);

}

void main()

{

unsigned char a,b,c;/*a,b,c,用于检查产生行列值*/

TMOD |= 0x11; /*定时器/计数器工作方式控制寄存器*/

TH0=0xff; /*计时器高8位*/

TL0=0x06; /*计时器低8位*/

TH1=0xd8; /**/

TL1=0xf0; /**/

EA=1; /*总中断允许位高电平1有效*/

ET0=1; /*内部定时器/计数器中断允许位*/

TR0=1; /*定时器/计数器启动位*/

ET1=1; /**/

TR1=1; /**/

deng=0;

k=0;

xg=1;

flag=0;

flag2=0;

xgdeng=1;

a1: while(1)

{

while(certain==0)

{

P3=0X0f;

a=P3; //行

delay(1);

P3=0Xf0;

b=P3; //列

delay(1);

c=a+b;//读取到的键盘值//**********************************

if(c==0xe7)

{

if(xg==1)

{

xg1=1;

xgdeng=0;

}

if(xg==0)

{

goto a1;

}

}

/************************************ ******/

//修改密码确认

//************************************ ******

if(xg==1&&xg1==1)

{

//0xbb是确定

if(c==0xb7)

{

P0=0x00;

i=0;

goto a1;

}

if(c==0xd7)

{

num[i]=0;

i++;

P2=tab2[i-1];

P0=0x7f;

delay1(60000);

}

if(c==0xee)

{

num[i]=1;

i++;

P2=tab2[i-1];

P0=0x7f;

delay1(60000); }

if(c==0xde) {

num[i]=2;

i++;

P2=tab2[i-1];

P0=0x7f;

delay1(60000); }

if(c==0xbe) {

num[i]=3;

i++;

P2=tab2[i-1];

P0=0x7f;

delay1(60000); }

if(c==0xed) {

num[i]=4;

i++;

P2=tab2[i-1];

P0=0x7f;

delay1(60000); }

if(c==0xdd) {

num[i]=5;

i++;

P2=tab2[i-1];

P0=0x7f;

delay1(60000); }

if(c==0xbd) {

num[i]=6;

i++;

P2=tab2[i-1];

P0=0x7f;

电子琴C程序代码,四乘四矩阵键盘输入

电子琴C程序代码,四乘四矩阵键盘输入#include #define uchar unsigned char #define uint unsigned int sbit duan=P 2八6; sbit wei=P 2八7; sbit bee=P 2八3; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar code tablewe[]={ 0x7f,0xbf,0xdf,0xef, 0xf7,0xfb,0xfd,0xfe}; uchar disp[16]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; // 在里面输入按下键值为0~15 对应要显示的第一位码值uchar disp1[16]={0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x3f}; // 在里面输入按下键值为0~15 对应要显示的第二位码值unsigned char temp; unsigned char key; unsigned char i,j;

unsigned char STH0; unsigned char STL0; unsigned int code tab[]={ //63625, 63833, 64019, 64104, 64260, 64400, 64524 ,// 低音区:1 2 3 4 64580, 64685, 64778, 64820, 64898, 64968, 65030 ,// 中音区:1 2 3 4 5 65058, 65110, 65157, 65178, 65217, 65252, 65283 ,// 高音区:1 2 3 4 5 65297 ,// 超高音:1 }; // 音调数据表可改 void delay(uchar x) uchar y,z; for(y=x;y>0;y--) for(z=0;z<110;z++); void init() TMOD=0x01; ET0=1; EA=1; void display() { for(i=0;i<2;i++)

单片机矩阵键盘设计方案

1、设计原理 (1)如图14.2所示,用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入线,以单片机的P3.4-P3.7各管脚作输出线,在数码管上显示每个按键“0-F”的序号。 (2)键盘中对应按键的序号排列如图14.1所示。 2、参考电路 图14.2 4×4矩阵式键盘识别电路原理图 3、电路硬件说明 (1)在“单片机系统”区域中,把单片机的P3.0-P3.7端口通过8联拨动拨码开关JP3连接到“4×4行列式键盘”区域中的M1-M4,N1-N4端口上。 (2)在“单片机系统”区域中,把单片机的P0.0-P0.7端口连接到“静态数码显示模块”区域中的任何一个a-h端口上;要求:P0.0对应着a,P0.1对应着b,……,P0.7对应着h。 4、程序设计内容 (1)4×4矩阵键盘识别处理。 (2)每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。 5、程序流程图(如图14.3所示) 6、汇编源程序 ;;;;;;;;;;定义单元;;;;;;;;;; COUNT EQU 30H ;;;;;;;;;;入口地址;;;;;;;;;;

ORG 0000H LJMP START ORG 0003H RETI ORG 000BH RETI ORG 0013H RETI ORG 001BH RETI ORG 0023H RETI ORG 002BH RETI ;;;;;;;;;;主程序入口;;;;;;;;;; ORG 0100H START: LCALL CHUSHIHUA LCALL PANDUAN LCALL XIANSHI LJMP START ;;;;;;;;;;初始化程序;;;;;;;;;;

矩阵键盘电路设计

课程设计 题目矩阵键盘电路设计教学院计算机学院 专业计算机应用技术班级 姓名 指导教师 2010 年01 月12 日

前言.................................................................... 第一章需求分析......................................................... 功能描述......................................................... 功能分析......................................................... 第二章系统的原理及分析................................................. 用到的知识点的介绍,知识点使用的总体思路 第三章详细设计......................................................... 硬件设计 系统结构图,元器件的选择等 软件设计 所设计的软件关键模块的程序流程 第四章测试............................................................ 运行结果分析等 第五章总结............................................................. 参考文献................................................................ 附录 关键程序代码........................................................

单片机设计矩阵键盘电子琴

课程设计任务书 课程名称单片机原理及应用课程设计 1.课程设计应达到的目的 本课程是继《单片机原理及应用B》课程之后,训练学生综合运用上述课程知识,进行单片机软件、硬件系统设计与调试,使学生加深对单片机结构、工作原理的理解,提高学生综合应用知识的能力、分析解决问题的能力和单片机最小应用系统的设计技能。通过课程设计,达到理论与实际应用相结合,增强学生对综合电子系统设计的理解,掌握单片机原理就应用的设计方法以及C51编程的能力,并能够在这个基础上进行实际项目的程序设计及软硬件调试,增强学生的工程实践能力。 2.课程设计题目及要求

带存储播放功能的简易电子琴设计 要求:利用行列式键盘和数码管,来控制并显示和产生不同频率的声音。其他扩展功能学生可自己添加,功能不限定与此。 3.课程设计任务及工作量的要求〔包括课程设计计算说明书、图纸、实物样品等要求〕(1)了解相关理论知识,掌握基本的原理,理解相关特殊功能寄存器的设置。 (2)完成电路板的组装 (3)完成硬件电路的测试、以及软件的编程 (4)最终完成具体的课设任务。 4.主要参考文献 1.张洪润等.单片机应用设计200例.北京:北京航空航天大学出版社,2006 2. 胡汉才.单片机原理及其接口技术. 北京:清华大学出版社,2010 3.夏继强等.单片机实验与实践教程.北京:北京航空航天大学出版社,2006 4. 倪晓军等.单片机原理与接口技术教程.北京:清华大学出版社,2007 5(1)硬件方面:单片机。4*4行列式键盘,蜂鸣器,独立数码管,独立建。硬件部分采用逐列扫描,16个键位对应16个音,不断检测16键位,当某个键位被按下,先检测哪一列再检测哪个按键被按下,同时设置四个功能键,p1.0,p1.1播放歌曲,p1.2暂停,p1.3复位,可控制歌曲的播放。 插入图片 (2)音乐频率 一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。单片机12MHZ晶振,高中低音符与单片机计数T0相关的计数值如下表所示: 音符频率简码值(T值) 低3 M 330 64021 低4 FA 349 64103 低5 SO 392 64260 低6 LA 440 64400 低7 SI 494 64524 中 1 DO 523 64580 中 2 RE 587 64684 中 3 M 659 64777 中 4 FA 698 64820 中 5 SO 784 64898 中 6 LA 880 64968

课程设计-制作单片机的4X4矩阵键盘

课程设计-制作单片机的4X4矩阵键盘

目录 摘要.............................................. 错误!未定义书签。第一章硬件部分 (5) 第一节AT89C51 (5) 第二节4*4矩阵式键盘 (8) 第三节LED数码管 (11) 第四节硬件电路连接 (13) 第二章软件部分 (15) 第一节所用软件简介 (15) 第二节程序流程图 (18) 第三节程序 (20) 第三章仿真结果 (23) 心得体会 (26) 参考文献 (27)

第一章硬件部分 第一节AT89C51 AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。引脚如图所示 AT89C5 图1 AT89C51管脚 图 AT89C51其具有以下特性: 与MCS-51 兼容 4K字节可编程FLASH存储器 寿命:1000写/擦循环 数据保留时间:10年

全静态工作:0Hz-24MHz 三级程序存储器锁定 128×8位内部RAM 32可编程I/O线 两个16位定时器/计数器 5个中断源 可编程串行通道 低功耗的闲置和掉电模式 片内振荡器和时钟电路 特性概述: AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 接口,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。 管脚说明: VCC:供电电压。 GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。

矩阵键盘的工作原理和扫描确认方式

9.3.1 矩阵键盘的工作原理和扫描确认方式 来源:《AVR单片机嵌入式系统原理与应用实践》M16华东师范大学电子系马潮 当键盘中按键数量较多时,为了减少对I/O 口的占用,通常将按键排列成矩阵形式,也称为行列键盘,这是一种常见的连接方式。矩阵式键盘接口见图9-7 所示,它由行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU 通过检测行或列线上的电平变化可以确定哪个按键被按下。 图9-7 为一个 4 x 3 的行列结构,可以构成12 个键的键盘。如果使用 4 x 4 的行列结构,就能组成一个16 键的键盘。很明显,在按键数量多的场合,矩阵键盘与独立式按键键盘相比可以节省很多的I/O 口线。 矩阵键盘不仅在连接上比单独式按键复杂,它的按键识别方法也比单独式按键复杂。在矩阵键盘的软件接口程序中,常使用的按键识别方法有行扫描法和线反转法。这两种方法的基本思路是采用循环查循的方法,反复查询按键的状态,因此会大量占用MCU 的时间,所以较好的方式也是采用状态机的方法来设计,尽量减少键盘查询过程对MCU 的占用时间。 下面以图9-7 为例,介绍采用行扫描法对矩阵键盘进行判别的思路。图9-7 中,PD0、PD1、PD2 为3 根列线,作为键盘的输入口(工作于输入方式)。PD3、PD4、PD5、PD6 为4根行线,工作于输出方式,由MCU(扫描)控制其输出的电平值。行扫描法也称为逐行扫描查询法,其按键识别的过程如下。 √将全部行线PD3-PD6 置低电平输出,然后读PD0-PD2 三根输入列线中有无低电平出现。只要有低电平出现,则说明有键按下(实际编程时,还要考虑按键的消抖)。如读到的都是高电平,则表示无键按下。 √在确认有键按下后,需要进入确定具体哪一个键闭合的过程。其思路是:依

单片机实验报告——矩阵键盘数码管显示

单片机实验报告 信息处理实验 实验二矩阵键盘 专业:电气工程及其自动化 指导老师:高哲 组员:明洪开张鸿伟张谦赵智奇 学号:152703117 \152703115\152703118\152703114室温:18 ℃日期:2017 年10 月25日

矩阵键盘 一、实验内容 1、编写程序,做到在键盘上每按一个键(0-F)用数码管将该建对应的名字显示出来。按其它键没有结果。 二、实验目的 1、学习独立式按键的查询识别方法。 2、非编码矩阵键盘的行反转法识别方法。 3、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。 4、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。 5、掌握利用Keil51软件对程序进行编译。 6、会根据实际功能,正确选择单片机功能接线,编制正确程序。对实验结果 能做出分析和解释,能写出符合规格的实验报告。 三、实验原理 1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。 2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。 3、识别键的闭合,通常采用行扫描法和行反转法。行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然

后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。 行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。 由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。 行反转法识别按键的过程是:首先,将4个行线作为输出,将其全部置0,4个列线作为输入,将其全部置1,也就是向P1口写入0xF0;假如此时没有人按键,从P1口读出的值应仍为0xF0;假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0xB0;为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0xBF写入P1口,使P1.6为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0xBE;这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。

51单片机矩阵键盘扫描程序

/*----------------------------------------------- 名称:矩阵键盘依次输入控制使用行列逐级扫描 论坛:https://www.360docs.net/doc/728802884.html, 编写:shifang 日期:2009.5 修改:无 内容:如计算器输入数据形式相同从右至左使用行列扫描方法 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换 #define KeyPort P1 sbit LATCH1=P2^2;//定义锁存使能端口段锁存 sbit LATCH2=P2^3;// 位锁存 unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码 unsigned char TempData[8]; //存储显示值的全局变量 void DelayUs2x(unsigned char t);//us级延时函数声明 void DelayMs(unsigned char t); //ms级延时 void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数 unsigned char KeyScan(void);//键盘扫描 unsigned char KeyPro(void); void Init_Timer0(void);//定时器初始化 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { unsigned char num,i,j; unsigned char temp[8]; Init_Timer0(); while (1) //主循环 { num=KeyPro();

51单片机矩阵键盘程序

/*风清云扬*/ # include #define uchar unsigned char #define uint unsigned int void delay(uint i) { uchar x,j; for(j=0;j

} else if(temp0==0x0b) { switch (temp1) { case 0xe0: num=12;break; case 0xd0: num=11;break; case 0xb0: num=10;break; case 0x70: num=9;break; default:num=0;break; } } else if(temp0==0x07) { switch (temp1) { case 0xe0: num=16;break; case 0xd0: num=15;break; case 0xb0: num=14;break; case 0x70: num=13;break; default:num=0;break; } } } } return num; } void main() { char num; while(1) { num=key_scan(); P2=num/10; P3=num%10; } }

实验一矩阵键盘检测

一、实验目的: 1、学习非编码键盘的工作原理和键盘的扫描方式。 2、学习键盘的去抖方法和键盘应用程序的设计。 二、实验设备: 51/AVR实验板、USB连接线、电脑 三、实验原理: 键盘接口电路是单片机系统设计非常重要的一环,作为人机交互界面里最常用的输入设备。我们可以通过键盘输入数据或命令来实现简单的人机通信。 1、按键的分类 一般来说,按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键(如本学习板上所采用按键)。 按键按照接口原理又可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别。 全编码键盘由专门的芯片实现识键及输出相应的编码,一般还具有去抖动和多键、窜键等保护电路,这种键盘使用方便,硬件开销大,一般的小型嵌入式应用系统较少采用。非编码键盘按连接方式可分为独立式和矩阵式两种,其它工作都主要由软件完成。由于其经济实用,较多地应用于单片机系统中(本学习板也采用非编码键盘)。 2、按键的输入原理 在单片机应用系统中,通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。也就是说,它能提供标准的TTL 逻辑电平,以便与通用数字系统的逻辑电平相容。此外,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据。当所设置的功能键或数字键按下时,计算机应

经典的矩阵键盘扫描程序

键盘是单片机常用输入设备,在按键数量较多时,为了节省I/O口等单片机资源,一般采取扫描的方式来识别到底是哪一个键被按下。即通过确定被按下的键处在哪一行哪一列来确定该键的位置,获取键值以启动相应的功能程序。 4*4矩阵键盘的结构如图1(实物参考见万用板矩阵键盘制作技巧)。在本例中,矩阵键盘的四列依次接到单片机的P1.0~P1.3,四行依次接到单片机的P1.4~P1.7;同时,将列线上拉,通过10K电阻接电源。 查找哪个按键被按下的方法为:一个一个地查找。 先第一行输出0,检查列线是否非全高; 否则第二行输出0,检查列线是否非全高; 否则第三行输出0,检查列线是否非全高; 如果某行输出0时,查到列线非全高,则该行有按键按下; 根据第几行线输出0与第几列线读入为0,即可判断在具体什么位置的按键按下。 下面是具体程序:

void Check_Key(void) { unsigned char row,col,tmp1,tmp2; tmp1 = 0x10; //tmp1用来设置P1口的输出,取反后使 P1.4~P1.7中有一个为0 for(row=0;row<4;row++) // 行检测 { P1 = 0x0f; // 先将p1.4~P1.7置高 P1 =~tmp1; // 使P1.4~p1.7中有一个为0 tmp1*=2; // tmp1左移一位 if ((P1 & 0x0f) < 0x0f) // 检测P1.0~P1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测 { tmp2 = 0x01; // tmp2用于检测出哪一列为0 for(col =0;col<4;col++) // 列检测 { if((P1 & tmp2)==0x00) // 该列如果为低电平则可以判定为该列 { key_val =key_Map[ row*4 +col ]; // 获取键值,识别按键;key_Map为按键的定义表 return; // 退出循环 } tmp2*=2; // tmp2左移一位 } } } } //结束 这是一种比较经典的矩阵键盘识别方法,实现起来较为简单,程序短小精炼。

矩阵键盘程序c程序,51单片机.

/*编译环境:Keil 7.50A c51 */ /*******************************************************/ /*********************************包含头文件********************************/ #include /*********************************数码管表格********************************/ unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x 8E}; /**************************************************************************** 函数功能:延时子程序 入口参数: 出口参数: ****************************************************************************/ void delay(void) { unsigned char i,j; for(i=0;i<20;i++) for(j=0;j<250;j++); } /**************************************************************************** 函数功能:LED显示子程序 入口参数:i 出口参数: ****************************************************************************/ void display(unsigned char i) { P2=0xfe; P0=table[i]; } /**************************************************************************** 函数功能:键盘扫描子程序 入口参数: 出口参数: ****************************************************************************/ void keyscan(void) { unsigned char n; //扫描第一行 P1=0xfe;

单片机之矩阵键盘

单片机之矩阵键盘 下面是一个stc89c52单片机下的矩阵键盘程序,P0口接键盘,显示在P2口. #include; #define uchar unsigned char #define uint unsigned int sbit key1=P3^2; sbit key2=P3^3; uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x 7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //定义八个灯的工作状态。 uchar code wep[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; void yanshi(uint t) { while(--t); } void main() {

uchar han,lei,key; while(1) { P0=0xf0; //初始化为开关状态。11110000 han=P0; //han变量读取P0口的值。第一次扫描键盘。 han=han&0xf0; //对han变量与0xf0与. //如果结果等于P0口初值(0xf0)说明没有键被按下. //如果结果不等于P0(0xf0)口初值,说明有键按下. if(han!=0xf0) yanshi(125*5); //延时消抖. if(han!=0xf0) //语句执行到这里说明真的有键按下. { //例如按下S1键.则P0=1110 0000 lei=P0&0xf0; //lei读取P0口的值. lei=lei|0x0f; //lei=11101111 P0=lei; //P0=11101111 han=P0; //han=11101110 第二次扫描键盘, //因为这里按键S1还是闭合的状态。 han=han&0x0f; //han=00001110 lei=lei&0xf0; //lei=11100000

基于C51单片机矩阵键盘控制蜂鸣器的应用

学校代码 10126 学号科研创新训练论文 题目基于C51单片机的蜂鸣器和流水灯的 应用 院系内蒙古大学鄂尔多斯学院 专业名称自动化 年级 2013 级 学生姓名高乐 指导教师高乐奇 2015年06月20日

基于C51单片机的蜂鸣器和流水灯的应用 摘要 当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。本文介绍了单片机的发展及应用,和基于单片机的蜂鸣器和流水灯的知识及应用,还介绍了此次我所设计的课题。 关键词:C-51单片机,控制系统,流水灯,蜂鸣器,程序设计

The application of buzzer and flowing water light based on C51 MCU Author:GaoLe Tutor:GaoLeQi Abstract This age is a new technology emerge in endlessly era, in the electronic field especially automation intelligent control field, the traditional schism components or digital logic circuit, is composed of control system with unprecedented speed was replaced by micro-controller intelligent control system. SCM has small, strong function, low cost, etc, it can be said that wide application, intelligent control and automatic control core is the micro-controller.This article introduces the MCU development and application,the knowledge and application of buzzer and flowing water light based on MCU,then introduces the task I have designed this time. Keyword:C51 micro-controller,control system,flowing water light,buzzer ,programming

STM32矩阵键盘实现方法收集

STM32用矩阵键盘,不带外部中断,可以多个按键同时按下 C代码: STM32用矩阵键盘,不带外部中断,可以多个按键同时按下 /**************矩阵键盘.h文件*********************************/ #ifndef __COMMON_H #define __COMMON_H #include "stm32f10x.h" /* 4*4矩阵键盘*/ void keyboard_init(void); void update_key(void); extern unsigned char key[4][4]; #endif /**************矩阵键盘.c文件*****************************/ #include "common.h" struct io_port { GPIO_TypeDef *GPIO_x; unsigned short GPIO_pin; }; static struct io_port key_output[4] = { {GPIOD, GPIO_Pin_0}, {GPIOD, GPIO_Pin_1}, {GPIOD, GPIO_Pin_2}, {GPIOD, GPIO_Pin_3} }; static struct io_port key_input[4] = { {GPIOD, GPIO_Pin_4}, {GPIOD, GPIO_Pin_5}, {GPIOD, GPIO_Pin_6}, {GPIOD, GPIO_Pin_7} }; unsigned char key[4][4]; void keyboard_init(void) { GPIO_InitTypeDef GPIO_InitStructure; unsigned char i; /* 键盘行扫描输出线输出高电平*/ /* PA0 PA1 PA2 PA3 输出*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

单片机矩阵键盘

单片机 4*4 矩阵键盘 在单片机按键使用过程中,当键盘中按键数量较多时为了减少端口的占用通常将按键排列成矩阵形式如下图所示,在矩阵式键盘中每条水平线和垂直线在交叉处不直接连通而是通过一个按键加以连接,到底这样做是出意何种目的呢?大家看下面电路图,单片机的整一个8位端口可以构成4*4=16 个矩阵式按键,相比独立式按键接法多出了一倍,而且线数越多区别就越明显,假如再多加一条线就可以构成20个按键的键盘,但是独立式按键接法只能多出1个按键。由此可见,在需要的按键数量比较多时,采用矩阵法来连接键盘是非常合理的,矩阵式结构的键盘显然比独立式键盘复杂一些,单片机对其进行识别也要复杂一些。确定矩阵式键盘上任何一个键被按下通常采用行扫描法。行扫描法又称为逐行查询法它是一种最常用的多按键识别方法。因此,我们就以行扫描法为例介绍矩阵式键盘的工作原理。 首先,不断循环地给低四位独立的低电平,然后判断键盘中有无键按下。将低位中其中一列线(P1.0~P1.3中其中一列)置低电平然后检测行线的状态(高4位,即P1.4~P1.7,由于线与关系,只要与低电平列线接通,即跳变成低电平),只要有一行的电平为低就延时一段时间以消除抖动,然后再次判断,假如依然为低电平,则表示键盘中真的有键被按下而且闭合的键位于低电平的4个按键之中任其一,若所有行线均为高电平则表示键盘中无键按下。再其次,判断闭合键所在的具体位置。在确认有键按下后,即可进入确定具体闭合键的过程。其方法是: 依次将列线置为低电平,即在置某一根列线为低电平时,其它列线为高电平。同时再逐行检测各行线的电平状态;若某行为低,则该行线与置为低电平的列线交叉处的按键就是闭合的按键。下面图5-5是4*4矩阵式按键接法的软件算法操作流程。 图5-4(4*4矩阵式按键的接法) 下面程序按照上述算法流程去编写的,其电路如图5-6,只是在图5-5的基础上多加了P0端口的8只LED灯。从键盘中检测到一个键值,然后将这个值写到LED数码管上显示。

实验一矩阵键盘检测

实验一矩阵键盘检测 一、实验目的: 1、学习非编码键盘的工作原理和键盘的扫描式。 2、学习键盘的去抖法和键盘应用程序的设计。 二、实验设备: 51/AVR实验板、USB连接线、电脑 三、实验原理: 键盘接口电路是单片机系统设计非常重要的一环,作为人机交互界面里最常用的输入设备。我们可以通过键盘输入数据或命令来实现简单的人机通信。 1、按键的分类 一般来说,按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键(如本学习板上所采用按键)。 按键按照接口原理又可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的法。编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别。 全编码键盘由专门的芯片实现识键及输出相应的编码,一般还具有去抖动和多键、窜键等保护电路,这种键盘使用便,硬件开销大,一般的小型嵌入式应用系统较少采用。非编码键盘按连接式可分为独立式和矩阵式两种,其它工作都主要由软件完成。由于其经济实用,较多地应用于单片机系统中(本学习板也采用非编码键盘)。 2、按键的输入原理 在单片机应用系统中,通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。也就是说,它能提供标准的TTL 逻辑电平,以便与通用数字系统的逻辑电平相容。此外,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设

置控制功能或输入数据。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能。因此,键信息输入是与软件结构密切相关的过程。对于一组键或一个键盘,通过接口电路与单片机相连。单片机可以采用查询或中断式了解有无按键输入并检查是哪一个按键按下,若有键按下则跳至相应的键盘处理程序处去执行,若无键按下则继续执行其他程序。 3、按键的特点与去抖 机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。其抖动过程如图1(a)所示,抖动时间的长短与开关的机械特性有关,一般为5 -10 ms。从图中可以看出,在触点抖动期间检测按键的通与断状态,可能导致判断出错。即按键一次按下或释放被错误地认为是多次操作,这种情况是不允出现的。为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两面予以考虑。一般来说,在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。(本学习板采用软件去抖式)。 按键抖动状态图

单片机矩阵键盘与数码管课程设计

矩阵键盘与数码管显示 摘要 矩阵式键盘乃是目前使用较为广泛的一种键盘模式,该系统以N个端口连接控制N*N个按键,即时在LED数码管上。单片机控制的据这是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路部分,主要对按键与显示电路的关系、矩阵式技术及设备系统的硬件、软件等各个部分进行实现。4*4矩阵式键盘采用89C51单片机为核心,主要由矩阵式键盘电路、译码电路、显示电路等组成,软件选用C语言编程,单片机将检测到的按键信号转换成数字量,显示于数码管显示器,系统灵活性强,易于操作,可靠性能好。单片机简介及主系统电路 单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换444器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域的广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的32位300M的高速单片机。单片机在工业控制领域广泛应用,它由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中,本次课程设计我们采用的是AT89C51型号的单片机。 AT89C51单片机是51系列单片机的一个成员,是8051单片机的简化版。内部自带2K字节可编程FLASH存储器的低电压、高性能COMS八位微处理器,与Intel MCS-51系列单片机的指令和输出管脚相兼容。由于将多功能八位CPU和闪速存储器结合在单个芯片中,因此,AT89C2051构成的单片机系统是具有结构最简单、造价最低廉、效率最高的微控制系统,省去了外部的RAM、ROM和接口器件,减少了硬件开销,提高了系统的性价比。其最小系统电路图如下:

4×5矩阵键盘驱动程序

4×5矩阵键盘驱动程序 一、工作原理及接口电路 4×5矩阵键盘有4条列线,5条行线共20个按键。每个按键对应不同键值,键盘扫描采用外部中断扫描方式,本系统中键盘为无源结构,键盘工作时不依靠任何外部电源。4×5矩阵键盘结构图如图2-10 所示。 图2-10 4×5矩阵键盘结构图 1)4×5矩阵键盘结构及按键抖动消除 当键盘中按键数量较多时为减少I/O口的占用,通常将按键排列成矩阵形式,如图2-12所示。在矩阵式键盘中,每条行线和列线在交叉处不直接连通,而是通过一个机械弹性开关加以连接。这样5条列线(R0~R4)和4条行线(L0~L3)就可以构成20个按键的矩阵键盘。键盘采用了无源结构,工作是不依靠任何外部电源。 由于机械弹性开关的机械触点的弹性作用,一个按键开关在闭合时并不会马上稳定的闭合,在断开时也不会马上断开,因而机械开关在闭合及断开瞬间均伴有一连串的抖动,如图2-11所示。

图2-11 按键时的抖动 抖动的时间长短由按键开关机械特性及按键的人为因素决定,一般为5ms~20ms。按键抖动如果处理不当会引起一次按键被误处理多次,所以消除抖动是必要的。消除抖动的有硬件处理和软件处理两种方法。当按键较多一般采用软件消抖方式。软件消抖原理为当检测出按键闭合后执行一个延时程序(产生5ms~20ms的延时),待前沿抖动消失后再次检测按键的状态,如果按键仍保持闭合状态则可确认为有键按下。当检测到按键释放并执行延时程序,待后沿抖动消失后才转入按键的处理程序。 1)矩阵键盘的工作原理 从4×5矩阵键盘的4条列线和5条行线分别引出9条端线接于单片机的9个I/O 口,由于键盘采用了无源结构所以行列线的电平由单片机I/O口的电平决定。进入按键处理程序后先使4条列线全为低电平,5条行线全为高电平,为读行线状态做准备,没有按键时这种状态不会被改变。当键盘上的某个按键闭合时,则该键所对应的行线和列线被短路。例如:6号键被按下时列线L2与行线R1被短路,此时行线R1电平被列线L2拉低,由原来的高电平变为低电平而其它行线电平依然不变,为低电平。此时单片机可读得行线状态进而判断按键所在行并记录下行号。之后使得4条列线全为高电平,5条行线全为低电平,为读列线状态做准备。同理6号键被按下时列线L2与行线R1被短路,此时列线L2电平被行线R1拉低,由原来的高电平变为低电平而其它行线电平依然不变,为低电平。此时单片机可读得列线状态进而判断按键所在列并记录下列号。然后按一定的按键编码规则可计算出6号键的键值。 2)键盘扫描方式 键盘扫描方式一般有三种:循环扫描方式,定时扫描方式,外部中断扫描方式。循环扫描方式需要不停地扫描键盘,影响其它功能执行工作效率低。定时扫描方式是利用单片机内部的定时器,产生一个适当时间的定时中断,单片机响应中断时对键盘进行扫描取键值过程,但是这种扫描方式不管键盘上是不是有键闭合单片机总是定时地扫描工作效率还是不高。外部中断扫描方式是只在键盘上有

相关文档
最新文档