与单片机交互,键盘可能是最直接的工具了。所以我对于键盘检测也是十分期待的。
键盘说开了,其实就是很多的按钮。如果键盘数比较小的话,直接使用IO口连接按钮就可以了,比如我要实现一个功能,按键使数字加1或减1,这样的话,只需要两个按键就可以了。单个键盘的检测并不困难,先把IO口电平置为高电平,然后直接IO连按钮,再把按钮接地,当按下按钮时,检测到IO口电平为低即表示按下了按钮。当然这是理论情况下,实际的情况是,按下按钮后,电平还会上下的跳变几次,所以如果只是单纯的检测电平的变化,是不准确的。所以比较简单的方法是,检测到电平变化后,延时一段时间(比如10ms),再去检测电平,如果电平和先前检测到的一致,说明确实是按下去了。
下面是单独按钮的实验,简单起见,直接用LED灯来显示当前值的二进制(不考虑溢出等情况)
------------------------------------------------------------------
当需要的的按键比较少的时候,可以直接把IO口和按钮直接相连,不过当需要的按钮很多的时候,则不能这样连接了。像一般的电脑键盘100多个按键,难道直接和系统IO相连?这显然是不现实的。矩阵键盘就是一种能够以较少的IO口,检测较多按键的键盘。矩阵键盘的原理就不写了,网上很容易就找到,简单而言,就是检测按下的按键,是第几行,第几列。具体检测的方法也很简单,首先给相连的所有IO口加高电平,然后把某一行的线置低电平,如果有按键按下的话,则对应的列连接的IO口也会变成低电平,这样,行和列就都知道了。原理图如下,按下1-9时在数码管上显示数字,其他按键直接显示“-”号。
检测代码如下:
char check()
{
uchar row=0,col=0;//定义行和列
uchar tmp = 0,tmp2 = 0;
for(row=0;row<4;row++)
{
//P2.0到P2.3表示是第几行,依次置低电位
tmp = (0xFF & (~(1< P2 = tmp;
tmp2 = tmp;//因为要逐个的检测列,tmp的值会改变,所以加了一个tmp2来记录行的值
//P2.4到P2.7表示是第几列,依次检测是否低电平
for(col=0;col<4;col++)
{
tmp = tmp2 & (~(1<<(col+4))); //表示对应的行和列,表示到P2时,应该显示的值
if(P2 == tmp)
{
delay(); //去抖动
if(P2 == tmp) //确认是第几行,第几列了,则返回对应的值
{
if(row==3 && col==1) //0在第四行,第二列
return 0;
if(row<3 && col<3)//表示1到9
return (2-row)*3 + col + 1;
return 10;//表示按的键不在0到9之间
}
}
}
}
return -1;//表示没有按键
}
|
关键字:Proteus 51单片机 键盘
引用地址:
用Proteus学习51单片机之键盘
推荐阅读最新更新时间:2024-03-16 15:28
5-基于51单片机的语音实时采集系统
具体实现功能 系统由STC89C52单片机+ISD4004录音芯片+LM386功放模块+小喇叭+LCD1602+按键+指示灯+电源构成。 具体实现功能: (1)可通过按键随时选择相应的录音进行播放; (2)可以通过按键随时录音,可以录制4段声音,并可以按键控制播放和暂停,最长可以录制8分钟; (3)播放的音量可以通过调节电位器改变。 设计背景 数码录音笔对于我们现如今的人们己经是再熟悉不过的产品了,它己经应用在了很多地方,其中主体部分应该是记者了。正是基于录音笔能够录音的特点,在你无法凭借记忆记住重要谈话,或者重要会议的重要内容的时候,它便体现除了它的优势,清晰完整无误的记录下你要记录的东西,而你能够拿出更多的
[单片机]
51单片机数码管显示的数字钟
这是一个基于51单片机的数字钟程序用数码管来显示数据. 原理图源代码及仿真文件下载地址: http://www.51hei.com/bbs/dpj-20407-1.html 下面是源码: #include AT89X51.H unsigned char code dispcode ={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00}; unsigned char dispbitcode ={0
[单片机]
51单片机学习笔记:可对时电子钟
本篇是对上一篇的改进,昨天学习了第4章 中的独立键盘的使用 独立键盘拥有自己独有的IO口,所以比较简单,我上一篇写的电子钟程序只能烧程序对时, 不能手动按键对时,这肯定是最差劲的做法,所以学习了按键之后,就立马动手改进我的电子钟了 同时改进了数码管小数点的显示,消除了叠影 使用芯片STC89C52RC, 2个锁存器 6个带小数点共阴极数码管显示一个24时制时钟 没有时钟芯片,所以掉电后时间会复位 原理图为TX-1C开发板 ============================== 最终显示的 时.分.秒 是 16.31.37 形式 使用3个按键, S2 S3 S5 其中S2和S3是加减数值,S5是切换对时状态,
[单片机]
51单片机-240128液晶程序与调试
今天终于把金鹏OCMJ8X15D-2液晶(240128点阵带字库无触屏液晶)调好了。 这块液晶能显示8行15个汉字,还有放大字形,从16*16点放大到32*32点的功能。对于觉得12864的4行8列内容过少,或者觉得0.5*0.5mm的点的大小过于粗糙的情况来说,这款液晶是很适合的,它的点大小为0.33*0.33mm。 可能是习惯了12864这样的液晶,结果在硬件连接上就出来了一个重大错误,结果弄了好久也只显示条形点阵,而且对比度很差。这个错误就是240128液晶的对比度调节电位器,两端一端接地,另一端接VOUT(22脚)!而我习惯性的接到了5V!在曹老师的提醒下才发现了这个问题,在手册的角落里发现了硬件连接图:
[单片机]
基于51单片机的八路抢答器仿真设计
首先,裁判在右方按下开始按钮,蜂鸣器响起,抢答开始,初始时间为20s,若1-8位选手按下按钮,即抢答成功,由显示屏显示该选手号码,如果超过时间(20s)没人认抢答,则时间重置为20s,并此题作废,答题结束后,按下重置按钮,这时时间重置,下次抢答开始。 创新功能(*)在没有按下开始键时,按下修改时间按钮,则时间会减少1s,由于默认时间为20s,所以这个功能可以实现20s内时间的调整 仿真原理图如下 单片机源程序如下: #include reg51.h #define uchar unsigned char #define uint unsigned int #define max 20 uchar tab ={0x3f,0x
[单片机]
51单片机之计时器与计数器
CPU时序的有关知识 振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期) 状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。 机器周期:1个机器周期含6个状态周期,12个振荡周期。 指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。 例如:外接晶振为12MHz时,51单片机相关周期的具体值为: 振荡周期=1/12us; 状态周期=1/6us; 机器周期=1us; 指令周期=1~4us; 初始化程序应完成如下工作: 对TMOD赋值,以确定T0和T1的工作方式。 计算初值,并将其写入TH0、TL0或TH1、TL1。 中断方式时,则对EA赋值,开放定时器
[单片机]
C51单片机P4口使用
C51单片机(STC11L32/48XE)的P4可以像其他IO可以作为正常的IO来使用。 如图:
[单片机]
基于MCS-51单片机的智能时钟控制系统设计的技巧
随着电子技术产业结构调整,生产工艺的飞速发展,人们生活水平的不断提高,家用电器逐渐普及,市场对于智能时钟控制系统的需求也越来越大。本文所述智能时钟控制系统主要指时钟显示、时间设置、闹铃及家用电器定时开关机(可扩展功能)等控制系统。 本文采用进入市场时间早、总线开放、仿真开发设备多、芯片及其开发设备价格低廉、速度较快、电磁兼容性较好的MCS-51型单片机为核心实现智能时钟控制。 硬件系统设计 智能时钟控制系统以MCS-51MC3399T兼容单片机AT89C51微处理器为核心,由时钟显示模块、定时控制模块、电源模块等电路组成。 AT89C51微处理器 AT89C51是一款采用ATMEL高密度非易失存储器M
[单片机]