单片机独立按键与矩阵按键

发布者:qpb1234最新更新时间:2016-12-26 来源: eefocus关键字:单片机  独立按键  矩阵按键 手机看文章 扫描二维码
随时随地手机看文章

独立按键

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

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

 

 

独立按键的内部原理。

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

 

 

 

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

 

 

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

 

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


/***************************************
按键按下,LED亮,松开,LED熄灭

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


#includetypedef unsigned int uint;
typedef unsigned char uchar ;


sbit button = P2^0;     //按键输入引脚sbit led = P0^0;       //LED控制输出引脚/***************************/void delay(uint t);
uchar isKeyPressed(void);/***************************/void main(void)
{
    button = 1;         //P2 是 准 IO口,作为输入前要写1
    led = 1;    while(1)
    {        if(isKeyPressed())
        {
             led = 0;
             delay(100); 
             led =1;
             
        }
        
    }

}


uchar isKeyPressed(void)
{
     uchar isPressed = 0;  //是否按下标志位
     uchar c=50;     if(button==0)          //初次检测   
     {
         delay(5);         //消抖延时
        if(button==0)     //再次验证                     {
            isPressed = 1;            while(isPressed==0 && c--)    //如果不用c作为计数器,那么一直按着按键的话,程序就会一直在这里循环。是否要用c需要根据自己的要求。            ;
        }
     }     return isPressed;

}void delay(uint t)
{    uint i;
    uchar j;    for(i=t;i>0;i--)     for(j=110;j>0;j--)
      ;
}


矩阵按键

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

对行列式扫描的分析。

 

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

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

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

 

 

电平反转。

 

 

 

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

 

 

demo的连线图。

 


/******************************
将按键的编号显示到数码管上
*****************************/


#includetypedef 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[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F} ;#define  DUAN_XUAN  P1   //数码管的段选#define  KEYS_REC  P2   //连接矩阵键盘sbit Add0 = P0^0;    //译码器的A0 A1 A3,用来数码管的位选sbit Add1 = P0^1;
sbit Add2 = P0^2;void main(void)
{
    
    schar keyRe;    uint number=0;     while(1)
     {
           keyRe = martixKeyScan();         if(-1 != keyRe){
         
             number = keyRe;
         }
         showDigit(number);
         
     }


}void showDigit(uint num)
{
    uchar count = 0;     //根据输入数据的位数来开启数码管的位。
    do
    {        switch(count)
        {            case 0:Add2 = 1;Add1 = 1;Add0 = 1;break;       //送入位选,显示这个数的个位
            case 1:Add2 = 1;Add1 = 1;Add0 = 0;break;         //显示十位
            case 2:Add2 = 1;Add1 = 0;Add0 = 1;break;            case 3:Add2 = 1;Add1 = 0;Add0 = 0;break;            case 4:Add2 = 0;Add1 = 1;Add0 = 1;break;            case 5:Add2 = 0;Add1 = 1;Add0 = 0;break;            case 6:Add2 = 0;Add1 = 0;Add0 = 1;break;            case 7:Add2 = 0;Add1 = 0;Add0 = 0;break;
        }
        
        DUAN_XUAN = TABLE[num%10];   //送入段选
        delay(5);                       
        DUAN_XUAN = 0 ;               //关闭所有段,消影
        count++;
    }while(num/=10);

}/**********************
矩阵按键检测。
有按键按下,返回按键的编号,否则返回-1;
***********************/schar martixKeyScan(void)
{
           
     schar col,row;
     uchar c=50;                //松手计数器
     KEYS_REC = 0xF0 ;            //让连接键盘的高4位为1 ,低4位为0
                            
     if(KEYS_REC != 0xF0)       //初次检查到按下     {
         delay(5);               //消抖延时
        if(KEYS_REC != 0xF0)  //真的被按下了        {        
            switch(KEYS_REC)
            {    
                case  0X70: row =1 ;break;        // 0111 0000 
                case  0XB0: row = 2; break;       //  1011 0000    
                case  0XD0: row = 3;break;       //  1101 0000
                case  0XE0: row = 4;break;      //   1110 0000
                default:break;
            }

            KEYS_REC = 0x0F;                  //电平反转,检测列
            switch(KEYS_REC)
            {    
                case  0X07: col = 1;break;         //0000 0111
                case  0X0B: col = 2; break;         //0000 1011
                case  0X0D: col = 3;break;         //0000 1101
                case  0X0E: col = 4;break;         //0000 1110    
                default:break;
            }            while((c--) && (KEYS_REC!=0x0F))     //等待按键松手            {
                delay(5);
                
            }            return (row-1)*4+col;      //使用4X4的键盘
        } //真的按下了
        else 
            return -1;
     }     return -1;
}void delay(uint t)
{    uint i,j;    for(i=t;i>0;i--)     for(j=123;j>0;j--)
      ;
}


关键字:单片机  独立按键  矩阵按键 引用地址:单片机独立按键与矩阵按键

上一篇:单片机芯片之——图解74HC595
下一篇:Keil工程文件的建立、设置与目标文件的获得

推荐阅读最新更新时间:2024-03-16 15:27

C8051FXXX单片机FLASH程序的自动升级
作者Email: wolfman6353@sina.com 引言: C8051FXXX系列高速SOC单片机是由美国Cygnal公司开发的完全集成的混合信号系统级芯片,具有与8051兼容的微处理器内核,内部集成FLASH程序存储器,具有在系统重新编程能力,以C8051F020为例,内部集成64K的FLASH程序存储器。在系统控制软件的开发调试阶段,可用集成开发环境来下载及测试系统,但当将C8051F020目标系统集成到产品后,则由于操作系统及软硬件接口不一样等等原因,不能在最终产品中用集成开发环境来下载FLASH程序,故产品到了用户处之后,如要再进行FLASH程序的更新,则必须更换相应的集成电路印刷板,造成很多麻烦及不可靠因素。
[嵌入式]
恩智浦交付基于CortexTM-M3的微控制器
恩智浦半导体(NXP Semiconductors)近日确认,根据嵌入式微处理器基准协会(EEMBC)的测试结果,LPC1700系列为业界性能最高的Cortex-M3微控制器。EEMBC测试结果显示,以相同时钟速度运行时,LPC1700执行应用程序代码的速度比其它主要Cortex-M3竞争产品平均快35%。当LPC1700以较高时钟速度运行时,恩智浦的性能优势愈加显著。LPC1700已通过EEMBC 72,100和120 MHz认证。速度和效能的提高主要归功于该微控制器的智能架构、灵活的直接存储访问(DMA)和市场最佳闪存的使用。LPC1700系列旨在同时操作以太网、USB On-The-Go/Host/Device和CAN
[嵌入式]
51单片机~继电器,续流二极管相关原理
继电器: 继电器上标识:AC表示交流电,最下面一行05V是5V额定电压。下面的30VDC表示直流电压30V。 继电器电路图接:如下图中间部分; (1) 4,5口是D,E; (2)2常开,3常闭; (3)1,3组成闭合,1和2组成开启; 使用衔铁的原因:衔铁不会被磁化。 续流二极管: 》工作原理:(用感应电动势相关知识理解)所以续流二极管需要在电路截至后迅速打开。
[单片机]
51<font color='red'>单片机</font>~继电器,续流二极管相关原理
51单片机串口程序C语言版
这篇文章主要来介绍一下51单片机的串口,下面先来看一下与串口相关的寄存器。 图1 (该图来自51单片机技术文档) 下面来逐个介绍个寄存器。 SCON寄存器的SM1,SM2主要用来设置串行口的工作方式,具体对应关系见图2,REN:串行口接受使能位,当单片机要接受数据时该位应该置一,TB8:发送数据的第九位。在方式2或者方式3中TB8为发送的第九位数据。该位不是很常用,具体介绍请查看51单片机的技术文档,这里不多做介绍。TI:发送中断标志,由硬件在方式0串行发送第8位结束时置位,或在其它方式串行发送停止位的开始时置位,必须由软件清零。RI:接受中断标志,由硬件由硬件
[单片机]
51<font color='red'>单片机</font>串口程序C语言版
STM8单片机串口发送引脚和接收引脚分开使用
在使用STM8S003单片机时,需要用到ADC采样功能,STM8S003总共有5个ADC采样口,但是其中两个采样口是和串口复用的,如果当ADC口用,就不能用串口,如果当串口用,就不能用ADC口。 通过芯片管脚的原理图可以看到PD5口可以当作模拟采样第5通道使用,也可以用当做串口发送口使用。PD6口可以当做模拟采样第6通道使用,也可以当做串口接收口使用。 在项目中需要将串口当做AD口使用,但是也需要串口向外发送监控数据。AD功能和串口功能需要同时使用,于是想到,串口只用到了发送引脚,那么能不能将串口的接收引脚当做AD功能用。这样PD5口作为串口发送引脚使用,PD6口作为模拟采样第6通道使用。 先写一个简单的测试程序测试一
[单片机]
STM8<font color='red'>单片机</font>串口发送引脚和接收引脚分开使用
STM8S105系列单片机的PWM输出配置
STM8S105xx的定时器资源: (1)2个16位通用定时器(TIM2、TIM3),带有2+3个CAPCOM通道(IC、OC或PWM); (2)高级控制定时器(TIM1):16位,4个CAPCOM通道(捕获/比较通道),3个互补输出,死区插入和灵活的同步; (3)带有8位预分频器的8位基本定时器(TIM4); (4)自动唤醒定时器; (5)2个看门狗定时器:窗口看门狗和独立看门狗。 使用高级控制定时器和普通通用定时器的PWM输出功能在初始化配置上有差异,下面做简单分析: TIM1——16位高级控制定时器 带有16位预分频的16位递增、递减和双向自动重装载计数器 TIM2、TIM3——16位通
[单片机]
STM8S105系列<font color='red'>单片机</font>的PWM输出配置
单片机---ESP8266Wifi SmartConfig一键配置(一)
SmartConfig 现在我们在购买很多智能设备的时候,需要让它联网,但它没有什么有效的输入手段,例如键盘屏幕啥的,于是就出现了所谓的一键联网,通过APP,将wifi名称和密码发送出来,走的是一种广播或者组播的手段,智能设备上电处于混杂模式,能够接收到这些数据,随后就可以联网了。 就是所谓的,通讯,基本靠喊。 ESP8266一键联网 准备代码 搭建环境什么的可以参考 然后就可以下载到最新的版本,里面就包含了一键联网的demo程序。 配置好工作路径,编译代码,就可以烧写进ESP8266开发板了。上电进入smartconfig模式 官网的教程无比详细,就喜欢这种产品 APP准备 乐鑫提供了安卓版本的配置工具,
[单片机]
<font color='red'>单片机</font>---ESP8266Wifi SmartConfig一键配置(一)
基于森国科MCU SPIN的落地扇和循环扇应用方案
本期内容重点介绍,针对三相低压风扇电机驱动,森国科SGK32G031芯片可提供的一款高性价比解决方案,加速实现低功耗、轻量化、节能化的落地扇&循环扇应用。 森国科MCU SPIN(SGK32G031)芯片 高性能 高可靠性 芯片采用32-bit Arm Cortex-M0内核,主频60MHZ,内置USART ,集成业内领先的高采样率的高速12bit ADC ,集成2个高速 模拟 比较器 ,2个OPA 运算放大器 , 硬件 除法器; 芯片针对电机应用进行了多项设计优化,具备了高精准高可靠 时钟 系统、可支持移相的 TI MER、以及-40℃~105℃增强 工业 级工作温度范围等多项高可靠性优势。 小尺寸、多应用 芯片采用Q
[嵌入式]
基于森国科<font color='red'>MCU</font> SPIN的落地扇和循环扇应用方案
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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