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 ...
随机推荐
- Redis学习笔记(二十) 发布订阅(下)
当一个客户端执行SUBSCRIBE命令订阅某个或某些频道时,这个客户端与被订阅频道之间就建立起了一种订阅关系. Redis将所有频道的订阅关系保存在服务器状态的pubsub_channels字典里面, ...
- Ultra-QuickSort (求逆序数+离散化处理)、Cows、Stars【树状数组】
一.Ultra-QuickSort(树状数组求逆序数) 题目链接(点击) Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total ...
- conda 管理包
查看当前环境已经安装的包 conda list 查看指定环境中的安装包 conda list -n python27 在Anaconda 库中搜索包 conda search numpy #模糊搜索 ...
- 【JMeter_19】JMeter逻辑控制器__简单控制器<Simple Controller>
简单控制器<Simple Controller> 业务逻辑: 就像他的名字一样,简单,可以理解为一个文件夹,就是分组用的,没有其他特殊功能,但相比不添加简单控制器,区别在于简单控制器可以被 ...
- 键盘侠Linux教程(五)| 基本权限管理
基本权限管理 权限的介绍 权限位的含义 前面讲解ls命令时,我们已经知道长格式显示的第一列就是文件的权限,例如: [root@es ~]# ls -l anaconda-ks.cfg -rw----- ...
- Redis - (Linux)安装与配置
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: 1:Redis支持数据的持久化,可以将内存 ...
- 网络虚拟化之linux虚拟网络基础
1 linux虚拟网络基础 1.1 Device 在linux里面devic(设备)与传统网络概念里的物理设备(如交换机.路由器)不同,Linux所说的设备,其背后指的是一个类似于数据结构.内核模块或 ...
- centos搭建nginx+fastdfs
软件地址 libfastcommon fastDFS fastdfs-nginx-module nginx 创建目录 mkdir -p /fastdfs/tracker mkdir -p /fastd ...
- Python3-socket模块-低级网络接口
Python3中的socket模块提供了对访问套接字(socket)的接口 socket可以理解为是一个管道,通过这个管道可以使两个不同的程序通过网络进行通信,在Python中的scoket()函数可 ...
- 千金良方说:"我现在奉上179341字的MySQL资料包,还来得及吗?有"代码段、附录、和高清图!!"
上一篇"上发布过"一不小心,我就上传了 279674 字的 MySQL 学习资料到 github 上了",我在更早之前,在微信公众号"老叶茶馆"上发布 ...