MCU 51-4 独立按键&编码按键
独立按键:

按键的按下与释放是通过机械触点的闭合与断开来实现的,因机械触点的弹性作用,在闭合与断开的瞬间均有一个抖动的过程,抖动必须清除。

按键按下一次,数码管数值加1:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit we = P2^; //数码管位选
sbit du = P2^; //数码管段选
sbit key_s2 = P3^;//S2按键位定义
uchar code leddata[]={ 0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x00 //自定义 }; void delay(uint z)
{
uint x,y;
for(x = z; x > ; x--)
for(y = ; y > ; y--);
} void main()
{
uchar num;
we = ;
P0 = 0xfe; //选通第一个数码管
we = ;
while()
{
du = ;
P0 = leddata[num]; //显示S2按下次数
du = ;
if(key_s2 == )//判断S2是否按键
{
delay();//软件延时
if(key_s2 == )
{
num++; //计数加1
}
while(!key_s2); //松手检测
}
if(num == ) //当数值为超过9时归零
{
num = ;
}
}
}
用定时器0定时间隔1秒数码管静态循环显示0 - 9。按独立键盘的S2按键时开始循环显示,按S3按键时暂停,按S4按键时点亮P1口所有LED灯,按S5按键时关闭P1口所有LED灯。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit we = P2^;
sbit du = P2^; sbit key_s2 = P3^;
sbit key_s3 = P3^;
sbit key_s4 = P3^;
sbit key_s5 = P3^; uchar code leddata[]={ 0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x00 //自定义 }; void delay(uint z)
{
uint x,y;
for(x = z; x > ; x--)
for(y = ; y > ; y--);
} void main()
{
uchar i;//计数有多少个50毫秒产生
uchar num;//计数
TMOD = 0x01;//定时器0 做定时 模式1 16位计数器
TH0 = (0xffff - ) / 0xff;
TL0 = (0xffff - ) % 0xff;//定时50ms
we = ;
P0 = 0xfe; //选通第一位数码管
we = ;
while()
{
if(TF0 == ) //判断50ms是否到
{
TH0 = (0xffff - ) / 0xff;
TL0 = (0xffff - ) % 0xff;//定时50ms
TF0 = ;//清除溢出标志位
i++;
}
if(i == )//判断是否到了1秒
{
i = ;//清零秒计数
num++;//计数值加1
}
if(num == )//当计数值为10时归零
{
num = ;
}
du = ;
P0 = leddata[num]; //数码管实时显示计数值
du = ;
if(key_s2 == ) //判断是否按下S2
{
delay(); //软件消抖
if(key_s2 == )//再次判断是否按下S2
{
TR0 = ;//启动定时器0
}
while(!key_s2);//松手检测
}
if(key_s3 == ) //判断S3是否被按下
{
delay();//软件消抖
if(key_s3 == )//再次判断S3是否被按下
{
TR0 = ;//停止定时器0
}
while(!key_s3);//松手检测
}
if(key_s4 == ) //判断S4是否被按下
{
delay(); //软件消抖
if(key_s4 == ) //再次判断S4是否被按下
{
P1 = ;//点亮P1口所有LED灯
}
while(!key_s4);//松手检测
}
if(key_s5 == )//判断S5是否被按下
{
delay(); //软件消抖
if(key_s5 == ) //再次判断S5是否被按下
{
P1 = 0xff;//关闭P1口所有LED灯
}
while(!key_s5); //松手检测
}
}
}
矩形按键模块:

矩形键盘:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit we = P2^;
sbit du = P2^;
uchar code leddata[]={ 0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x00 //自定义 };
void delay(uint z)
{
uint x,y;
for(x = z; x > ; x--)
for(y = ; y > ; y--);
} uchar KeyScan() //带返回值的子函数
{
uchar cord_l,cord_h;//声明列线和行线的值的储存变量
P3 = 0xf0;//1111 0000 p3.7 ... p3.0
if( (P3 & 0xf0) != 0xf0)//判断是否有按键按下
{
delay();//软件消抖
if( (P3 & 0xf0) != 0xf0)//判断是否有按键按下
{
cord_l = P3 & 0xf0;// 储存列线值
P3 = cord_l | 0x0f; //将行输出变为1111,此时按键仍处于按下,所以行值会变化,下一步进行存储行值
cord_h = P3 & 0x0f;// 储存行线值
while( (P3 & 0x0f) != 0x0f );//松手检测
return (cord_l + cord_h);//返回键值码
}
} } void KeyPro()
{
switch( KeyScan() )
{
//第一行键值码
case 0xee: P0 = leddata[]; break;
case 0xde: P0 = leddata[]; break;
case 0xbe: P0 = leddata[]; break;
case 0x7e: P0 = leddata[]; break; //第二行键值码
case 0xed: P0 = leddata[]; break;
case 0xdd: P0 = leddata[]; break;
case 0xbd: P0 = leddata[]; break;
case 0x7d: P0 = leddata[]; break; //第三行键值码
case 0xeb: P0 = leddata[]; break;
case 0xdb: P0 = leddata[]; break;
case 0xbb: P0 = leddata[]; break;
case 0x7b: P0 = leddata[]; break; //第四行键值码
case 0xe7: P0 = leddata[]; break;
case 0xd7: P0 = leddata[]; break;
case 0xb7: P0 = leddata[]; break;
case 0x77: P0 = leddata[]; break;
}
} void main()
{
we = ;//打开位选
P0 = ;//八位数码管全显示
we = ;//锁存位选 du = ;//打开段选端
P0 = leddata[];
while()
{
KeyPro();//提取键值码并且送不同数值给数码管显示
}
}
MCU 51-4 独立按键&编码按键的更多相关文章
- C#控制键盘按键(大小写按键等)的代码
将代码过程较好的代码段做个记录,如下的资料是关于C#控制键盘按键(大小写按键等)的代码.using System;using System.Collections.Generic;using Syst ...
- 51单片机-独立按键控制led矩阵的左移和右移
51单片机学习 独立按键 控制led灯光矩阵的左移和右移 开发板采用的是普中的A2学习开发板,具体的代码如下: typedef unsigned int u16; void delay(u16 tim ...
- AD按键-矩阵按键-独立按键:
原理:利用数组分压+AD采集: 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来):可备用作为AD基准输入. 缺点:不能做成组合按键(或者电阻要精确选择):且离IO ...
- MCU实战经验:多种的按键处理
按键通常有:IO口按键(BUTTON),AD按键(通过AD采样电压),IR(遥控器) 按按键功能分:有短按键,长按键,连续按键.打个比方,遥控电视机,按一下音量键,音量增加1,这个就是短按键.按住音量 ...
- [转] jQuery按键响应事件keypress对应的按键编码keycode
原文地址:http://blog.csdn.net/chenhj1988918/article/details/7534922 keypress api 文档:http://api.jquery.c ...
- 按键显示按键编码 keycode
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- AD按键-矩阵按键:
原理:利用数组分压+AD采集: 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来):可备用作为AD基准输入. 缺点:不能做成组合按键(或者电阻要精确选择):且离IO ...
- 入门级的按键驱动——按键驱动笔记之poll机制-异步通知-同步互斥阻塞-定时器防抖
文章对应视频的第12课,第5.6.7.8节. 在这之前还有查询方式的驱动编写,中断方式的驱动编写,这篇文章中暂时没有这些类容.但这篇文章是以这些为基础写的,前面的内容有空补上. 按键驱动——按下按键, ...
- Python3 tkinter基础 event keysym 查看按键的按键名
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
随机推荐
- qt程序添加文件版本号
1.需要一个 *.rc 文件,用以保存相关信息.比如添加一个 app.rc 里面内容如下所示: IDI_ICON1 ICON DISCARDABLE "app.ico" ----- ...
- 【JUC系列】01、之大话并发
学习方法 学习技术的方法都很类似,大部分都有着类似的步骤: 场景 需求 解决方案 应用 原理 并发的目的 充分利用CPU 和 I/O资源 提高效率 并发的维度 分工 同步/协作 互斥 分工 线程池 f ...
- 关于领域驱动设计 DDD(Domain-Driven Design)
以下旨在 理解DDD. 1. 什么是领域? 妈妈好是做母婴新零售的产品,应该属于电商平台,那么电商平台就是一个领域. 同一个领域的系统都有相同的核心业务. eg: 电商领域都有:商品浏览.购物 ...
- Spring导入外部资源
创建一个数据库连接的 properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssmbuil ...
- Flutter 中由 BuildContext 引发的血案
今天和各位分享一个博主在实际开发中遇到的问题,以及解决方法.废话不多说,我们先来看需求: 我们要做一个iOS风格的底部菜单弹出组件,具体涉及showCupertinoModalPopup()方法,该方 ...
- [每日一题2020.06.13]leetcode #739 #15 单调栈 双指针查找
739 每日温度 ( 单调栈 ) 题目 : https://leetcode-cn.com/problems/daily-temperatures/ 题意 : 找到数组每一个元素之后第一个大于它的元素 ...
- spring源码分析——BeanPostProcessor接口
BeanPostProcessor是处理bean的后置接口,beanDefinitionMaps中的BeanDefinition实例化完成后,完成populateBean,属性设置,完成 初始化后,这 ...
- 警告Establishing SSL connection without server's identity verification is not recommended
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] SpringBo ...
- 01 . 容器编排简介及Kubernetes核心概念
Kubernetes简介 Kubernetes是谷歌严格保密十几年的秘密武器-Borg的一个开源版本,是Docker分布式系统解决方案.2014年由Google公司启动. Kubernetes提供了面 ...
- Java字符串类型详解
Java 字符串类主要有String.StringBuffer.StringBuilder.StringTokenizer 1.字符串类型底层都是使用char数组进行实现. 2.从jdk1.7以后,S ...