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 ...
随机推荐
- netty实现消息中心(二)基于netty搭建一个聊天室
前言 上篇博文(netty实现消息中心(一)思路整理 )大概说了下netty websocket消息中心的设计思路,这篇文章主要说说简化版的netty聊天室代码实现,支持群聊和点对点聊天. 此demo ...
- OSI七层模型工作过程&&输入URL浏览器的工作过程(超详细!!)
从以下10个方面深入理解输入URL后整个模型以及浏览器的工作流程! 目录 1.HTTP 2.DNS 3.协议栈 4.TCP 5.IP 6.MAC 7.网卡 8.交换机 9.路由器 10.服务器与客户端 ...
- 利用Azure Functions和k8s构建Serverless计算平台
题记:昨晚在一个技术社区直播分享了"利用Azure Functions和k8s构建Serverless计算平台"这一话题.整个分享分为4个部分:Serverless概念的介绍.Az ...
- Python 网络爬虫实战:爬取 B站《全职高手》20万条评论数据
本周我们的目标是:B站(哔哩哔哩弹幕网 https://www.bilibili.com )视频评论数据. 我们都知道,B站有很多号称“镇站之宝”的视频,拥有着数量极其恐怖的评论和弹幕.所以这次我们的 ...
- Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?
在 C/C++/Java 等等语言中,整型变量的自增或自减操作是标配,它们又可分为前缀操作(++i 和 --i)与后缀操作(i++ 和 i--),彼此存在着一些细微差别,各有不同的用途. 这些语言的使 ...
- Redis进阶之使用Lua脚本自定义Redis命令
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 1.在Redis ...
- 【初学Java学习笔记】AOP与OOP
AOP(Aspect Oriented Programming) 面向切面编程,是属于Spring框架中的内容.AOP相当于OOP的补充,当我们需要对多个对象引入一个公共行为,比如日志,操作记录等,就 ...
- [ C++ ] 勿在浮沙筑高台 —— 内存管理(18~31p) std::alloc
部分内容个人感觉不是特别重要,所以没有记录了.其实还是懒 embedded pointers 把对象的前四字节当指针用. struct obj{ struct obj *free_list_link; ...
- linuxshell编程之环境变量配置文件 Tony Linux系统工程师
视频参考慕课网 如果修改了环境变量的配置文件,要使得修改的环境变量生效可以使用下面的两个命令 下面是点后面加上了一个空格然后再加上配置文件,这里一定要注意下 这里要注意和隐藏文件的区别: 在linux ...
- Python3-pymysql模块-数据库操作之MySQL
博客转载 http://www.cnblogs.com/alex3714/articles/5950372.html 代码示例 import pymysql conn = None cursor = ...