单片机矩阵键盘同一个按键多个结果问题

梦韵116 梦韵116 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

 
    今下午我自己尝试写了一个矩阵键盘的代码(扫描列再匹配模式),预想成果是这样的:第一列的第1~4行按键控制LED1~4,第二列的第1~4行按键控制LED5~6。第三第四列逻辑重复第一第二列。(下面按键我以行列排序,例如第一列第二个按键序号就是12)
    然后当我写好后发现第三第四列正常运行,但是第一第二列就有问题了,当连续按下第一第二列的的按键时会有两个灯间接亮起,也就是说当我连续按下11的时候(无论按下的间隔大还是小)LED1和LED5会间接亮起,而且两个灯的转换间隔也不一样(相对稳定的按下速度时),后面也类似12是LED2和LED6,13是LED3和LED7,14是LED4和LED8,第二列也是同样结果21=11,22=12,23=13,24=13。
    我尝试过修改消抖延迟,但不管是改大还是改小最后都是一样。
    然后我尝试分别注释掉第一列和第二列的代码,发现可能是其中有错:注释掉第一列代码后,确实第一列按键不工作了,但是第二行依旧是相同问题。反过来只注释第二行也一样.
    我用的单片机芯片型号是IAP15F2K61S2(就是学校给的板子),
在对P3赋值时已经写过用P44 P42代替P37 P36口。有消抖处理和松手检测。第三第四列对比第一第二列除了一开始的P3赋值和switch匹配的数值不同(以及没有P44 P42)之外,代码完全一样。
    对这个问题我已经找过几个ai,看了好几个原理视频,翻了十几个网页,还试过硬件仿真(但是按下按键的时候不知道为什么会报错然后弹出去),弄了快四个小时还是找不出问题,所以就来请问一下

#include <STC15F2K60S2.H>
#include <intrins.h>
 
#define uchar unsigned char
#define uint unsigned int
    
sbit LED1=P0^0;
sbit LED2=P0^1;
sbit LED3=P0^2;
sbit LED4=P0^3;
 
 
 
void Delay5ms();    //@11.0592MHz
void key2();
 
void main()
{
    P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
    while(1)
    {
        key2();
    }
}
 
void key2()
{
    uchar temp;
    
    P3=0X7F;P44=0;//扫描第一列
    temp=P3;temp&=0x0f;
    if(temp!=0x0f)
    {
        Delay5ms();//消抖处理
        temp=P3;temp&=0x0f;
        if(temp!=0x0f)//确认按下
        {
            temp=P3;//重新赋值
            switch(temp)
            {
                case 0x7E: P0=0XFE;break;//LED1
                case 0x7D: P0=0XFD;break;//LED2
                case 0x7B: P0=0XFB;break;//LED3
                case 0x77: P0=0XF7;break;//LED4
            }
            while(temp!=0x0f)
            {
                temp=P3;
                temp&=0x0f;
            }
        }
    }
    
    
    P3=0XBF;P42=0;//扫描第二列
    temp=P3;temp&=0x0f;
    if(temp!=0x0f)
    {
        Delay5ms();
        temp=P3;temp&=0x0f;
        if(temp!=0x0f)
        {
            temp=P3;
            switch(temp)
            {
                case 0xbE: P0=0XEF;break;//LED5
                case 0xbD: P0=0XDF;break;//LED6
                case 0xbB: P0=0XBF;break;//LED7
                case 0xb7: P0=0X7F;break;//LED8
            }
            while(temp!=0x0f)
            {
                temp=P3;
                temp&=0x0f;
            }
        }
    }
    
    
    P3=0XDF;//扫描第三列
    temp=P3;temp&=0x0f;
    if(temp!=0x0f)
    {
        Delay5ms();
        temp=P3;temp&=0x0f;
        if(temp!=0x0f)
        {
            temp=P3;
            switch(temp)
            {
                case 0xDE: P0=0XFE;break;//LED1
                case 0xDD: P0=0XFD;break;//LED2
                case 0xDB: P0=0XFB;break;//LED3
                case 0xD7: P0=0XF7;break;//LED4
            }
            while(temp!=0x0f)
            {
                temp=P3;
                temp&=0x0f;
            }
        }
    }
    
    
    P3=0XEF;//扫描第四列
    temp=P3;temp&=0x0f;
    if(temp!=0x0f)
    {
        Delay5ms();
        temp=P3;temp&=0x0f;
        if(temp!=0x0f)
        {
            temp=P3;
            switch(temp)
            {
                case 0xEE: P0=0XEF;break;//LED5
                case 0xED: P0=0XDF;break;//LED6
                case 0xEB: P0=0XBF;break;//LED7
                case 0xE7: P0=0X7F;break;//LED8
            }
            while(temp!=0x0f)
            {
                temp=P3;
                temp&=0x0f;
            }
        }
    }
    
    
}
 
void Delay5ms()        //@11.0592MHz
{
    unsigned char i, j;
 
    i = 54;
    j = 199;
    do
    {
        while (--j);
    } while (--i);
}
 

 

...全文

相关推荐

51单片机程序(矩阵键盘、独立按键、数码管、PWM输出)

内含51单片机程序主要包含矩阵键盘、独立按键、数码管以及PWM输出的程序,独立按键消抖,矩阵键盘控制8位静态数码管,矩阵键盘控制8位动态数码管。很适合于51单片机的学习。

啊_是汪汪啊

单片机独立按键和矩阵键盘概念及原理

一、基本知识 1.按键分类与输入原理 按键按照结构原理科分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关灯;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键。 在单片机应用系统中,除了复位按键有专门的复位电路及专一的复位功能外,其他按键都是以开关状态来设置控制功能或输入数据的。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能,键信息输入时与软件结构密切相关的过程。 对于一组键或一个键盘,总有一个接口电路与CPU相连。CPU可以采用查询或中断方式了解有无将按键输入,并检查是哪一个按键按下,将该键号送人累加器,然后通过跳转指令转入执行该键的功能程序,执行完成后再返回主程序。 2.按键结构与特点 微机键盘通常使用机械触点式按键开关,其主要功能式把机械上的通断转换为电气上的逻辑关系。也就是说,它能提供标准的TTL逻辑电平,以便于通用数字系统的逻辑电平相容。机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定的时间触点机械抖动,然后其触点才稳定下来。其抖动过程如下图1所

weixin_38686860

单片机中的独立按键与矩阵键盘

1.按键分类与输入原理 按键按照结构原理科分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关灯;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键。 在单片机应用系统中,除了复位按键有专门的复位电路及专一的复位功能外,其他按键都是以开关状态来设置控制功能或输入数据的。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能,键信息输入时与软件结构密切相关的过程。 对于一组键或一个键盘,总有一个接口电路与CPU相连。CPU可以采用查询或中断方式了解有无将按键输入,并检查是哪一个按键按下,将该键号送人累加器,然后通过跳转指令转入执行该键的功能程序,执行完成后再返回主程序。 2.按键结构与特点 微机键盘通常使用机械触点式按键开关,其主要功能式把机械上的通断转换为电气上的逻辑关系。也就是说,它能提供标准的TTL逻辑电平,以便于通用数字系统的逻辑电平相容。机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定的时间触点机械抖动,然后其触点才稳定下来。其抖动过程如下图1所示,抖动时间的长

weixin_38724370

4*4矩阵键盘 按键消抖 单片机c语言

4*4矩阵键盘 按键消抖 单片机c语言 键盘扫描子程序

dubangsheng

51单片机 矩阵键盘计算器

非常适合新手学习51单片机,利用1602显示,里面有原理图,根据硬件看代码,非常容易理解

奋天
评论
收藏 已收藏
分享
返回顶部
梦韵116
单片机/工控 27,522 成员 28,796 内容