森侃 2024-03-14 22:54 采纳率: 60%
浏览 5
已结题

蓝桥杯单片机矩阵按键

新发现,如果不使用最后一列的矩阵按键是没有问题的,这是和定时器一冲突了吗,好奇怪呀

在下面这个代码中,我是使用定时器1进行数码管的刷新,2ms,然后通过矩阵按键进行对温度参数的加减,在按键函数中,如果没有第二个按键(就是L4==0这一部分的函数先去掉)L3==0的这个按键没有任何影响,按一下可以正常减,但如果两个都在,就会一直加,根本不需要按按键,这是怎么回事呀

#include "Key.h"
void key()
{
    H3=0;
    H1=H2=H4=1;
    L1=L2=L3=L4=1;
    if(L3==0)
    {
        while(L3==0)para_display();
        para--;
    }
    if(L4==0)
    {
        while(L4==0) para_display();
        para++;
    }
}
//key.h
#include <STC15F2K60S2.H>
#include "BL.h"
#include "System.h"
#include "onewire.h"
#include "NE555.h"
#include "ds1302.h"
sbit H1=P3^0;
sbit H2=P3^1;
sbit H3=P3^2;
sbit H4=P3^3;
sbit L1=P4^4;
sbit L2=P4^2;
sbit L3=P3^5;
sbit L4=P3^4;

void key();
#endif
//ne555.c
#include "NE555.h"
void Timer1_Init(void)        //1毫秒@12.000MHz
{
    TMOD &= 0x0F;            //设置定时器模式
    TMOD |= 0x10;            //设置定时器模式
    TL1 = 0x18;                //设置定时初始值
    TH1 = 0xFC;                //设置定时初始值
    TF1 = 0;                //清除TF1标志
    TR1 = 1;                //定时器1开始计时
    
    ET1=1;
    EA=1;
}
void Timer1_Service()  interrupt 3
{
    TL1 = 0x18;                //设置定时初始值
    TH1 = 0xFC;                //设置定时初始值
    time_smg_2ms++;
    if(time_smg_2ms==2)
    {
        time_smg_2ms=0;
        SMG_Bit(number[number_i],number_i);
        number_i++;
        if(number_i==8)
            number_i=0;
        P0=0xff;
    }
}

//main.c
#include <STC15F2K60S2.H>
#include "System.h"
#include "BL.h"
#include "onewire.h"
#include "NE555.h"
#include "ds1302.h"
#include "Key.h"
int main()
{
    Close();
    DS18B20_Read_init();
    Delay750ms();
    DS18B20_Read_init();
    DS1302_Write();
    Timer1_Init();
    while(1)
    {
        key();
        para_display();
        //DS18B20_Read_init();
        //para_display();
        //DS1302_display_1();
        //DS18B20_display();
        
        
        
        
        Key_Val=Key_Read();
        Key_Down=Key_Val&(Key_Val^Key_Old);
        Key_Up=~Key_Val&(Key_Val^Key_Old);
        Key_Old=Key_Val;
        switch(Key_Down)
        {
            case 4:
        }
    }
}
  • 写回答

2条回答 默认 最新

  • 关注

    森侃 晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    在这段代码中,你使用定时器1来刷新数码管,每2ms刷新一次。然后通过矩阵按键对温度参数进行加减操作。但是在按键函数中,如果同时按下L3和L4按键,会出现一个问题:无需按下按键,参数会一直增加。

    这个问题的原因是在按键函数中,如果同时按下L3和L4按键时,L3为0的条件先被满足,进入if (L3==0)的逻辑分支,参数减小了1。然后在第一个while循环中,等待L3不再为0,但是由于同时按下了L4,L3在没有释放的情况下一直为0,导致减小的1会被多次执行,参数一直减小。

    解决这个问题的方式有以下几步:

    1. 在按键函数中,添加一个判断条件,判断是否存在同时按下L3和L4的情况。如果同时按下了L3和L4,不执行任何操作,直接返回。
    2. 在按键函数中,对L4的判断放在L3之前,这样无论是否同时按下L3和L4,都会先执行L3的判断。
    3. 修改按键函数中的while循环的判断条件,不再使用L3和L4的判断条件,而是改为使用一个新的标志位flag,在L3按键松开后将flag置为1,来进行参数减小的操作。

    修改后的代码如下:

    #include "Key.h"
    
    int flag = 0;
    
    void key() {
        H3=0;
        H1=H2=H4=1;
        L1=L2=L3=L4=1;
        
        if(L4==0)
        {
            while(L4==0) para_display();
            flag = 0;  // 将flag置为0表示按下了L4
            para++;
        }
        
        if(L3==0 && flag)
        {
            while(L3==0) para_display();
            para--;
        }
        flag = 1;  // 将flag置为1表示按下了L3并已经松开
    }
    
    // main.c 中的代码保持不变
    
    

    通过上述修改,问题应该可以得到解决。重新编译和测试代码后,应该能够正确进行参数的加减操作了。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月15日
  • 修改了问题 3月14日
  • 修改了问题 3月14日
  • 创建了问题 3月14日

悬赏问题

  • ¥15 求高通平台Softsim调试经验
  • ¥15 canal如何实现将mysql多张表(月表)采集入库到目标表中(一张表)?
  • ¥15 wpf ScrollViewer实现冻结左侧宽度w范围内的视图
  • ¥15 栅极驱动低侧烧毁MOSFET
  • ¥30 写segy数据时出错3
  • ¥100 linux下qt运行QCefView demo报错
  • ¥50 F1C100S下的红外解码IR_RX驱动问题
  • ¥20 基于matlab的航迹融合 航迹关联 航迹插补
  • ¥15 用Matlab实现图中的光线追迹
  • ¥15 联想笔记本开机出现系统更新界面