51单片机 按键,键盘检测

发布者:快乐兔子最新更新时间:2017-01-08 来源: eefocus关键字:51单片机  按键  键盘检测 手机看文章 扫描二维码
随时随地手机看文章

但凡做和51单片机有关的东西,我们组都会用到按键..... 迷之有缘

独立按键的原理很简单,没有按键按下时,全部为高电平,按下时接触地变为地电平,检测是否有低电平来检测按下动作。

矩阵键盘稍微复杂一点,分别检测行,检测列,以此来确定按键位置。

注意的是,按下时会有抖动,因为写程序时,需要消抖。常用的方式是延时函数消抖。


 1 /*        

 2             独立按键扫描基本程序 @L2  2016/08/03 

 3                                                     */

 4 #include

 5 #define GPIO_KEY P1   //按键与P1口相连

 6 void Delay10ms(unsigned int c);

 7 unsigned char Key_Scan();

 8 

 9 void main(void)

10 {

11     unsigned char keyNum;

12     while (1)

13     {    

14         keyNum = Key_Scan();  //扫描键盘

15 

16         switch (keyNum)

17         {

18             case(0xFE) :      //返回按键K1的数据                

19                 break;

20             case(0xFD) :      //返回按键K2的数据                

21                 break;

22             case(0xFB) :      //返回按键K3的数据            

23                 break;

24             case(0xF7) :      //返回按键K4的数据

25                 break;

26             case(0xEF) :      //返回按键K5的数据

27                 break;

28             case(0xDF) :      //返回按键K6的数据

29                 break;

30             case(0xBF) :      //返回按键K7的数据

31                 break;

32             case(0x7F) :      //返回按键K8的数据

33                 break;

34             default:

35                 break;

36         }

37 

38 

39     }                

40 }

41 

42 

43 unsigned char Key_Scan()

44 {

45     unsigned char keyValue = 0 , i; //保存键值

46 

47     //--检测按键--//

48     if (GPIO_KEY != 0xFF)        //检测按键是否按下          若只连接P10~P13四个按键,则改为(GPIO_KEY | 0xF0)!= 0xFF;等等

49     {

50         Delay10ms(1);    //消除抖动

51 

52         if (GPIO_KEY != 0xFF)    //再次检测按键是否按下

53         {

54             keyValue = GPIO_KEY;

55             i = 0;

56             while ((i<50) && (GPIO_KEY != 0xFF))     //检测按键是否松开

57             {

58                 Delay10ms(1);

59                 i++;

60             }

61         }

62     }

63 

64     return keyValue; 

65 }

66 

67 

68 

69 void Delay10ms(unsigned int c) 

70 {

71     unsigned char a, b;

72     for (;c>0;c--)

73     {

74         for (b=38;b>0;b--)

75         {

76             for (a=130;a>0;a--);

77         }

78            

79     }       

80 }


检测原理类似,检测该按键对应IO口是否为低电平

 1 /*

 2           矩阵键盘4X4,数码管显示键值  @L2 2016/08/03

 3                                                             */    

 4 #include

 5 #define GPIO_DIG P1        

 6 #define GPIO_KEY P0

 7 

 8 unsigned char code DIG_CODE[17]={

 9 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

10 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

11 

12 unsigned char KeyValue;

13 void Delay10ms(unsigned int c);

14 void KeyDown();    

15 

16 void main(void)

17 {

18     while(1)

19     {

20         KeyDown();

21         GPIO_DIG = ~DIG_CODE[KeyValue];

22     }                

23 }

24 

25 void KeyDown(void)

26 {

27     char a = 0;

28     GPIO_KEY=0x0f;        // XXXX XXXX 四行四列

29     if(GPIO_KEY!=0x0f)  //读取按键是否按下

30     {

31         Delay10ms(1);  //消抖

32         if(GPIO_KEY!=0x0f)//再次检测键盘是否按下

33         {

34             

35             //测试行

36             GPIO_KEY=0XF0;

37             switch(GPIO_KEY)

38             {

39                 case(0X70):    KeyValue=0;break;           //0111 第一列有按下

40                 case(0XB0):    KeyValue=4;break;           //1011 第二列有按下

41                 case(0XD0):   KeyValue=8;break;           //1101 第三列有按下

42                 case(0XE0):    KeyValue=12;break;           //1110 第四列有按下

43             }

44             //测试行

45             GPIO_KEY=0X0F;         //给列IO口置低电平

46             switch(GPIO_KEY)

47             {

48                 case(0X07):    KeyValue=KeyValue;break;        // 0111 第一行有按下

49                 case(0X0B):    KeyValue=KeyValue+1;break;      // 1011 第二行有按下

50                 case(0X0D):   KeyValue=KeyValue+2;break;      // 1101 第三行有按下

51                 case(0X0E):    KeyValue=KeyValue+3;break;      // 1110 第四行有按下

52             }

53             while((a<50) && (GPIO_KEY!=0xf0))     //检测按键松手检测

54             {

55                 Delay10ms(1);

56                 a++;

57             }

58         }

59     }

60 }

61 

62 

63 void Delay10ms(unsigned int c)  

64 {

65     unsigned char a, b;

66     for (;c>0;c--)

67     {

68         for (b=38;b>0;b--)

69         {

70             for (a=130;a>0;a--);

71         }          

72     }       

73 }


关键字:51单片机  按键  键盘检测 引用地址:51单片机 按键,键盘检测

上一篇:51单片机 蜂鸣器
下一篇:51单片机 数码管的显示与译码器

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

51单片机的精确延时程序一
51单片机的精确延时程序分析(C语言和汇编语言程序) 一、C51程序 在晶振为11.0592的情况下,如下程序能实现ms级的比较精确的延时: 1 void Delayms(unsigned int n) 2 { 3 unsigned int i,j; 4 for(j=n;j 0;j--) 5 for(i=112;i 0;i--); 6 } 用keil可以看出这个延时的时间,我们先延时1ms,即Delayms(1)。 进入Delayms前,sec=0.00042209s 延时后,sec=0.00142253s 可以知道Delayms(1)实际延时
[单片机]
GPIO输入----检测按键(EasyARM2131)
/****************************************Copyright (c)***************************** **--------------File Info---------------------------------------------------------- ** File name: main.c ** Last modified Date: 2011-04-09 ** Last Version: 1.0 ** Descriptions: The main() function example template ** **----------------
[单片机]
51单片机驱动点阵16*16左移
这个点阵左移,曾经让我......如今在朋友指导下.........主要部分在红色部分,请大家理解那里就行了!会了也没有什么!硬件:行采用74HC154+S8550,列采用74HC595! #include reg52.h #define uchar unsigned char #define uint unsigned int #define LINE P0//定义行线IO口,即74HC154控制端 #define shudu 20//字移动的速度 sbit DATA=P1^4;//74HC595数据端 sbit CLK=P1^5;//74HC595移位脉冲端 sbit CLKR=P1^6;//74HC595数据锁存端 u
[单片机]
<font color='red'>51单片机</font>驱动点阵16*16左移
基于51单片机的智能灯光控制系统设计
一.系统概述 系统使用的模块有AT89C51单片机+LCD1602显示屏+光敏电阻模块+ADC0832+小灯。 本设计采用51单片机为核心控制,使用LCD1602显示采集到的关照强度,光照强度以模拟电压信号的形式进行展现,通过ADC将模拟信号转换为数字电压信号,单片机会根据光强的电压信号值进行判定,如果光强电压值小于设置阈值则小灯就会被点亮。 二.仿真概述 1.通过LCD1602将数模转换后的光照强度电压信号值和阈值进行显示。 2.通过调节电位器来模拟光照强度的变化,光强的变化会在显示屏上表现出来。 3.当 检测 到光照强度低于设定阈值小灯就会亮起。 三.程序设计 使用 Keil 51进行程序设计,打开 Prot
[单片机]
基于<font color='red'>51单片机</font>的智能灯光控制系统设计
基于AT89C51单片机的电池监测系统设计
1、前言 随着锂离子电池的广泛应用,其安全性问题越来越受重视。对锂离子电池的参数进行实时检测可以有效避免电池的不安全使用,并且可以尽量发挥电池的性能。有些应用领域由于条件限制,难于铺设线路,需要对电池进行远距离的监测,比如路灯蓄电池管理;或者由于大量使用,逐个连接监测线路比较麻烦如基站电源管理中电池的状态监测或者大量在通信电台集中的场合等,可通过无线网络对采集的数据进行传输管理。 该系统主要由锂离子电池组状态参数数据采集、信号无线传输、数据处理等几部分组成,系统框图如图1所示。前端由状态参数采集模块和无线发射控制模块组成,其中数据采集部分包括对锂离子电池组的电压、电流、内阻以及温度等参数进行测量,由单片机对采样数据进行初步处理
[单片机]
基于AT89C<font color='red'>51单片机</font>的电池监测系统设计
51单片机定时/计数器的方式控制字
我们已经得知,单片机中的定时/计数器都可以有多种用途,那么我怎样才能让它们工作于我所需要的用途呢?这就要通过定时/计数器的方式控制字来设置。 在单片机中有两个特殊功能寄存器与定时/计数有关,这就是TMOD和TCON。顺便说一下,TMOD和TCON是名称,我们在写程序时就可以直接用这个名称来指定它们,当然也可以直接用它们的地址89H和88H来指定它们(其实用名称也就是直接用地址,汇编软件帮你翻译一下而已)。 从图1中我们可以看出,TMOD被分成两部份,每部份4位。分别用于控制T1和T0,至于这里面是什么意思,我们下面介绍。 从图2中我们可以看出,TCON也被分成两部份,高4位用于定时/计数器,低4位则用于中断(我们暂
[单片机]
<font color='red'>51单片机</font>定时/计数器的方式控制字
从零开始51单片机教程 —— 25 动态扫描显示接口电路及程序
动态扫描显示接口电路及程序 在单片机系统中动态扫描显示接口是单片机中应用最为广泛的一种显示方式之一。其接口电路是把所有显示器的8个笔划段a-h同名端连在一起,而每一个显示器的公共极COM是各自独立地受I/O线控制。CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是那个显示器亮,则取决于COM端,而这一端是由I/O控制的,所以我们就能自行决定何时显示哪一位了。而所谓动态扫描就是指我们采用分时的办法,轮流控制各个显示器的COM端,使各个显示器轮流点亮。 在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,
[单片机]
从零开始<font color='red'>51单片机</font>教程 —— 25 动态扫描显示接口电路及程序
基于80C51单片机的多功能肌电测量仪设计
肌电测量或肌电图是检查人体神经、肌肉系统功能的重要方法,广泛应用于神经科、骨科、耳鼻喉科及口腔科。它可为临床诊断、治疗神经肌肉系统疾患提供客观的科学依据。肌电测量仪一般只具有在示波器上显示波形和记录波形的功能。早期,肌电信号通过照相对胶片进行显影才能看到;后来,把肌电信号描绘在肌电图纸上。这两种肌电信号记录法的机构都很复杂。这里介绍一种利用普通的示波器,通过单片机和A/D、D/A转换控制系统构成的,具有记忆、波形分析(诊断)功能和各种操作的实时处理的低功耗智能肌电测量仪。该肌电测量仪可实现一次采集后,多次重复显示、打印,实现了肌电信号测量仪的智能化 1 多功能肌电测量仪的硬件设计 1.1 系统硬件结构框图 系统硬件结构框图如图
[单片机]
基于80C<font color='red'>51单片机</font>的多功能肌电测量仪设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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