1、删减了《51单片机——独立按键、矩阵按键多种方案1.1》里的一些不怎么用的代码。

2、添加了逐行扫描按键(需要定时器20毫秒配合使用)。

3、支持按键短按、长按、一直按,代码里只做了短按处理,如要处理长按和一直按只需添加相应的代码即可。

4、按键处理我只点亮led灯了,需要其它功能自行添加即可。

5、最大优化我觉得是没有一个delay延迟。

备注:按键处理及按键扫描放入定时器中断里即可。

#ifndef __KEY2_H__
#define __KEY2_H__extern void key_hang(void);//按键行扫描,需要配合定时器
extern void key_process(void);//处理按键对应的结果#endif //!__KEY2_H__
#include "REG52.H"
#include "led.h"
#define hang P3//矩阵按键真值表4行*4列判断是哪个按键被按下
static unsigned char code key_true[4][4] = {1, 2,  3,  4,5,  6,  7,  8,9,  10, 11, 12,13, 14,  15, 16
};void key_hang(void)//按键行扫描,建议20毫秒扫一下
{static unsigned char i = 0;i++;switch (i)//共计4行,低电平扫描{case 1:hang = 0xfe;break;case 2:hang = 0xfd;break;case 3:hang = 0xfb;break;case 4:hang = 0xf7;i = 0;break;default:hang = 0xff;i = 0;break;}
}static unsigned char key16_3(void)//每隔10毫秒30毫秒50毫秒.....进来一次
{static unsigned char key_time = 9;//按键次数或时间初值为9static unsigned char hang_true =0;static unsigned char lie_true = 0;//if (Time_20ms == 1)//如果20ms时间到的话就开始判断是否有按键按下//{if ((hang & 0xf0) != 0xf0)//如果有按键按下{hang_true = hang & 0x0f;//计算4行的当前值lie_true = hang & 0xf0;//计算4列的当前值key_time++;//当有按键被按下,key_time++一次时间就加20毫秒,第一次++的时候时间记为0毫秒if (key_time < 5)   --key_time;//避免数据加的太多溢出,防止用户一直按if (key_time > 150)//表示长按且大于3000毫秒{//如果有按键按了3秒以上,在这里先不处理这么久的key_time = 9;//恢复初始值return 0;}return 0;}else//判断一下当前按键值是否为短按if (10 < key_time < 150)//表示短按且时间大于100毫秒小于3秒{switch (hang_true){case 0x0e:hang_true = 0;break;case 0x0d:hang_true = 1;break;case 0x0b:hang_true = 2;break;case 0x07:hang_true = 3;break;default:break;}switch (lie_true){case 0xe0:lie_true = 0;break;case 0xd0:lie_true = 1;break;case 0xb0:lie_true = 2;break;case 0x70:lie_true = 3;break;default:break;}key_time = 9;//恢复初始值,好进行下次按键判断return key_true[hang_true][lie_true];}return 0;//}//return 0;
}
void key_process(void)//处理按键对应的方法
{switch (key16_3()){case 0:     break;//默认没有按键按下将会返回0case 1:        LED_Admin_EN(0x7f);break;//led灯从左到右亮case 2:     LED_Admin_EN(0xbf);break;case 3:        LED_Admin_EN(0xdf);break;case 4:        LED_Admin_EN(0xef);break;case 5:        LED_Admin_EN(0xf7);break;case 6:        LED_Admin_EN(0xfb);break;case 7:        LED_Admin_EN(0xfd);break;case 8:        LED_Admin_EN(0xfe);break;//led灯从左到右亮case 9:     LED_Admin_EN(0xfe);break;//led灯从右到左亮case 10:    LED_Admin_EN(0xfd);break;case 11:   LED_Admin_EN(0xfb);break;case 12:   LED_Admin_EN(0xf7);break;case 13:   LED_Admin_EN(0xef);break;case 14:   LED_Admin_EN(0xdf);break;case 15:   LED_Admin_EN(0xbf);break;case 16:   LED_Admin_EN(0x7f);break;//led灯从右到左亮default:break;}
}

51单片机——矩阵按键逐行扫描短按长按一直按方案1.2相关推荐

  1. 自学51单片机 - 矩阵按键实验

    自学51单片机 - 矩阵按键实验 1.开发板原理图 2.程序 2.1 行列式扫描法 2.2 线翻转扫描法 3.结果 1.开发板原理图 2.程序 2.1 行列式扫描法 /**************** ...

  2. 51单片机矩阵按键详解,两位数码管显示(普中HC6800ESV2.0)

    一.简述 本人是一名在校生,这个学期刚好在学单片机,自己也挺有兴趣,前面在写数码管.时钟啥的程序时都没什么大问题,但是做到矩阵按键时碰到了一些问题,不过已经解决,下面我会把碰到的问题和解决方法都写出来 ...

  3. 51单片机 | 矩阵按键实验

    文章目录 一.矩阵按键介绍 二.硬件设计 三.软件设计 四.实验现象   开发板上板载了一个 4*4 矩阵键盘.本节所要实现的功能是:通过开发板上的矩阵键盘控制静态数码管显示对应的键值 0-F. 一. ...

  4. 51单片机-独立按键控制LED

    1.   51单片机独立按键的位置: 独立按键的定义:独立按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开: 在整个51开发板的左下 ...

  5. 用51单片机实现按键控制LED灯亮灭

    用51单片机实现按键控制LED灯亮灭 #include<reg51.h>//头文件 sbit LED=P2^0;//位定义LED灯 sbit k1=P3^1;//位定义按键 void de ...

  6. 51单片机独立按键和矩阵按键实现

    这里写目录标题 独立按键实验 矩阵按键实验 独立按键实验 按键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时, 开关断开.我们开发板上使用的按键及内部简易图如下图所示 管脚与管脚之间( ...

  7. 51单片机之按键(独立按键矩阵按键)

    难的东西学不会是因为简单的知识没学好 基础不牢,地动山摇 按键 1.1基础温习 (1)按键的物理结构 (2)单片机引脚有两种状态(I/O)输入[读]或者输出[写] (3)上拉电阻的作用.通过这个电阻把 ...

  8. 51单片机-独立按键,矩阵按键,点阵

    独立按键:实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开. "1,2"和"3,4"管脚之间距离短,初始不导通,"1,3"和&q ...

  9. 51单片机 | 独立按键实验

    文章目录 一.按键介绍 二.硬件设计 三.软件设计 四.实验现象   开发板上板载 4 个独立按键.通过开发板上的独立按键 K1 控制 D1 指示灯亮灭.通过独立按键实验来介绍 IO 口作为输入的使用 ...

最新文章

  1. 1049 Counting Ones
  2. PHP安全、Sql防注入安全汇总
  3. Tomcat中容器的pipeline机制
  4. RGB和RGBQUAD的区别
  5. JS正则验证邮箱的格式
  6. SQL 查询笔记:子查询,分组查询,左连接查询。。。。。
  7. 【Linux】监视CPU、GPU使用情况
  8. Spring Cloud Config服务器
  9. vue+vuex初入门
  10. VS2017 ReportViewer报表控件及设计器安装方法
  11. 上海车牌拍卖突破7.5万元
  12. 元素JavaScript知识点梳理与经典百例
  13. .mp4视频测试地址
  14. # simulink高级应用-matlab function中查看变量
  15. 2022年R2移动式压力容器充装考试模拟100题及在线模拟考试
  16. 微信支付接口加密技术详解
  17. 如何把苹果卖出高价?
  18. oldwain随便写
  19. shell: mysql删除183天前的table(保留半年的log数据)
  20. 赋能新零售,Stratifyd亮相Smart Retail智慧零售年度峰会

热门文章

  1. 网易视频云: 网易平台级视频服务存储技术
  2. 水滴筹赴美上市:以“善良”为名的生意经
  3. C# Newtonsoft.Json
  4. 《倔强萝卜》让人捧腹大笑 票房黑马崛起后劲十足
  5. 万众瞩目!ICF5国产开源飞控推出,为国内无人系统发力
  6. 在 EXCEL 中,“插入已剪切单元格”的快捷键
  7. vue3不在手动引入import {ref} from ‘vue‘ 等 也能照样运行项目
  8. fputc函数重写实现printf重定向
  9. 如何打破自恋幻觉 武志红
  10. 20181103 Nginx(布尔教育)