RYMCU

NO8.按键实验-NEBULA-VSCODE

devcui 3 年前
# nebula-vscode

所属作品集

按键原理

image.png

如图所示,K17-K20 共 4 个按键分别与单片机的 P3.0~P3.3 管脚连接。例如当按下按键 K17 后,P3.0 管脚为低电平,在单片机中通过检测 P3.0 管脚是否为低电平,便可知道 K17 是否按下。

对于需要大量按键的设计来说,一般都不采用独立按键的方式,因为每一个按键需要一个单片机的 I/O 口,造成资源的浪费。采用矩阵式按键可以有效的节省资源,矩阵式按键如下图所示:

image.png

如图 6-3 所示,4 排 4 列共 16 个按键,8 个 I/O,分别为 P3.0-P3.3,P3.4-P3.7,矩阵式按键采用扫描方式进行识别,包括行扫描和列扫描方式。以行扫描为例进行介绍,在单片机中首先使 P3.0 输出为低电平 0,P3.1-P3.3 输出为高电平。因此,第一行的按键 K1-K4 均有一个管脚接地,当 K1-K4 有按键按下时,按键另一个管脚对应的 I/O 口被拉至低电平,然后单片机检测 P3.4-P3.7 哪些管脚为低电平,便可确认 K1-K4 中哪些按键被按下。例如,K1 被按下,此时 P3.4 管脚为低电平。同理使 P3.1 输出低电平,P3.0,P3.2,P3.3 输出高电平,检测 P3.4-P3.7 的低电平可以识别 K5~K8,其它行的按键依次类推。

简单的说: K1 被按下,P30-P34 通,K1,K5 同时按下,P30-P34 通,K4 按下,P30-P37 通,可组合多按。

NebulaPI 按键

查看板子上带的电路图

image.png

可以看到 K1,2,3 对应的管脚为 P10,P11,P12,和 LED0,LED1,LED2 相同,所以按下相应的键,LED 就会亮起。

软件设计

#include "STC89xx.h"

// 模拟电报
// 按下k1 定时 1ms*1000 = 1s,蜂鸣器持续响1s (T0)
// 按下k2 定时 1ms*1000*2 = 2s,蜂鸣器持续响2s (T1)
// 这里直接使用 stc89.h里的东西了

#define FOSC 11059200
#define T_NUMBER_MS (65536 - FOSC / 12 / 1000)
int count1 = 0;
int count2 = 0;
void main()
{
    TMOD = 0b00010001;
    while (1)
    {

        // 低电平触发key1
        if (P10 == 0 && TF0 == 0)
        {
            P00 = 0;
            TL0 = T_NUMBER_MS;
            TH0 = T_NUMBER_MS >> 8;
            TR0 = 1;
            P16 = 0;
        }
        // 低电平触发key2
        if (P11 == 0 && TF1 == 0)
        {
            P00 = 0;
            TL1 = T_NUMBER_MS;
            TH1 = T_NUMBER_MS >> 8;
            TR1 = 1;
            P17 = 0;
        }
        // T0计时结束
        if (TF0 == 1)
        {

            TF0 = 0;
            TL0 = T_NUMBER_MS;
            TH0 = T_NUMBER_MS >> 8;
            count1++;
            if (count1 >= 50)
            {
                P00 = 1;
                count1 = 0;
                P16 = 1;
                // T0终止计时
                TR0 = 0;
            }
        }
        // T1计时结束
        if (TF1 == 1)
        {

            TF1 = 0;
            TL1 = T_NUMBER_MS;
            TH1 = T_NUMBER_MS >> 8;
            count2++;
            if (count2 >= 300)
            {
                P00 = 1;
                count2 = 0;
                P17 = 1;
                // T1终止计时
                TR1 = 0;
            }
        }
    }
}

所属作品集

后发布评论