单片机之按键学习

发布者:EtherealLight最新更新时间:2016-11-23 来源: eefocus关键字:单片机  按键学习 手机看文章 扫描二维码
随时随地手机看文章

键盘的分类:

       键盘分编码键盘和非编码键盘。

       键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘;

而靠软件编程来识别的称为非编码键盘。
      在单片机组成的各种系统中,用的最多的是非编码键盘。也有用到编码键盘的。

        非编码键盘有分为:独立键盘和行列式(又称为矩阵式)键盘。

 

本文主要讨论矩阵键盘(独立键盘比较简单可以与此类比),下面是矩阵键盘的电路连接图。

图片

 

按键的扫描,主要是对每一个按键所编码的识别与确定。
如上图:按键所接口为P2口,置“0”则按键有效。当P2口检测到值为P2=0x7e时,S1有效。

低四位用来确定行按键,高四行用来确定列按键。

 

基本的编程思想是:

        先设定P2口为0xfe,确定第一行按键有效,然后将P2口的值与0xf0按位与(&),然后检测P2口的值是否为0xf0,

这样就屏蔽了低四位的电位改变(因为无论之后低四位怎样变化,低四位与0相与总是0)。

然后如果P2口得值不为0xf0时,则证明高四位有电位改变。则检测此时的P2口得值,就可以确定是哪个按键被按下了。

如按键S1,它编码是P2=0x7e,也就是当P2口检测到值为P2=0x7e时,S1有效。

 

需要注意的是:

        按键按下时有一个前后抖动时间,如下图(a)所示。

图片

 

        如果单片机检测到的是抖动部分,则无法按键判断是否有效,所以我们需要加入防抖程序。

注:也可以通过硬件防抖,如上图(b)。

 

===========================================================================================

/****************************************** 
         功能:矩阵键盘 

        (按相应的按键,数码管从0~F的显示)

单片机:AT89S52                                                 
    ******************************************/ 
#include  
#define uint unsigned int  
#define uchar unsigned char  
sbit DAT=P0^3;
sbit CLK=P0^2; 
uchar temp,h;             
void delay(uint);            //延迟程序
void sendbyte(uchar);  //数码管显示
void keyscan();            //按键扫描

uchar code tab[]={
      0xed,0x09,0xbc,0x9d,0x59,0xd5,
      0xf5,0x0d,0xfd,0xdd,0x7d,0xf1,
      0xe4,0xb9,0xf4,0x74,0x00} ; //0-F, 全灭

void main (void) 

   sendbyte(16);            //初始时数码管无显示        
   while(1)
   {  

        keyscan();            //按键扫描
   }
}

void delay(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=100;y>0;y--); 
}
 
void sendbyte(uchar byte)
{            
 uchar num,c;         
 num=tab[byte]; 
 for(c=0;c<8;c++)         
 {     
  CLK=0;   
  DAT=num&0x01;   
  CLK=1;          
  num>>=1; //右移位赋值                         
 }
}

void keyscan()
{

   /*第一行按键的扫描*/


   P2=0xfe;                   //确定第一行的按键有效
   temp=P2;                  //将其赋给一个变量(处理I/O口时,一般先赋值给一个变量,然后通过处理变量来处理I/O口)
   temp=temp&0xf0;      //用于检测第一行的哪个按键按下
   while(temp!=0xf0)      /*这个部分只要是用来消除按下抖动的*/
    {
     delay(5);
     temp=P2;
     temp=temp&0xf0;
     while(temp!=0xf0)     //这个地方,已经消除了按下抖动,P2口的值已经确定
     {
      temp=P2;                 //将P2口得值赋给变量
      switch(temp)           //这个switch语句,用来确定哪一个按键按下时,数码管的显示值
      {
       case 0x7e:h=0;
                 break;          //这个break很重要,表示如果有匹配的值,就跳出switch语句,防止程序跳不出来。
       case 0xbe:h=1;
                 break;
       case 0xde:h=2;
                 break;
       case 0xee:h=3;
                 break;
       default : h=16;
           break;
      }

     while(temp!=0xf0)             /*这个部分只要是用来消除释放抖动的*/
      {
       temp=P2;
       temp=temp&0xf0;
      }
     sendbyte(h);                    //送给数码管显示
     }
    }


   /*第二行按键的扫描*/
   
     P2=0xfd;
   temp=P2;
   temp=temp&0xf0;
   while(temp!=0xf0)
    {
     delay(5);
     temp=P2;
     temp=temp&0xf0;
     while(temp!=0xf0)
     {
      temp=P2;
      switch(temp)
      {
       case 0x7d:h=4;
                 break;
       case 0xbd:h=5;
                 break;
       case 0xdd:h=6;
                 break;
       case 0xed:h=7;
                 break;
       default : h=16;
           break;
      }    

     while(temp!=0xf0)
      {
       temp=P2;
       temp=temp&0xf0;
      }
     sendbyte(h);
     }
    }  

 

/*第三行按键的扫描*/

 

  P2=0xfb;
   temp=P2;
   temp=temp&0xf0;
   while(temp!=0xf0)
    {
     delay(5);
     temp=P2;
     temp=temp&0xf0;
     while(temp!=0xf0)
     {
      temp=P2;
      switch(temp)
      {
       case 0x7b:h=8;
                 break;
       case 0xbb:h=9;
                 break;
       case 0xdb:h=10;
                 break;
       case 0xeb:h=11;
                 break;
       default : h=16;
           break;
      }    

     while(temp!=0xf0)
      {
       temp=P2;
       temp=temp&0xf0;
      }
     sendbyte(h);
     }
    }  

 

/*第四行按键的扫描*/

 

  P2=0xf7;
   temp=P2;
   temp=temp&0xf0;
   while(temp!=0xf0)
    {
     delay(5);
     temp=P2;
     temp=temp&0xf0;
     while(temp!=0xf0)
     {
      temp=P2;
      switch(temp)
      {
       case 0x77:h=12;
                 break;
       case 0xb7:h=13;
                 break;
       case 0xd7:h=14;
                 break;
       case 0xe7:h=15;
                 break;
       default : h=16;
           break;
      }

     while(temp!=0xf0)
      {
       temp=P2;
       temp=temp&0xf0;
      }
     sendbyte(h);
     }
    }  
}


关键字:单片机  按键学习 引用地址:单片机之按键学习

上一篇:C51外中断程序
下一篇:一个非常不错的串口程序

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

Atmel单片机并口下载线制作
很多单片机初学者都是选择STC单片机来学习51单片机,原因是STC单片机的程序下载是通过串口下载的,下载电路简单,只需一根DB9针串口线、一片MAX232芯片和四个1uf的电容即可。但是高等院校的教材几乎都是以AT89C51/52单片机(已经停产)或者AT89S51/52单片机(AT89C51/52的替代品)和其DATASHEET作为教学内容。以前,笔者为了学习AT89S8253单片机曾购买了一个昂贵的通用编程器,回想起来很不划算。为了让您理论联系实际学习单片机,降低学习成本,笔者在此与大家交流Atmel单片机下载线的制作。 图1是Atmel官方并口下载线电路原理图的改进版(简化了官方下载线的电压检测电路,增加了电源滤波和电源指
[单片机]
Atmel<font color='red'>单片机</font>并口下载线制作
单片机关键技术基础详解(一)
单片机被广泛应用于工业控制,家电,消费电子,医疗电子,仪表测量等领域,为应广大初级电子工程师/单片机爱好者之需,电子发烧友隆重策划整合推出《单片机关键技术基础详解》系列技术文章,以后会陆续推出其他章节,敬请广大工程师朋友继续关注和留意。  一、关于C51单片机的中断号以及中断向量   1、中断号      2、interrupt 和 using 在C51中断中的使用   8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的
[单片机]
<font color='red'>单片机</font>关键技术基础详解(一)
国民技术汇聚11大主题与2款新品添彩ELEXCON 2022
国民技术汇聚11大主题与2款新品添彩ELEXCON 2022 2022年11月6日至8日,年度行业盛会“ELEXCON 深圳国际电子展暨嵌入式系统展”在深圳会展中心(福田)盛大举行, 国产32位MCU和安全芯片的创新引领者国民技术携带通用MCU、安全芯片、无线射频等最新产品技术和解决方案参加展会,以11个主题展区共100余件全明星展品阵容精彩亮相,新品车规级MCU N32A455以及新一代物联网安全芯片N32S003产品应用全面展示与推介 ,并在展会同期举办的两个线下技术论坛和一场新能源媒体直播活动中分享了国民技术“通用+安全”产品最新技术布局和成功应用案例。 在11月6日的“十四届MCU技术创新与应用大会”论坛上,
[单片机]
国民技术汇聚11大主题与2款新品添彩ELEXCON 2022
单片机控制花样流水灯原理图及程序
  AT89C51单片机流水灯c语言程序   1、首先先在proteus画出仿真图,方便仿真程序   2、下面来编写程序,先来写入头函数   3、根据自己在proteus画的图,定义一下管脚根据你的原理图进行编写   sbit p0=P1^0;   sbit p1=P1^1;   sbit p2=P1^2;   sbit p3=P1^3;   sbit p4=P1^4;   sbit p5=P1^5;   sbit p6=P1^6;   sbit p7=P1^7;   4、然后写一个延时函数,来调节流水灯的时间间隔延时时间自己定义   void mdelay(unsigned int t)   {   unsigned cha
[单片机]
<font color='red'>单片机</font>控制花样流水灯原理图及程序
51单片机门铃电路原理图及C语言源程序
当按下开关SP1,AT89S51单片机产生“叮咚”声从P1.0端口输出到LM386,经过放大之后送入喇叭。 电路原理图 系统板上硬件连线 (1. 把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上; (2. 在“音频放大模块”区域中的SPK OUT端口上接上一个8欧或者是16欧的喇叭; (3. 把“单片机系统”区域中的P3.7/RD端口用导线连接到“独立式键盘”区域中的SP1端口上; 程序设计方法 (1. 我们用单片机实定时/计数器T0来产生700HZ和500HZ的频率,根据定时/计数器T0,我们取定时250us,因此,700HZ的频率要经过3次250us的定时,而500HZ的频率要经过4
[单片机]
51<font color='red'>单片机</font>门铃电路原理图及C语言源程序
德州仪器最新MCU实现革命性性能突破
2008 年 6 月 11 日,德州仪器 (TI) 宣布推出实现了革命性突破的超低功耗 MSP430 MCU 系列产品,该 系列能够针对峰值高达 25 MHz 的产品实现业界最低的功耗,并拥有更高的闪存与 RAM 存储容量,以及诸如射频 (RF)、USB、加密和 LCD 接口等集成外设。MSP430F5xx MCU 的工作功耗与待机功耗分别仅为 160 µA/MHz(每兆赫微安)与 1.5µA,可为便携式应用实现超长的电池使用寿命以及采用超小型电池,甚至根本不使用电池,非常适用于采用太阳能、振动或人体温度等能量收集系统。 TI 的客户AdaptivEnergy ,其首席执行官 Jim Vogeley 指出,该公司推
[单片机]
51单片机精确延迟程序
51单片机精确延时程序(晶振12MHz,一个机器周期1us.) 几个精确延时程序:在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响. 一. 500ms延时子程序:(晶振12MHz,一个机器周期1us.)   void delay500ms(void)   {   unsigned char i,j,k;   for(i=15;i 0;i--)   for(j=202;j 0;j--)   for(k=81;k 0;k--);   }   计算分析:   程序共有三层循环   一层循环n:R5*2 = 81*2 = 162us DJNZ 2us   二层循环m:R6
[单片机]
基于80C51单片机和AD526运放实现防腐电源监控节点的设计
金属发生腐蚀的现象随处可见。腐蚀给金属材料造成的直接和间接损失是巨大的,以至造成灾难性的破坏事故,引起严重的环境污染。研究表明,因腐蚀造成的损失一般占国民生产总值的3%~4%,其中约有15%是可以通过现有的防腐技术避免的,而阴极保护技术的发展又是与防腐技术的进步分不开的。 防腐电源是阴极保护技术中最为关键的设备。由于易腐蚀的金属构件大部分分布在野外或者地下,并且分布范围广,如石油管道、输电线路、海上平台等,所以必然要求发展可靠性高、智能化的新型防腐电源,并且要求通过工业网远程采集现场数据,进行计算分析,实现远程控制,从而提高现场设备的可靠性,实现无人管理。 1、防腐电源系统的结构组成 阴极保护技术简单地说就是测量被保护金属
[单片机]
基于80C51<font color='red'>单片机</font>和AD526运放实现防腐电源监控节点的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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