欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

TX-1C 51 单片机开发板学习】第 5 讲-独立键盘、矩阵键盘检测原理与实现

最编程 2024-04-13 22:47:29
...

键盘的分类
  • 编码键盘
    键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘.
  • 非编码键盘
    而靠软件编程来识别的称为非编码键盘;在单片机组成的各种系统中,用的最多的是非编码键盘。也有用到编码键盘的。
    非编码键盘有分为:独立键盘行列式(又称为矩阵式)键盘。

TX-1C单片机键盘电路

4个独立按键

4个独立按键: S2-S5

按键 标识 接口
S2 LCDEN P3_4
S3 RS P3_5
S4 WR P3_6
S5 RD P3_7

矩阵键盘

注意:实际上板子上的矩阵键盘是接在P3口

代码实现

以下为练手代码,未完全按课程抄写,代码在SDCC环境下编译(与keil环境和语法有差异,keil不能直接编译),完整代码需要参考git仓库。 -> 代码地址

点击直接点亮LED

//点击直接点亮LED
void keybord_show_led(void)
{
    unsigned char p3Value;
    while (1)
    {
        //将P3口直接输入给P1 LED口
        //键盘s2-s5直连的d5-d8
        p3Value = P3;
        P1 = p3Value;
    }
}

循环显示数字

//循环显示数字
void keybord_show_num(void)
{

    P0 = 0x2B; //101011B
    P2_7 = 1;  //开启位选 //低电位显示,数码管位置与二进制是反的
    P2_7 = 0;  //关闭位选

    char i = 0;
    do
    {
        P0 = TBL_DIGITAL_DISPALY[i];
        P2_6 = 1; //开启段选
        P2_6 = 0; //关闭段选

        //以下两阻塞模拟按键按下抬起的操作
        //P3_5对应S3按键,点下为低电平
        //高电阻塞
        while (P3_5)
        {
            //延时消抖
            //delay(1);
        }
        //延时消抖
        delay(50);
        //低电阻塞
        while (!P3_5)
        {
            //延时消抖
            //delay(1);
        }
        //延时消抖
        delay(50);

        i++;
        if (i >= 10)
        {
            i = 0;
        }
    } while (1);
}

根据矩阵键盘显示数字

实现思路,扫描4个低电位,再去高电位匹配

//根据矩阵键盘显示数字
void keybord_show_4x4(void)
{
    //重置段选位选
    P2_6 = P2_7 = 0;

    P0 = 0x2A; //101010B
    P2_7 = 1;  //开启位选 //低电位显示,数码管位置与二进制是反的
    P2_7 = 0;  //关闭位选

    char keys[] = {0b1110, 0b1101, 0b1011, 0b0111};

    while (1)
    {
        //执行矩阵键盘扫描
        for (char i = 0; i < sizeof(keys); i++)
        {
            P3 = keys[i] | 0b11110000;
            char p3data = P3; //要把值取出来使用,否则可能会有问题
            char h_data = p3data >> 4;
            for (char j = 0; j < sizeof(keys); j++)
            {
                if (h_data == keys[j])
                {
                    unsigned int digital_index = i * 4 + j;
                    P0 = TBL_DIGITAL_DISPALY[digital_index];
                    P2_6 = 1; //开启段选
                    P2_6 = 0; //关闭段选

                    //P2_3为蜂鸣器
                    P2_3 = 0;  //开启
                    delay(10); //约为20ms
                    P2_3 = 1;  //关闭

                    //跳出两层循环,采用goto
                    goto LBL_END_KBD_SCAN;
                }
            }
        }

    //标签,结束扫描
    LBL_END_KBD_SCAN:
        continue; //只为让编译器不报警告
    }
}