独立按键

首先既然是检测输入,对于当然要用到拉电阻,来检测引脚电平变化变化。51单片机中,除了P0口外,P2,P3,P4都是内置上拉电阻的双向IO口,一般 的 51 P0引脚都外接了上拉电阻,当然也可以用作输入口。

作为输入前需要拉为高电平。 当有按键按下,致使单片机的某个引脚接地,变为低电平时,我们就认为这个按键按下了。当按键松开后,由于输入不会锁存,所以此时拉高的引脚回归到高电平。

独立按键的内部原理。

独立按键的4个引脚中,两两为一组。每一组的2个引脚是连在一起的,当按键按键时,2个组又连接了,也就是4个脚都连接一起了。

在按键没有按下去的时候1,2号脚相连,3,4号脚相连。按键按下去的时候,1,2,3,4号脚就全部接通。

按键的很重要注意点就是消除抖动,消抖。因为人按下按键不是并瞬间到位的,按键在按下的过程中会有抖动。我们需要通过延时来让单片机绕过抖动的时间。

下面是一个用按键作为开关间接控制LED的demo。

:下图中P2.0连接的按键应该再接一个电阻,我疏忽忘记画出来了。

/***************************************
按键按下,LED亮,松开,LED熄灭 **************************************/ #include<reg51.h>
typedef unsigned int uint;
typedef unsigned char uchar ; sbit button = P2^; //按键输入引脚
sbit led = P0^; //LED控制输出引脚 /***************************/
void delay(uint t);
uchar isKeyPressed(void);
/***************************/ void main(void)
{
button = ; //P2 是 准 IO口,作为输入前要写1
led = ;
while()
{
if(isKeyPressed())
{
led = ;
delay();
led =; } } } uchar isKeyPressed(void)
{
uchar isPressed = ; //是否按下标志位
uchar c=;
if(button==) //初次检测
{
delay(); //消抖延时
if(button==) //再次验证
{
isPressed = ;
while(isPressed== && c--) //如果不用c作为计数器,那么一直按着按键的话,程序就会一直在这里循环。是否要用c需要根据自己的要求。
;
}
} return isPressed; } void delay(uint t)
{
uint i;
uchar j;
for(i=t;i>;i--)
for(j=;j>;j--)
;
}

矩阵按键

矩阵按键的检测方式有多种,最常用的就是行列式扫描检测。原理和独立按键是一样的,只不过我们要扫描一组按键,找出那个被按下的而已。

对行列式扫描的分析。

假如我们按下了按键S6,现在来检测它。

用红色表示1高电平,蓝色表示0低电平。

先给键盘连接的GPIO口赋值为0XF0。

电平反转。

              

这样就可以判断定了按键的坐标。

demo的连线图。

/******************************
将按键的编号显示到数码管上
*****************************/ #include<reg51.h> typedef unsigned int uint;
typedef unsigned char uchar;
typedef signed char schar;
/*************************/
void delay(uint t) ;
void showDigit(uint num);
schar martixKeyScan(void);
/***************************/ uchar code TABLE[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F} ; #define DUAN_XUAN P1 //数码管的段选
#define KEYS_REC P2 //连接矩阵键盘
sbit Add0 = P0^; //译码器的A0 A1 A3,用来数码管的位选
sbit Add1 = P0^;
sbit Add2 = P0^; void main(void)
{ schar keyRe;
uint number=; while()
{
keyRe = martixKeyScan();
if(- != keyRe){ number = keyRe;
}
showDigit(number); } } void showDigit(uint num)
{
uchar count = ; //根据输入数据的位数来开启数码管的位。
do
{
switch(count)
{
case :Add2 = ;Add1 = ;Add0 = ;break; //送入位选,显示这个数的个位
case :Add2 = ;Add1 = ;Add0 = ;break; //显示十位
case :Add2 = ;Add1 = ;Add0 = ;break;
case :Add2 = ;Add1 = ;Add0 = ;break;
case :Add2 = ;Add1 = ;Add0 = ;break;
case :Add2 = ;Add1 = ;Add0 = ;break;
case :Add2 = ;Add1 = ;Add0 = ;break;
case :Add2 = ;Add1 = ;Add0 = ;break;
} DUAN_XUAN = TABLE[num%]; //送入段选
delay();
DUAN_XUAN = ; //关闭所有段,消影
count++;
}while(num/=); } /**********************
矩阵按键检测。
有按键按下,返回按键的编号,否则返回-1;
***********************/
schar martixKeyScan(void)
{ schar col,row;
uchar c=; //松手计数器
KEYS_REC = 0xF0 ; //让连接键盘的高4位为1 ,低4位为0 if(KEYS_REC != 0xF0) //初次检查到按下
{
delay(); //消抖延时
if(KEYS_REC != 0xF0) //真的被按下了
{ switch(KEYS_REC)
{
case 0X70: row = ;break; // 0111 0000
case 0XB0: row = ; break; // 1011 0000
case 0XD0: row = ;break; // 1101 0000
case 0XE0: row = ;break; // 1110 0000
default:break;
} KEYS_REC = 0x0F; //电平反转,检测列
switch(KEYS_REC)
{
case 0X07: col = ;break; //0000 0111
case 0X0B: col = ; break; //0000 1011
case 0X0D: col = ;break; //0000 1101
case 0X0E: col = ;break; //0000 1110
default:break;
} while((c--) && (KEYS_REC!=0x0F)) //等待按键松手
{
delay(); } return (row-)*+col; //使用4X4的键盘 } //真的按下了
else
return -;
} return -;
} void delay(uint t)
{
uint i,j;
for(i=t;i>;i--)
for(j=;j>;j--)
;
}

【C51】单片机独立按键与矩阵按键的更多相关文章

  1. AD按键-矩阵按键-独立按键:

    原理:利用数组分压+AD采集: 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来):可备用作为AD基准输入. 缺点:不能做成组合按键(或者电阻要精确选择):且离IO ...

  2. C51 原创电子琴 (蜂鸣器/计时器/中断/矩阵按键)

    需求分析 用C51的16个矩阵按键当作两个八度的琴键 按下时发出相应音调的声音,静态数码管显示相应音符的数字. 为了解锁更多曲目,两个多的琴键设计成#4,显示时加上小数点 下图分别为1和#4的显示,其 ...

  3. C51 矩阵按键 个人笔记

    矩阵按键 电路 每个按键一端和同行一端相连(JP4的高4位),另一端和同列一端相连(JP4的低4位) 判断按键是否按下: 法一:逐行扫描 for(int i = 8 ; i>3 ; i-- ) ...

  4. 【.NET 与树莓派】矩阵按键

    欢迎收看火星卫视,本期节目咱们严重探讨一下矩阵按键. 所谓矩阵按键,就是一个小键盘(其实一块PCB板),上面有几个 Key(开关),你不按下去的时候,电路是断开的,你按下去电路就会接通.至于说有多少个 ...

  5. 十天学会单片机Day2键盘检测(独立键盘、矩阵键盘)

    1.键盘的分类 编码键盘:键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘 非编码键盘:靠软件编程来识别的称为非编码键盘.独立键盘.矩阵键盘 2.按键消抖   ...

  6. AD按键-矩阵按键:

    原理:利用数组分压+AD采集: 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来):可备用作为AD基准输入. 缺点:不能做成组合按键(或者电阻要精确选择):且离IO ...

  7. C51单片机_day_01(定时器和中断系统)

                c51单片机 51单片机是控制电路系统的开关,当然芯片就是51芯片,现在随着科技的发展,也是出了很多,功能更多,更全的芯片. 51是用c语言做为程序编程的语言 ——我对基本基础 ...

  8. C51单片机中data、idata、xdata、pdata的区别

    C51单片机中data.idata.xdata.pdata的区别 data: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小. idata: 固定指前 ...

  9. C51单片机头文件和启动文件

    STARTUP.A51//启动文件. 清理RAM.设置堆栈等.即执行完start.a51后跳转到.c文件的main函数 <reg51.h>  //特殊寄存器的字节地址和位地址,sfr定义字 ...

随机推荐

  1. IoC模式(转)

    IoC模式 1.依赖 依赖就是有联系,有地方使用到它就是有依赖它,一个系统不可能完全避免依赖.如果你的一个类或者模块在项目中没有用到它,恭喜你,可以从项目中剔除它或者排除它了,因为没有一个地方会依赖它 ...

  2. SU suspecfk命令学习

    用suplane生成平面,并查看其FK谱, 水平反射界面经FK变换后,波数为0, 正好处于临界,乃奎斯特频率, 有空间假频, Over,不足之处,欢迎批评指正.

  3. Mac terminal 解压压缩

    tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)———————————————.gz解压1:gunz ...

  4. BZOJ4294 : [PA2015]Fibonacci

    斐波那契数列模$10^m$的循环节为$6\times10^m$,于是从低位到高位dfs即可. #include<cstdio> #include<cstring> #defin ...

  5. BZOJ3738 : [Ontak2013]Kapitał

    $C_{N+M}^N=\frac{(N+M)!}{N!M!}$ 考虑求出$ans\bmod 10^9$的值 $10^9=2^9\times5^9$ 以$2^9$为例,先预处理出$1$..$2^9$中不 ...

  6. Flex httpservice返回值类型和处理 (转)

    这两天在考虑flex与后端java服务交互的问题.在采用BlazeDS的Remote Object方式,还是传统的http service方式之间徘徊了一段时间 采用BlazeDS的Remote Ob ...

  7. python中的循环

    >>> x = 100 >>> y = 10>>> x < y and x or y10>>> x if x > y ...

  8. [转载] - QWidget、QMainWindow、QDialog和QFrame的区别

    继承关系:在Qt中所有的类都有一个共同的基类QObject ,QWidget直接继承与QPaintDevice类,QDialog.QMainWindow.QFrame直接继承QWidget 类.   ...

  9. MHA监控进程异常退出

    这两天遇到一个非常诡异的问题,打算和大家分享一下.只所以诡异估计是自己知识面不够吧.线上的MHA一直没有开启自动切换,都是手动切换的,最近开启了自动切换以后,退出securecrt窗口以后发现监控进程 ...

  10. Html - SPA页面收集(有图)

    场景,左图,又字段的布局 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...