找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4315|回复: 1
打印 上一主题 下一主题
收起左侧

本人常用的4*4独立按键扫描程序,在此分享给大家。利用数码管显示键值

[复制链接]
跳转到指定楼层
楼主
键盘实质上是一组按键开关的集合。通常,键盘开关利用了机械触点的合、断作用。键的闭合与否,反映在行线输出电压上就是呈高电平或低电平,如果高电平表示键断开,低电平则表示键闭合,反之也可。通过对行线电平高低状态的检测,便可确认按键按下与否。为了确保CPU对一次按键动作只确认一次按键有效,还必须消除抖动。

将按键分为行列,CPU通过行列的电平变化,便可确定按键的位置。

如图,我把它设定的键值为:
3   2   1  0
7   6   5  4
b   a   9  8
f   e    b  c

由于用的是仿真软件,数码管中间有一节并没有点亮



单片机源程序如下:
  1. /**************************************************************************************
  2. *                     
  3.                         S1-S4:0-3
  4.                         S5-S8:4-7
  5.                         S9-S12:8-B
  6.                         S13-S16:C-F
  7. :                                                                                                                                                                  
  8. ***************************************************************************************/

  9. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器


  10. #define GPIO_DIG P2         
  11. #define GPIO_KEY P1

  12. sbit LSA=P3^0;
  13. sbit LSB=P3^1;
  14. sbit LSC=P3^2;

  15. unsigned char KeyValue;        //用来存放读取到的键值


  16. unsigned char code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  17.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

  18. /*******************************************************************************
  19. * 函数功能                   : 延时函数,i=1时,大约延时10us
  20. *******************************************************************************/
  21. void delay(unsigned int i)
  22. {
  23.         while(i--);        
  24. }

  25. /*******************************************************************************
  26. * 函 数 名         : KEY_Scan
  27. * 函数功能                   : 检测按键是否按下并读取键值
  28. * 输    入         : 无
  29. * 输    出         : 无
  30. *******************************************************************************/
  31. void KEY_Scan(void)
  32. {
  33.         char a=0;
  34.         GPIO_KEY=0x0f;
  35.         if(GPIO_KEY!=0x0f)//读取按键是否按下
  36.         {
  37.                 delay(1000);//延时10ms进行消抖
  38.                 if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
  39.                 {        
  40.                         //测试列
  41.                         GPIO_KEY=0X0F;
  42.                         switch(GPIO_KEY)
  43.                         {
  44.                                 case(0X07):        KeyValue=0;break;
  45.                                 case(0X0b):        KeyValue=1;break;
  46.                                 case(0X0d): KeyValue=2;break;
  47.                                 case(0X0e):        KeyValue=3;break;
  48.                         }
  49.                         //测试行
  50.                         GPIO_KEY=0XF0;
  51.                         switch(GPIO_KEY)
  52.                         {
  53.                                 case(0X70):        KeyValue=KeyValue;break;
  54.                                 case(0Xb0):        KeyValue=KeyValue+4;break;
  55.                                 case(0Xd0): KeyValue=KeyValue+8;break;
  56.                                 case(0Xe0):        KeyValue=KeyValue+12;break;
  57.                         }
  58.                         while((a<50)&&(GPIO_KEY!=0xf0))         //检测按键松手检测
  59.                         {
  60.                                 delay(1000);
  61.                                 a++;
  62.                         }
  63.                 }
  64.         }
  65. }


  66. /*******************************************************************************
  67. * 函 数 名       : main
  68. * 函数功能                 : 主函数
  69. * 输    入       : 无
  70. * 输    出             : 无
  71. *******************************************************************************/
  72. void main()
  73. {        
  74.         LSA=0; //给一个数码管提供位选
  75.         LSB=0;
  76.         LSC=0;
  77.         while(1)
  78.         {        
  79.                 KEY_Scan();                   //按键判断函数
  80.                 GPIO_DIG=smgduan[KeyValue];          //
  81.         }               
  82. }
复制代码

所有资料51hei提供下载:
按键.rar (39.01 KB, 下载次数: 23)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:155141 发表于 2019-7-7 17:03 | 只看该作者
程序还是有待改进的,浪费黑币
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表