51单片机按键的基本原理与实现

由于人手按按键会发生不可避免的抖动问题,所以消抖就成为不能避免的步骤,

消抖主要有两种方式:1·硬件消抖 2·软件消抖

硬件消抖,说白了也是一种延时的处理方式,感觉还没有软件直接延时来的直接,直观,方便呢!

独立式键盘:直观,容易理解,占用io资源比较多

行列式矩阵键盘,节省io资源,很少的io口,可以做出很多的按键出来

如图搜索导入元器件并连线

编写c代码并编译hex文件

#include"reg52.h"

sbit k=P1^0;
unsigned char dat[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  // 共阴极数码管取值0到9;
unsigned int num=0, flag=0;

void delay(unsigned int n){
    unsigned int i=0, j=0;
    for(i=0; i<n; i++){
        for(j=0; j<120; j++);
    }
}

void key(){
//    if(k==0){
//        delay(20);      // 这个延时消抖函数如果没有,后面的num就会加的很快。
//        if(k==0){
//            num++;
//            if(num > 9){
//                num=0;
//        }
//    }
//    }                    // 前面的num加的太快,不符合一一个的加的要求。
    
    if(k==0 && flag==0){   // 如果按键没有按下且标志位为0
        flag=1;                  //  就把标志位设为1
    }
    if(k==1 && flag==1){    // 如果按键按下了 且 标志位为1
        num++;                      // num加1
        flag=0;                     // 标志位设为0
        if(num>9){                  // 如果num大于9了
            num=0;                       // num就等于0,  大于9了就超过了前面的数组dat的取值范围了,只能清0,从头算
        }
    }
}

void seg(){
    P2=dat[num];            //   数码管的显示取数组dat的第num个值
}

void main(){
    while(1){
        key();
        seg();
    }
}

proteus导入hex文件后模拟运行,这样不论你按键安多快多慢,都能保证每次按下数码管加一个数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尚久龙

你的鼓励是我最大的动力!谢谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值