首页 测试文本

清翔零基础教你学51单片机_个人学习笔记(6)_独立按键

一、按键的工作原理

轻触开关样式:轻触开关的种类_齐家网

它的背面有一个曹

曹一侧的两个引脚是联通的,曹两侧的引脚在开关没按下时是不联通的

当按键按下之后,4个脚全部联通,为避免用错,建议使用时用对角的两个引脚,这样按下才会联通,不容易用错

二、开发板上按键分类

上图,清晰明了

三、原理图

四、原理

当按键按下,对应的引脚机会被拉为低电平,读取引脚电平就知道哪个按键被按下了

五、编程

5.1 创建工程

复制工程模板,改名“6.独立按键”,进入工程文件夹打开工程

5.2 现象说明

当按下S2,数码管显示的一位数+1

5.3 代码

#include <reg52.h>
 
typedef unsigned char uchar;
typedef unsigned int uint;
 
void delay(unsigned int i);
void SEG_DIS(uchar position, uchar number);
 
uchar we[8];
uchar du[25];
 
sbit DU = P2^6; //数码管段选
sbit WE = P2^7; //数码管位选
sbit key_s2 = P3^0;
 
void main()
{
    uchar num;
    SEG_DIS(1,num);
    while(1)
    {
        if (key_s2 == 0)
        {
            delay(20);      //按键消抖
            if (key_s2 == 0)
            {
                num++;
                if (num == 10)  //当num加到10,让nun重新变成0
                    num = 0;
                SEG_DIS(1,num); //实现按下立马改变现实值
            }
            while (!key_s2);    //松手检测,避免按着按键没松手导致数值连续增加
        }
    }
}
 
void SEG_DIS(uchar position, uchar number)
{
    DU = 0;
    WE = 0;
    P0 = we[position - 1];
    WE = 1;
    WE = 0;
    
    P0 = du[number];
    DU = 1;
    DU  = 0;
    delay(1);
}
 
uchar we[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};
uchar du[]={ 
                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(unsigned int i)
{
    unsigned int j;
    for (; i > 0; i--)
        for (j = 114; j > 0; j--);
}

显示效果为按下s2,数码管显示数值立马+1,如果数值为9再按下s2,显示数值变为0

5.4 添加s3按下-1代码

//在main函数前面添加
sbit key_s3 = P3^1;
 
//在while循环里面添加如下代码
if (key_s3 == 0)
{
    delay(20);
    if (key_s3 == 0 
    {
        num--;
        SEG_DIS(1,nu
    }
    while (!key_s3);

添加这两处代码就行了,按下s2数码管数值+1,当数值=9再按下s2数码管显示0;当数码管数值≠0,按下s3数值-1,当数值 == 0,按下s3无反应。均是按下立即触发而不是松手触发。

posted @ 2025-11-08 15:15  BO_S  阅读(17)  评论(0)    收藏  举报
页脚 测试文本