51单片机攻略—键盘

一、程序实战

(五)键盘相关

基础概念:
1、键盘分类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
矩阵式键盘:
在这里插入图片描述

1、独立键盘按键控制LED

#include <reg52.h>
sbit led1 =  P1^0;
sbit key1 = P3^5;
void main() {
    led1 = 1;
    key1 = 1;
    while (1) {
        if(key1 == 0){
            led1 = 0;
        }
        else{
            led1 = 1;
        }
    }
}

按下按键灯亮,松开灯灭,测试成功。

2、独立键盘按下数码管数字+1且led闪烁

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit led1 =  P1^0;
sbit key1 = P3^5;
sbit SMG = P2^0;
uchar num;
uchar code table[] = {
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90
};
void main() {
    led1 = 1;
    key1 = 1;
    SMG = 0;
    num = 0;
    P0 = table[num];
    while (1) {
        if(key1 == 0){
            led1 = 0;
            num ++;
            P0 = table[num];
            if(num > 9){
                num = 0;
            }
        }
        else{
            led1 = 1;
        }
    }
}

数码管数值显示不正常,主要由于按键存在抖动,测试失败。

3、按键消抖程序

消抖方式:软件消抖与硬件消抖
在这里插入图片描述
消抖处理:
(1)加入wile()让程序停留

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit led1 =  P1^0;
sbit key1 = P3^5;
sbit SMG = P2^0;
uchar num;
uchar code table[] = {
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90
};
void main() {
    led1 = 1;
    key1 = 1;
    SMG = 0;
    num = 0;
    P0 = table[num];
    while (1) {
        if(key1 == 0){
            led1 = 0;
            num ++;
            P0 = table[num];
            if(num > 9){
                num = 0;
            }
        while(!key1);
        }
        else{
            led1 = 1;
        }
    }
}

(2)加入11.0592MHZ延时函数:(10ms)

#include <reg52.h>
sbit led1 = P1^0;
#define uint unsigned int
#define uchar unsigned char
void delay(uint z){
    uint x,y;
    for (x = 200; x > 0; x--) {
        for(y = z; y > 0; y--);
    }
}
void main(){
	led1 = 1;
	delay(210);
	led1 = 0;
	delay(210);
}

加入延时函数的完整按键消抖程序:

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit led1 = P1^0;
sbit key1 = P3^5;
sbit SMG = P2^0;
uchar num;
uchar code table[] = {
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90
};
void delay(uint z){
    uint x,y;
    for (x = 200; x > 0; x--) {
        for(y = z; y > 0; y--);
    }
}
void main() {
    led1 = 1;
    key1 = 1;
    SMG = 0;
    num = 0;
    P0 = table[num];
    while (1) {
        if(key1 == 0){
            delay(4);
            if(key1 == 0){
                led1 = 0;
                num ++;
                P0 = table[num];
                if(num > 9){
                    num = 0;
                }
            }
        while(!key1);
        delay(4);
        while(!key1);
        }
        else{
            led1 = 1;
        }
    }
}

测试成功。
备注:
矩阵键盘原理类似,加入多列扫描和按位与程序,测试板无此类键盘,暂不扩展。

发布了11 篇原创文章 · 获赞 3 · 访问量 892

猜你喜欢

转载自blog.csdn.net/m0_46115596/article/details/104726639
今日推荐