hyp永恒冰川 2024-03-10 11:49 采纳率: 66.7%
浏览 8
已结题

c51单片机使用矩阵键盘编写密码锁问题求解

我用c51 驱动LCD1602写了一个键盘矩阵密码锁,但是在程序中遇到了一点问题,如下代码中Compare函数是用来比较矩阵输入的密码是否与原先设定的密码是否一致(这里设定的密码是666666),如果一致就在LCD1602第二行最后输出PASS,反之则输出FAIL,但是当我吧程序烧录到c51单片机测试的时候发现以下代码中TEMP的值无论输入的密码是否正确他的值始终是1,经过反复测试发现用户通过矩阵键盘输入的值是正常的,反复检查逻辑也没发现问题所在,望有相关小伙伴解答疑惑,在此献上真挚的感谢!


#include <REGX52.H>
#include "LCD1602.H"
#include "DELAY.H"
#include "MATRIX.H"

unsigned int PASS[6] = {6,6,6,6,6,6};
unsigned int KEY_PASS[6] = {0};

unsigned int KeyNumber = 0;
unsigned int a = 0;
unsigned int j = 0;
unsigned int k = 0;
int TEMP;

int Compare()
{
    int i = 0;
//    int count = 0;
    
    for(i;i++;i<6)
    {
        if(KEY_PASS[i] != PASS[i]) 
            return 0;
    }
    
    return 1;
}

void BACK_ZERO()
{
    int i = 0;
    
    for(i;i++;i<6)
        KEY_PASS[i] = 0;
}

void ARR_DEBUG()
{
    int i = 0;
    
    for(i; i < 6; i++)
        LCD_ShowNum(2,i+7,KEY_PASS[i],1);
}

void main()
{
    LCD_Init();
    LCD_ShowString(1,1,"Input PassWord:");
    LCD_ShowNum(2,1,000000,6);

    while(1)
    {
        ++a;
        KeyNumber = 0;
        //KeyNumber = MatrixKey();
        while((KeyNumber = MatrixKey()) == 0 || 
            KeyNumber == 11 || KeyNumber == 12 || 
            KeyNumber == 13 || KeyNumber == 14 || 
            KeyNumber == 15 || KeyNumber == 16);
        
        if(a < 6)
        {
            if(KeyNumber)
            {
                if(KeyNumber == 10)
                {
                    KeyNumber = 0;
                    KEY_PASS[k] = KeyNumber;
                    LCD_ShowNum(2,a,KeyNumber,1);
                    k++;
                }
                else if(KeyNumber < 10)
                {
                    KEY_PASS[k] = KeyNumber;
                    LCD_ShowNum(2,a,KeyNumber,1);
                    k++;
                }
            }
        }
        else if(a == 6)
        {
            if(KeyNumber)
            {
                if(KeyNumber == 10)
                {
                    KeyNumber = 0;
                    KEY_PASS[k] = KeyNumber;
                    LCD_ShowNum(2,a,KeyNumber,1);
                    k = 0;
                }
                else if(KeyNumber < 10)
                {
                    KEY_PASS[k] = KeyNumber;
                    LCD_ShowNum(2,a,KeyNumber,1);
                    k = 0;
                }
            }
            
            a = 0;
            **TEMP = Compare();
            
            if(TEMP)
            {
                LCD_ShowString(2,13,"PASS");
                //LCD_ShowNum(2,12,Compare(),1);
                //ARR_DEBUG();
                //while(1);
            }
            else
            {
                LCD_ShowString(2,13,"FAIL");
                //LCD_ShowNum(2,12,Compare(),1);
                //ARR_DEBUG();
                //while(1);
            }**
            
            for(j;j<50;j++)
                Delay20ms();
            LCD_ShowNum(2,1,000000,6);
            LCD_ShowString(2,13,"    ");
            j = 0;
            BACK_ZERO();
        }
    }
}

img

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-10 11:50
    关注

    引自免费微信小程序:皆我百晓生

    在您提供的代码中,Compare() 函数的逻辑是逐位比较 KEY_PASSPASS 数组中的元素。从您的描述来看,问题在于 TEMP 变量始终为1,这表明每次密码比较都返回成功(即认为输入的密码与预设密码一致),但实际上并非如此。

    经过分析,发现Compare()函数内的for循环条件有误:

    for(i;i++;i<6)
    

    应修改为:

    for(i = 0; i < 6; i++)
    

    修复后的 Compare() 函数如下:

    int Compare()
    {
        int i = 0;
        
        for(i = 0; i < 6; i++) // 修改此处循环条件
        {
            if(KEY_PASS[i] != PASS[i]) 
                return 0;
        }
        
        return 1;
    }
    

    同时,在主函数中,当用户按下“#”键时,您将 KeyNumber 赋值为0,并将其存入 KEY_PASS 数组。然而,矩阵键盘输入数字后,应当直接读取并存储该数字到数组,而不是按“#”键时赋值为0。以下是修正这一部分的代码:

    if(a < 6)
    {
        if(KeyNumber)
        {
            KEY_PASS[k] = KeyNumber; // 直接存储KeyNumber,无需判断是否等于10
            LCD_ShowNum(2,a,KeyNumber,1);
            k++;
        }
    }
    else if(a == 6)
    {
        ...
    }
    

    现在,Compare() 函数应该能正确比较输入的密码与预设密码了。但请注意,由于程序中对键盘输入数值范围的过滤存在疏漏,您需要确保仅在用户输入有效数字(0-9)时更新数组和显示内容,可将输入判断修改为:

    if(KeyNumber >= 0 && KeyNumber <= 9)
    {
        KEY_PASS[k] = KeyNumber;
        LCD_ShowNum(2,a,KeyNumber,1);
        k++;
    }
    

    最后,请确认您的矩阵键盘扫描函数 MatrixKey() 正确返回按键值且无其他潜在错误。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月10日
  • 已采纳回答 3月10日
  • 创建了问题 3月10日

悬赏问题

  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表