独立按键:

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

按键按下一次,数码管数值加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 独立按键&编码按键的更多相关文章

  1. C#控制键盘按键(大小写按键等)的代码

    将代码过程较好的代码段做个记录,如下的资料是关于C#控制键盘按键(大小写按键等)的代码.using System;using System.Collections.Generic;using Syst ...

  2. 51单片机-独立按键控制led矩阵的左移和右移

    51单片机学习 独立按键 控制led灯光矩阵的左移和右移 开发板采用的是普中的A2学习开发板,具体的代码如下: typedef unsigned int u16; void delay(u16 tim ...

  3. AD按键-矩阵按键-独立按键:

    原理:利用数组分压+AD采集: 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来):可备用作为AD基准输入. 缺点:不能做成组合按键(或者电阻要精确选择):且离IO ...

  4. MCU实战经验:多种的按键处理

    按键通常有:IO口按键(BUTTON),AD按键(通过AD采样电压),IR(遥控器) 按按键功能分:有短按键,长按键,连续按键.打个比方,遥控电视机,按一下音量键,音量增加1,这个就是短按键.按住音量 ...

  5. [转] jQuery按键响应事件keypress对应的按键编码keycode

    原文地址:http://blog.csdn.net/chenhj1988918/article/details/7534922 keypress  api 文档:http://api.jquery.c ...

  6. 按键显示按键编码 keycode

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. AD按键-矩阵按键:

    原理:利用数组分压+AD采集: 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来):可备用作为AD基准输入. 缺点:不能做成组合按键(或者电阻要精确选择):且离IO ...

  8. 入门级的按键驱动——按键驱动笔记之poll机制-异步通知-同步互斥阻塞-定时器防抖

    文章对应视频的第12课,第5.6.7.8节. 在这之前还有查询方式的驱动编写,中断方式的驱动编写,这篇文章中暂时没有这些类容.但这篇文章是以这些为基础写的,前面的内容有空补上. 按键驱动——按下按键, ...

  9. Python3 tkinter基础 event keysym 查看按键的按键名

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

随机推荐

  1. <WP8开发学习笔记>获取手机的常用型号(如Lumia920,而非RM-822)

    之前WP7时代可以用API获得WP手机的型号如lumia510,但是到了WP8后用APi只能获得硬件版本号了如RM-822,这种型号可以让我们更详细的了解具体的硬件版本,比如国行和港行,设备版本号不一 ...

  2. 自动完成 APP【字典树(Trie树)+dfs】

    自动完成 APP 传送门  来源:upc12786 题目描述 奶牛 Bessie 很喜欢用手机上网聊天,但她的蹄子太大,经常会按到好几个键造成不必要的麻烦(丢死人了,你下辈子还是不要当奶牛了).于是 ...

  3. python+selenium识别图片验证码

    import timeimport pytesseractfrom PIL import Image, ImageEnhancefrom selenium import webdriver url = ...

  4. [每日一题2020.06.09] leetcode #97 交错字符串 dp

    题目链接 利用动态规划的思想, 对于每种状态(i, j)来说都有(i-1, j) 和 (i,j-1) 需要注意的问题 : 初始化的问题,先把i=0和j=0的状态都初始化后才可以进行dp否则发生数组越界 ...

  5. Chrome启动选项

    1. Chrome Options 这是一个Chrome的参数对象,在此对象中使用add_argument()方法可以添加启动参数,添加完毕后可以在初始化Webdriver对象时将此Options对象 ...

  6. Java 从入门到进阶之路(二十三)

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 的迭代器 Iterator,本章我们来看一下 Java 集合框架中的Collection 的泛型. 在讲泛型之前我们先来 ...

  7. 国外一教授坦言,用这方法能迅速成为python程序员,但都不愿意说_编程小十

    越来越多的人学习python,但你学习python用了多长的时间?#Python# 你知道如何才能迅速掌握并成为python程序员吗?   有这样的一位国外的教授说,要迅速成为python程序员,几乎 ...

  8. JVM生命周期与运行过程

    1. Java虚拟机的生命周期 Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序.程序开始执行时他才运行,程序结束时他就停止.你在同一台机器上运行三个程序,就会 ...

  9. JVM之HotSpot虚拟机是如何发起内存回收的?

    1.背景 在上一节中,我们掌握了垃圾收集的一些算法,也弄明白了分代回收的原理, 那么HotSpot虚拟机是如何发起内存回收的? 2.如何找到GC Roots根节点(枚举根节点) 从可达性分析中GC R ...

  10. java scoket aIO 通信

    AsynchronousServerSocketChannel assc.accept(this, new ServerCompletionHandler()); 第一个参数是服务器的处理类,第二个参 ...