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 ...
随机推荐
- 关于Integer类的值使用==比较
题记:前几天面试Java基础给来了个面试题Integer a=100,b=100;System.out.println(a==b); 当时回答是true,后来面试官又来了一个Integer a=200 ...
- 【Spring注解驱动开发】在@Import注解中使用ImportSelector接口导入bean
写在前面 在上一篇关于Spring的@Import注解的文章<[Spring注解驱动开发]使用@Import注解给容器中快速导入一个组件>中,我们简单介绍了如何使用@Import注解给容器 ...
- CAT12提取surface指标
介绍 基于表面的形态学分析(VSM)的方法被越来越多的研究者使用.本文主要介绍基于SPM12和CAT12工具包进行ROI-based VSM的处理步骤. 方法 本文数据处理使用的工具是MATLAB,S ...
- Java——String类(常用类)
一.String类——描述字符串 常用的方法简单介绍: 1.charAt() 获取对应位置的字符 2.length() 获取字符串的长度 3.concat() 在字符串的尾部追加内容-----相当于连 ...
- D2大全
年初看到cnblogs上有人说看这本旧书,自己也只是瞟了下,后来在看些OOP东西时,想想没事也看看老古董,于是网购了一本电子版可参考下,它们是怎么一步步来,还没来得及多看,贴图于此.
- JVM进阶之路(一)
JVM是Java程序运行的基本,了解Java程序的运行原理绝对有必要了解JVM的内容,JVM的内容其实很多,而且版本不同,其中的内容也很多不同,接下来就通过几篇文章来慢慢讲述JVM的内容. 一.Jvm ...
- AWS 错误标记3
1. What is the average queue length recommended by AWS to achieve a lower latency for the 200 PIOPS ...
- Java多线程与并发基础
CS-LogN思维导图:记录专业基础 面试题 开源地址:https://github.com/FISHers6/CS-LogN 多线程与并发基础 实现多线程 面试题1:有几种实现线程的方法,分别是什么 ...
- Spark3.0分布,Structured Streaming UI登场
近日,在Spark开源十周年之际,Spark3.0发布了,这个版本大家也是期盼已久.登录Spark官网,最新的版本已经是3.0.而且不出意外,对于Structured Streaming进行了再一次的 ...
- Java并发编程-深入探讨synchronized实现原理
synchronized这个关键字对应Java程序猿来说是非常的熟悉,只要遇到要解决线程安全问题的地方都会使用这个关键字.接下来一起来探讨一下synchronized到底时怎么实现线程同步,使用syn ...