51单片机学习之5-独立按键和矩阵键盘

发布者:中原读书客最新更新时间:2015-06-24 来源: 51hei关键字:51单片机  独立按键  矩阵键盘 手机看文章 扫描二维码
随时随地手机看文章
第14集

 

键盘的原理

键盘分编码键盘(例如电脑键盘)和非编码键盘(自己用程序去识别)。

非编码键盘分:独立式非编码键盘(独立按键)、行列式非编码键盘(4*4阵列键盘)

 

独立键盘的电路图。

 

因为51单片机的IO口不是双向口而是准双向口,要让IO口具备输入功能,必须将IO口置1,置1之后当按键按下时IO口的电平会被拉低,即被置0。当检测到IO口为0时即可判断该按键已经按下。按键按下时会有一个抖动的过程(弹片会抖动),由于单片机检测 IO口速度非常快,超过弹片抖动的频率,所以当单片机检测到IO口为0时需延时一小段时间再检测IO是否为0,如果仍为0就确认该按钮被按下。因为IO口里面有上拉电阻,所以当松开按钮时,IO口又被拉高。

例程:

#include

 

#define uint unsigned int

#define uchar unsigned char

 

sbit Key = P3^4;   // 按键

sbit Led = P1^0; // Led 灯

void delay(uint z);

 

/******** 主函数 ********/

void main()

{

while(1)

{

if(!Key)

{

delay(10);    // 消抖操作

if(!Key)

Led = 0; // 按下时 Led亮

else

Led = 1;

}

}

}

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

 

第15集

4*4矩阵键盘

上图中,1个按键占用一个IO口,如果有16个按键就占用了16个IO口。为了减少IO口的使用,就需要用矩阵的方式连线。如下图


 

矩阵扫描原理

从图可以看出P30、P31、P32、P33 为行(低四位),P34、P35、P36、P37为列(高四位)。

假设我们按下的是S6按钮。[page]

第一步,我们先确定列,给P3口赋值0xF0 = 1111 0000 ,那么P37、P36、P35、P34都被置1,P33、P32、P31、P30 都被置0,当S6被按下时,由于S6按钮的一边P31为0,所以跟S6另一边相连的P35被拉低,即等于0。如下图

此时得到列的值 P3 = 1101 0000 = 0xD0,在程序中只需要判断P3是否等于0xF0,不等说明有按键按下。

第二步,不改变高四位的状态:1101 将低四位全部置1(P3 = P3 | 0x0F)。这时候就变成了 1101 1111,由于单片机扫描列的时候速度非常快,到现在扫描行的时候,按键仍处在按下状态(人的反应没有单片机快)。S6被按下,由于与S6相连的P35为低电平(即0),所以P31由高电平(即1)变成低电平(即0)如下图

此时得到的值为 P3  = 1101 1101 =  S6 被按下。这就是检测原理。 

 

完整程序:

#include

 

#define uint unsigned int

#define uchar unsigned char

 

sbit Led = P1^0;

sbit Led1 = P1^1;

void delay(uint z);

 

/******** 主函数 ********/

void main()

{

uchar Key_Temp;

uchar Key; // Key 键值

 

while(1)

{

Key = 0; // 清0 

P3 = 0xF0;

Key_Temp = P3;

Key_Temp &= 0xF0; // 只取高四位 这句需要,因为51IO只是准双向 要使其具备输入功能需要用置1

if(0xF0!=Key_Temp) // 判断是否有按键按下

{

delay(10);    // 延时一段时间 跳过抖动的时间

Key_Temp = P3 & 0xF0 ; // 先取P3 然后 和 0xF0与运算得到 高四位

if(0xF0 != Key_Temp) // 再次判断是否确实按下

{

P3 = Key_Temp | 0x0F; // 保留高四位 将低四位全部置1 并输出

Key = P3; // 再读入

}

}  

switch(Key)

{

 

case 0xEE: Led = 0; break;  // S1

case 0xDE: Led1 = 0; break;

case 0xBE: break;

case 0x7E: break;

case 0xED: break;

case 0xDD: break;

case 0xBD: break;

case 0x7D: break;

case 0xEB: break;

case 0xDB: break;

case 0xBB: break;

case 0x7B: break;

case 0xE7: break;

case 0xD7: break;

case 0xB7: break;

case 0x77: break;  // S16

default:

Led = Led1 = 1;

}

}

}

 

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

关键字:51单片机  独立按键  矩阵键盘 引用地址:51单片机学习之5-独立按键和矩阵键盘

上一篇:4*4键盘扫描代码
下一篇:51单片机学习之3-步进电机

推荐阅读最新更新时间:2024-03-16 14:04

MC-51单片机红绿灯+数码管计时实验
单片机实验 //主机板的P1接口 平接 显示板P00接口 即数码管段选接口 //主机板的P3接口 平接 显示板P20接口 即数码管位选接口 //主机板的P0接口 平接 显示板灯的接口 #include reg51.h unsigned char time ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; int n = 2000;//每半秒中断一次 bit change=1; bit Shan=1;//闪 //定义显示管为位选特殊位 sbit A=P3^7; sbit B1=P3^6; sbit C=P3^5; sbit G1=P3^4; sbit daul = P
[单片机]
51单片机-KEIL的使用与程序的下载
很多人学单片机的时候都会遇到的情况,程序写的漂漂亮亮,原理理解的通通透透,但是.......不会用编译软件,不知道怎么下载程序,貌似大学的时候我老师就没讲过,呵呵。所以今天主要讲一下这两个软件的应用。 注:单片机种类多种多样,编译环境自然也有很多种。学习一种编译软件肯定需要一定的时间,不过软件界面基本都是大同小异,会了一个再去学另一个会很快。还有个现象,很多人喜欢用汉化版,个人感觉没必要。首先,汉化的不一定标准;其次,工具英语就那么几个单词,记下来就OK了,汉化反而会增加不必要的麻烦。 好了,废话少说,开始! 先说keil uvision,第一步,双击打开该软件,界面如下: 写代码的话
[单片机]
学<font color='red'>51单片机</font>-KEIL的使用与程序的下载
51单片机如何轻松转型到ARM设计?
看到很多在做电子工程设计的朋友在讨论:51单片机转到ARM该怎样学习?《单片机与嵌入式系统应用》小编为大家找到了这样一位工程师,谈谈他的实际经验~ 我以前一直用的是51,不过一直是C51,对C语言已经有10多年的经验,汇编用的很少,后来因为项目需要转到了ARM。一开始对ARM什么都不懂,看了本《ARM体系结构与编程》也是云里雾里的,但是也许是因为无知者无畏吧,我直接就在MDK中建立一个工程,添加了自带的启动文件,然后做了个main函数,里面一个死循环没有操作任何硬件,居然跑起来了。然后以此为基础,慢慢的开始控制GPIO和串口通信,当时突然发现,我的项目不就是搞搞这些吗?其他的什么运行模式、什么链接寄存器、什么PC寄存器关我
[单片机]
嵌入式学习笔记13——51单片机之D/A转换器
1. 在很多应用系统中,测控对象是模拟量,单片机只能处理数字量,因此必须进行数字量和模拟量之间的转换。这就需要A/D和D/A转换器件。 2. 假如某D/A可输入8位数字,最高输出5V电压,则输入x,输出电压值为x*(5/256)V。 3. 分辨率是指输入数字量的最低有效位(LSB)发生变化时,所对应的的输出模拟量(电压或电流)的变化量。它反映了输出模拟量的最小变化值。即,最大输出模拟量/(2^位数)。 4. 线性度(也称非线性误差)是实际转换特性曲线与理想直线特性之间的最大偏差。常以相对于满量程(即最大输出模拟量)的百分数表示。(假设DAC位8位,满量程为5V,则理想直线为连接(0,0V)和(255,5V)之间的直线。 5.
[单片机]
51单片机学习之路 —— 1.6 单片机的中断(1)
这一次我们来单片机中很重要的一个概念 :  中断   今天讲的是一些中断的概念和关于中断的知识点 1 :  什么是中断?      理解下生活中的中断 再对比下单片机中断          中断的嵌套          中断优先级 2 : 中断源           52系列为6个中断源 51只有5个      下降沿 : 逻辑电平从高电平到低电平的转换被称为下降沿    默认中断级别 :          中断允许寄存器IE :          这里主要记:  EA  - 全局中断允许位           ET0 - 定时器/计数器0中断允许位
[单片机]
<font color='red'>51单片机</font>学习之路 —— 1.6 单片机的中断(1)
AT89C51单片机在无线数据传输中的应用
一般的数字采集系统,是 通过 传感 器将捕捉的现场 信号 转换为电信号,经模/数转换器ADC采样、量化、编码后,为成数字信号,存入数据 存储器 ,或送给微处理器,或通过无线方式将数据发送给接收端进行处理。无线数据传输系统就是 样一套利用无线手段,将采集的数据由测量站发送到主控站的设备。 1 系统组成 系统组成如图1、图2所示。   系统由测量站和主控站两部分组成。测量站主要完成对现场信号的采集、存储,接收遥控 指令并 发送数据。主控站的主要工作是发送遥控指令、接收数据信息、进行数据处理和数据管理、随机显示打印等。 2 AT89C51与数字电台的串行通信 Atmel公司的AT89C51单片机,是一种低功耗、高 性能 的、片
[单片机]
基于51单片机的温度控制系统设计与制作
本装置可以模拟温度报警系统,可以进行目标温度和警报温度的设计,未达到目标温度模拟加热的Led灯会出现一闪一闪的情况,达到设定的目标温度会停止模拟加热,当当前温度高于设定的警报温度时,蜂鸣器会进行报警。具体使用说明见设计书,还有就是有一点,不太会画PCB,所以可以不用打开PCB 仿真原理图如下 制作出来的实物图如下: Altium Designer画的原理图和PCB图如下: #include reg51.h #include lcd.h #include temp.h #include general.h #include ds1302.h /**********************************
[单片机]
基于<font color='red'>51单片机</font>的温度控制系统设计与制作
基于普中科技51单片机的四路抢答器
在普中科技开发板上实验成功了。下面附上代码,由于都有注释,就不废话了,如果看不懂,可以连线调试一下(这是作为一个硬件生应该掌握的基本技能。 单片机源程序如下: #include reg51.h #define uchar unsigned char #define uint unsigned int #define WHO P0 sbit player1=P1^0; sbit player2=P1^1; sbit player3=P1^2; sbit player4=P1^3; sbit Ensure=P3^7; sbit beep=P1^6; sbit LSA=P3^2; sb
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved