热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

51单片机—矩阵键盘代码

#include#include..delaydelay.h#includematrix.h*按键扫描函

#include #include "../delay/delay.h"
#include "matrix.h"
/*=====================================================
按键扫描函数,返回扫描键值
======================================================*/
unsigned char key_scan(void)
{
unsigned char keyvalue; KEYPORT = 0xf0; //高四位置高,低四位拉低
if(0xf0 != keyvalue)
{
delay_ms(10); //去抖
if(0xf0 != keyvalue) //有按键按下
{
KEYPORT = 0xfe; //检测第一行
if(0xfe != KEYPORT)
{
keyvalue = KEYPORT;
keyvalue &= 0xf0; //过滤干扰
keyvalue += 0x0e; //过滤干扰
while(0xfe != KEYPORT);
delay_ms(10); //去抖
while(0xfe != KEYPORT);
return keyvalue;
}
KEYPORT = 0xfd; //检测第二行
if(0xfd != KEYPORT)
{
keyvalue = KEYPORT;
keyvalue &= 0xf0; //过滤干扰
keyvalue += 0x0d; //过滤干扰
while(0xfd != KEYPORT);
delay_ms(10); //去抖
while(0xfd != KEYPORT);
return keyvalue;
}

KEYPORT = 0xfb; //检测第三行
if(0xfb != KEYPORT)
{
keyvalue = KEYPORT;
keyvalue &= 0xf0; //过滤干扰
keyvalue += 0x0b; //过滤干扰
while(0xfb != KEYPORT);
delay_ms(10); //去抖
while(0xfb != KEYPORT);
return keyvalue;
}
KEYPORT = 0xf7; //检测第四行
if(0xf7 != KEYPORT)
{
keyvalue = KEYPORT;
keyvalue &= 0xf0; //过滤干扰
keyvalue += 0x07; //过滤干扰
while(0xf7 != KEYPORT);
delay_ms(10); //去抖
while(0xf7 != KEYPORT);
return keyvalue;
}
}
}
return 0xff;
}
/*=====================================================
按键值处理函数,返回扫描键值
======================================================*/
unsigned char key_pro(void)
{
unsigned char keynum;
keynum = key_scan();

/*按下相应的键显示相对应的码值*/
switch(keynum)
{
case 0x7e:
{
return 0; //0
break;
}
case 0xbe:
{
return 1; //1
break;
}
case 0xde:
{
return 2; //2
break;
}
case 0xee:
{
return 3; //3
break;
}
case 0x7d:
{
return 4; //4
break;
}
case 0xbd:
{
return 5; //5
break;
}
case 0xdd:
{
return 6; //6
break;
}
case 0xed:
{
return 7; //7
break;
}
case 0x7b:
{
return 8; //8
break;
}
case 0xbb:
{
return 9; //9
break;
}
case 0xdb:
{
return 10; //10
break;
}
case 0xeb:
{
return 11; //11
break;
}
case 0x77:
{
return 12; //12
break;
}
case 0xb7:
{
return 13; //13
break;
}

case 0xd7:
{
return 14; //14
break;
}

case 0xe7:
{
return 15; //15
break;
}
default:
{
return 0xff;
break;
}
}
}

推荐阅读
  • Gradle 是 Android Studio 中默认的构建工具,了解其基本配置对于开发效率的提升至关重要。本文将详细介绍如何在 Gradle 中定义和使用共享变量,以确保项目的一致性和可维护性。 ... [详细]
  • 【MySQL】frm文件解析
    官网说明:http:dev.mysql.comdocinternalsenfrm-file-format.htmlfrm是MySQL表结构定义文件,通常frm文件是不会损坏的,但是如果 ... [详细]
  • 本文探讨了互联网服务提供商(ISP)如何可能篡改或插入用户请求的数据流,并提供了有效的技术手段来防止此类劫持行为,确保网络环境的安全与纯净。 ... [详细]
  • Excel技巧:单元格中显示公式而非结果的解决方法
    本文探讨了在Excel中如何通过简单的方法解决单元格显示公式而非计算结果的问题,包括使用快捷键和调整单元格格式两种方法。 ... [详细]
  • 本文提供了一个关于AC自动机(Aho-Corasick Algorithm)的详细解析与实现方法,特别针对P3796题目进行了深入探讨。文章不仅涵盖了AC自动机的基本概念,还重点讲解了如何通过构建失败指针(fail pointer)来提高字符串匹配效率。 ... [详细]
  • 尽管在WPF中工作了一段时间,但在菜单控件的样式设置上遇到了一些基础问题,特别是关于如何正确配置前景色和背景色。 ... [详细]
  • 本文详细介绍如何在 Apache 中设置虚拟主机,包括基本配置和高级设置,帮助用户更好地理解和使用虚拟主机功能。 ... [详细]
  • OpenCV中的霍夫圆检测技术解析
    本文详细介绍了如何使用OpenCV库中的HoughCircles函数实现霍夫圆检测,并提供了具体的代码示例及参数解释。 ... [详细]
  • 本文探讨了如何使用Scrapy框架构建高效的数据采集系统,以及如何通过异步处理技术提升数据存储的效率。同时,文章还介绍了针对不同网站采用的不同采集策略。 ... [详细]
  • C/C++中一级指针的内存模型与示例代码
    本文通过一个具体的C/C++代码示例,详细解析了一级指针在内存中的布局和工作原理。包括了对不同类型的指针变量如何在内存中分配空间的讨论。 ... [详细]
  • 本文探讨了Linux环境下线程私有数据(Thread-Specific Data, TSD)的概念及其重要性,介绍了如何通过TSD技术避免多线程间全局变量冲突的问题,并提供了具体的实现方法和示例代码。 ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 使用Matlab创建动态GIF动画
    动态GIF图可以有效增强数据表达的直观性和吸引力。本文将详细介绍如何利用Matlab软件生成动态GIF图,涵盖基本代码实现与高级应用技巧。 ... [详细]
  • 本文介绍了如何利用OpenCV库进行图像的边缘检测,并通过Canny算法提取图像中的边缘。随后,文章详细说明了如何识别图像中的特定形状(如矩形),并应用四点变换技术对目标区域进行透视校正。 ... [详细]
author-avatar
人对方啥地位
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有