当前位置: 首页 > news >正文

(六)c52学习之旅-独立按键

独立按键,按下时为0,松开时为1。
独立按键
下面结合数码管,编写一段程序。按键按下时,数码管加1显示,显示到9时,从0再开始计数。

#include <reg52.h>
#define uint8 unsigned char 
//段选锁存控制位p2.6  位选锁存控制位p2.7
sbit DU=P2^6;
sbit WE=P2^7;
//数码管0-9的16进制
uint8 num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit KEY =P3^4;
void main()
{
    int i=0;
    /*选定一个数码管显示0*/
    DU=1;
    P0=num[0];
    DU=0;
    WE=1;
    P0=0xfe;
    WE=0;

    while(1)
    {
        if(KEY==0)//按键按下时
        {
            i++;
            if(i==10)
                i=0;
            DU=1;
            P0=num[i];
            DU=0;
        }
    }   

}

按照理想状态下,程序会按照我们所想的执行,但是在实际实验现象中,却不是这样,按下按键时候,数码管显示却好像是随机数据,为什么这样呢?
原来在按键按下和松开时,会有一定时间的抖动,造成数据不稳定,如图所示抖动
所以我们应该在按键处于稳定状态在进行判断操作即可。抖动的事件大概在10ms左右。我们可以做个延迟来进行消抖。

#include <reg52.h>
#define uint8 unsigned char 
//段选锁存控制位p2.6  位选锁存控制位p2.7
sbit DU=P2^6;
sbit WE=P2^7;
//数码管0-9的16进制
uint8 num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void Delay()//简单的10ms延时
{
    int i=1000;
    for(;i>0;i--);

}
sbit KEY =P3^4;
void main()
{
    int i=0;
    bit kb=0;//暂存按键值
    bit kk=0;//最后按下的状态
    /*选定一个数码管*/
    DU=1;
    P0=num[0];
    DU=0;
    WE=1;
    P0=0xfe;
    WE=0;

    while(1)
    {
        kb=KEY;//存取当前按键状态
        if(kb!=kk)//和上一次按键动作做比较,如不相等则按键有动作
        {
            Delay();//延迟10ms
            if(KEY==1 && KEY==kb)
            {/*按键经过10ms无变化,说明经过了按键弹起*/
                i++;
                if(i==10)
                    i=0;
                DU=1;
                P0=num[i];
                DU=0;
            }
            kk=KEY;
        }
    }   
}

这次在经过实验即可得到我们想要的结果。

相关文章:

  • (七)c52学习之旅-中断
  • (八)c52学习之旅-中断实验
  • (九)c52学习之旅-定时器
  • (十)c52学习之旅-定时器实验
  • (十一)c52学习之旅-动态数码管
  • linux屏幕亮度调节解决办法
  • 一、系统准备工作
  • 二、CUDA安装和测试
  • 三、安装Anaconda实验平台
  • 3.1安装配置Anaconda
  • 3.2使用conda安装theano环境
  • 四、安装cuDNN,caffe和openCV
  • 测试Theano使用GPU并行计算,以验证环境搭建是否成功
  • 安装cuda的错误解决办法
  • Anaconda 安装编译pycaffe
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • Fabric架构演变之路
  • flutter的key在widget list的作用以及必要性
  • JavaScript 基本功--面试宝典
  • js递归,无限分级树形折叠菜单
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • react 代码优化(一) ——事件处理
  • SAP云平台里Global Account和Sub Account的关系
  • use Google search engine
  • yii2中session跨域名的问题
  • 初识 beanstalkd
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 批量截取pdf文件
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (bean配置类的注解开发)学习Spring的第十三天
  • (C语言)球球大作战
  • (solr系列:一)使用tomcat部署solr服务
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (转)socket Aio demo
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core中的去虚
  • .net wcf memory gates checking failed
  • .NET 材料检测系统崩溃分析
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .net2005怎么读string形的xml,不是xml文件。
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .net中生成excel后调整宽度
  • ??myeclipse+tomcat
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [Angularjs]ng-select和ng-options
  • [C++]unordered系列关联式容器
  • [COGS 622] [NOIP2011] 玛雅游戏 模拟
  • [CQOI 2010]扑克牌
  • [CSS]浮动
  • [elastic 8.x]java客户端连接elasticsearch与操作索引与文档
  • [G-CS-MR.PS02] 機巧之形2: Ruler Circle