单片机基础知识 07

一. 键盘检测

键盘分为编码键盘非编码键盘

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

非编码键盘:靠软件编程来识别。

在单片机组成的各种系统中,用的较多的是非编码键盘。编码键盘又分为独立键盘行列式键盘矩阵式键盘)。

1. 独立键盘

单片机系统中常见的几种按键:弹性按键,贴片按键,自锁按键

编写单片机的键盘检测程序时,一般在检测按下时加入去抖延时,检测松手时就不用加了。
在这里插入图片描述
案例1:用数码管的前两位显示一个十进制数,变化范围为00-59,开始时显示00,每按下S2键1次,数值加1;每按下S3键1次,数值减1;每按下S4键1次数值归零;按下S5键1次,利用定时器功能使数值开始自动每秒加1,再次按下S5键,数值停止自动加1,保持显示原数。

#include <reg52.h>
#define  uchar unsigned char
#define uint unsigned intsbit key1 = P3^4;
sbit key2 = P3^5;
sbit key3 = P3^6;
sbit key4 = P3^7;
sbit dula = P2^6;  //U1锁存器的锁存端
sbit wela = P2^7;  //U2锁存器的锁存端uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delayms(uint);
uchar numt0, num;/***数码管显示函数***/
void display(uchar numdis)
{uchar shi,ge;shi = numdis/10;he = numdis%10;dula = 1;P0 = table[shi]; //送十位段选数据dula = 0;P0 = 0xff;/*送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱*/wela = 1;P0 = 0xfe; //送位选数据wela = 0;delayms(5); dula = 1;P0 = table[ge]; //送个位段选数据dula = 0;P0 = 0xff;wela = 1;P0 = 0xfd;wela = 0;delayms(5);	
}/***延时函数***/
void delayms(uint xms)
{uint i ,j;for(i= xms; i>0 ; i--){for(j =110;i>0;j--);}
}/***初始化函数***/
void init()
{TMOD = 0x01; //设置定时器0为工作方式1TH0 = (65536-45872)/256; //装初值50ms一次中断TL0 = (65536-45872)%256; EA = 1; //开总中断ET0 = 1; //开定时器0中断
} /***键盘扫描函数***/
void keyscan()
{if(0 == key1){delayms(10);if(0 == key1){num++;if(60 == num){num = 0}while(!key1); //等待按键释放}}if(0 == key2){delayms(10);if(0 == key2){if(0 == num){num = 60}num--;while(!key2); }}if(0 == key3){delayms(10);if(0 == key3){num = 0;while(!key3);}}if(0 == key4){delayms(10);if(0 == key4){while(!key4); TR0 = ~TR0;  //启动或者停止定时器0}}
}void main()
{init();while(1){keyscan();display(num);}
}/***定时器中断函数***/
void T0_time() interrupt 1
{TH0 = (65536-45872)/256; //重装初值TL0 = (65536-45872)%256; numt0++;if(20 == numt0){numt0 = 0;num++; if(60 == num){num = 0;}	}
}

2. 矩阵键盘

独立键盘有一端固定为低电平,单片机写程序检测时比较方便。而矩阵键盘两端都与单片机I/O口相连,因此在检测时需人为通过单片机I/O口送出低电平。

检测时,先送一列为低电平,其余几列全为高电平(此时我们确定了列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电平(这时我们又确定了行数),则我们可以确定当前被按下的键是哪一行哪一列的。用同样的方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平,这样即可检测完所有的按键,当有按键被按下时便可判断出按下的键是哪一个键。

案例2:实验板上电时,数码管不显示,顺序按下矩阵键盘后,在数码管上依次显示0-F,6个数码管同时静态显示即可。
其中,矩阵键盘的4行分别与单片机的P3.0-P3.3相连,4列分别与P3.4-P3.7相连。

#include <reg52.h>
#define  uchar unsigned char
#define uint unsigned intsbit dula = P2^6;  //U1锁存器的锁存端
sbit wela = P2^7;  //U2锁存器的锁存端uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/***延时函数***/
void delayms(uint xms)
{uint i ,j;for(i= xms; i>0 ; i--){for(j =110;i>0;j--);}
}/***数码管显示函数***/
void display(uchar num)
{P0 = table[num]; //显示函数只送段选数据dula = 1;dula = 0; 
}/***矩阵键盘扫描函数***/
void matrixkeyscan()
{uchar temp,key;//第一行P3 = 0xfe;temp = P3;temp = temp & 0xf0;  //用于判断temp高4位是否有0if(0xf0 != temp)  /*temp的高4位数据实际上就是矩阵键盘的4个列线,若temp不等于0xf0,说明有键被按下*/{delayms(10); //延时去抖temp = P3;temp = temp & 0xf0;if(0xf0 != temp){temp =P3;switch(temp){case 0xee:key = 0;break;case 0xde:key = 1;break;case 0xbe:key =2;break;case 0x7e:key = 3;break;}while(temp!=0xf0) //等待按键释放{temp = P3;temp = temp & 0xf0;}display(key); //显示}}//第2行P3 = 0xfd;temp = P3;temp = temp & 0xf0;if(0xf0 != temp){delayms(10);temp = P3;temp = temp & 0xf0;if(0xf0 != temp){temp =P3;switch(temp){case 0xed:key = 4;break;case 0xdd:key = 5;break;case 0xbd:key =6;break;case 0x7d:key = 7;break;}while(temp!=0xf0) //等待按键释放{temp = P3;temp = temp & 0xf0;}display(key); //显示}}//第3行P3 = 0xfb;temp = P3;temp = temp & 0xf0;if(0xf0 != temp){delayms(10);temp = P3;temp = temp & 0xf0;if(0xf0 != temp){temp =P3;switch(temp){case 0xeb:key = 8;break;case 0xdb:key = 9;break;case 0xbb:key = 10;break;case 0x7b:key = 11;break;}while(temp!=0xf0) //等待按键释放{temp = P3;temp = temp & 0xf0;}display(key); //显示}}//第4行P3 = 0xf7;temp = P3;temp = temp & 0xf0;if(0xf0 != temp){delayms(10);temp = P3;temp = temp & 0xf0;if(0xf0 != temp){temp =P3;switch(temp){case 0xe7:key = 12;break;case 0xd7:key = 13;break;case 0xb7:key =14;break;case 0x77:key = 15;break;}while(temp!=0xf0) //等待按键释放{temp = P3;temp = temp & 0xf0;}display(key); //显示}}	
}void main()
{P0 = 0; //关闭所有数码管段选dula = 1;dula = 0;P0 = 0xc0; //位选中所有数码管wela = 1;wela = 0;while(1){matrixkeyscan(); //不停调用键盘扫描程序}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/702.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Darknet框架优化介绍

一、DarkNet框架简介 1.DarkNet的简介 Darknet是一个完全使用C语言编写的人工智能框架&#xff0c;可以使用CUDA的开源框架。主要应用于图像识别领域。 它具有可移植性好&#xff0c;安装间接&#xff0c;查看源码方便等优势&#xff0c;提供了OpenCV等附加选项&#xff0c;还…

(七)Pandas时序数据 学习简要笔记 #Python #CDA学习打卡

一. 时序数据简介 1&#xff09;定义 时间序列&#xff08;time series&#xff09;&#xff0c;就是由时间构成的序列&#xff0c;它指的是在一定时间内按照时间顺序测量的某个变量的取值序列&#xff0c;比如一天内的温度会随时间而发生变化&#xff0c;或者股票的价格会随…

c语言题目之求最大公约数

题目内容&#xff1a;求最大公约数 给定两个数&#xff0c;求这两个数的最大公约数 例如&#xff1a; 输入&#xff1a;20 40 输出&#xff1a;20 什么叫最大公约数&#xff1f; 方法分析&#xff1a; 提示&#xff1a;这里我们用辗转相除法&#xff1a; 例如&#xff1a;输…

腾讯云APP备案指南:一站式完成备案手续,助您顺利上线

工信部最新通知要求所有互联网信息服务提供者完成移动互联网应用程序备案手续。腾讯云为开发者提供了简单易行的备案流程&#xff0c;本文详细解答如何在腾讯云平台完成备案&#xff0c;帮助开发者快速上线自己的APP。从验证备案域名到腾讯云审核&#xff0c;一步步指导您完成备…

vue 一键更换主题颜色

这里提供简单的实现步骤&#xff0c;具体看自己怎么加到项目中 我展示的是vue2 vue3同理 在 App.vue 添加 入口处直接修改 #app { // 定义的全局修改颜色变量--themeColor:#008cff; } // 组件某些背景颜色需要跟着一起改变&#xff0c;其他也是同理 /deep/ .ant-btn-primar…

响应式修改 页面字体字号【大 中 小 】

浅浅记录下&#xff0c;工作中遇到的问题&#xff0c;修改页面文本字号。 <p class"change_fontSize">[ 字号 <a href"javascript:doZoom(18)">大</a><a href"javascript:doZoom(16)">中</a><a href"ja…

『FPGA通信接口』汇总目录

Welcome 大家好&#xff0c;欢迎来到瑾芳玉洁的博客&#xff01; &#x1f611;励志开源分享诗和代码&#xff0c;三餐却无汤&#xff0c;顿顿都被噎。 &#x1f62d;有幸结识那个值得被认真、被珍惜、被捧在手掌心的女孩&#xff0c;不出意外被敷衍、被唾弃、被埋在了垃圾堆。…

墨子web3时事周报

蚂蚁集团Web3研发进展与布局 国内Web3赛道的领军企业——蚂蚁集团&#xff0c;凭借其在前沿科技领域的深耕不辍&#xff0c;已在Web3技术研发疆域缔造了卓越战绩。特别是在引领行业革新的关键时刻&#xff0c;集团于今年四月末震撼推出了颠覆性的Web3全套解决方案&#xff0c…

在 Ubuntu 12.10 安装 wxPython

安装 wxPython 可以使用 pip 工具&#xff0c;但在 Ubuntu 12.10 上需要首先安装 wxPython 的依赖项。请注意&#xff0c;Ubuntu 12.10 已于2013年终止支持&#xff0c;建议升级到更高版本的 Ubuntu。以下是在 Ubuntu 12.10 上安装 wxPython 的一般步骤&#xff1a; 一、问题背…

考研日常记录

由于实在太无聊了 &#xff0c; 所以记录以下考研备考日常 &#xff0c; 增加一点成就感 &#xff0c; 获得一点前进动力。 2024.4.18 周四 课程情况&#xff1a; 无课 时间规划&#xff1a; 上午&#xff1a;休息 下午&#xff1a; 事项耗时进度备注写作业1h复习英语单词…

深入浅出学习切片LOD——ArcGIS server模拟缓存切片(影像快显)

一、第一次实践 原理 免切片实现影像服务的模拟切片&#xff0c;主要原理是接收前端传过来的xyz(行列层级)以及切片方案&#xff0c;计算出该请求的切片的四至经纬度信息&#xff0c;通过mapserver的exportImage接口&#xff0c;传入每个模拟切片的四至经纬度信息得到图片返回…

Spark01

Spark01 一. Spark概述二. Spark环境部署 - Local三. Spark环境部署 - Standalone1. Standalone集群概述2. Standalone环境部署3. 测试环境 四. Spark环境部署 - Standalone-HA1. 安装部署Zookeeper1. 下载2. zookeeper安装3. 配置StandAlone-HA集群 五. Spark On YARN -- 重点…

ESP32S3在VScode中使用USB口调试

ESP32S3在VScode中使用USB口调试 安装USB驱动修改工程的配置文件launch.jsonsettings.json 启动GDB Server 安装USB驱动 在powershell中输入下面指令&#xff1a; Invoke-WebRequest https://dl.espressif.com/dl/idf-env/idf-env.exe -OutFile .\idf-env.exe; .\idf-env.exe…

js实现抽奖效果

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>随机抽奖</title> </head> <body>…

锂电池寿命预测 | Matlab基于GRU门控循环单元的锂电池寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池寿命预测 | Matlab基于GRU门控循环单元的锂电池寿命预测 Matlab基于GRU的锂电池剩余寿命预测 基于GRU的锂电池剩余寿命预测&#xff08;单变量&#xff09; 运行环境Matlab2020及以上 锂电池的剩余寿命预测是…

W11安装WSL2 ubuntu 攻略

W11安装WSL2 ubuntu 攻略 最近换了新电脑重新安装一遍wsl2&#xff0c;记录一下方便以后使用。 打开控制面板&#xff0c;选择程序 —— 启用或关闭Windows功能&#xff0c;勾选 适用于Linux的Windows子系统还有虚拟机平台选项&#xff0c;修改后需要重启 wsl2版本 wsl --se…

Rust腐蚀服务器清档多教程

Rust腐蚀服务器清档多教程 大家好我是艾西&#xff0c;一个做服务器租用的网络架构师。上期教了大家怎么搭建服务器以及安装插件等那么随着大家自己架设服或是玩耍的时间肯定会有小伙伴想要去新增开区数量或是把原本的服务器进行一些调整等&#xff0c;那么今天主要聊的就是怎…

如何在Windows 10中启用和使用上帝模式,这里有详细步骤

序言 上帝模式&#xff08;God Mode&#xff09;是一个特殊的文件夹&#xff0c;只在一个窗口中显示所有可用的操作设置。它可以节省搜索命令的时间&#xff0c;而无需知道通过“开始”菜单或“控制面板”查找命令的步骤。上帝模式默认情况下是隐藏的&#xff0c;所以我们需要…

类和对象-封装-设计案例1-立方体类

#include<bits/stdc.h> using namespace std; class Cube{public://设置长void setL(int l){m_Ll;} //获取长int getL(){return m_L;}//设置宽 void setW(int w){m_Ww;}//获取宽 int getW(){return m_W;}//设置高 void setH(int h){m_Hh;}//获取高int getH(){return m_H;…

线程池 ThreadPoolExecutor 配置参数详解

《开发语言-Java》 线程池 ThreadPoolExecutor 参数详解 一、引言二、主要内容2.1 核心构造函数2.2 核心线程数2.3 最大线程数2.4 空闲线程存活时间2.5 keepAliveTime 的时间单位2.6 核心线程在空闲时的回收策略2.7 工作队列2.8 线程工厂2.9 拒绝策略 三、总结 一、引言 提到 …