overdoes_218 2024-03-04 17:27 采纳率: 0%
浏览 4
已结题

51单片机如下程序怎样把矩形键盘输入的值存放到数组里面去

51单片机如下程序怎样把矩形键盘输入的值存放到数组里面去?比如说我按键按下的是“1”,存放到数组的元素里面去。有实例参考一下吗?

#include<reg51.h>
sbit lcd_RS=P2^0;
sbit lcd_RW=P2^1;
sbit lcd_E=P2^2;
char key[]={0,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x30};  //键值
char key2[]="OK";
char table[]="password";
char table1[]="input:";
 
delay(unsigned int x)          
{       
    unsigned int i;
    for(x=0;x<100;x++)
        for(i=0;i<x;i++);
}

write_com(unsigned char com )     
{
    while(lcd_busy());
    lcd_RS=0;
    lcd_RW=0;
    delay(200);
    P0=com;
    delay(200);
    lcd_E=1;
    delay(200);
    lcd_E=0;
}
write_dat(unsigned char dat ) 
{
    while(lcd_busy());
    lcd_RS=1;
    lcd_RW=0;
    P0=dat;
    delay(200); 
    lcd_E=1;
    delay(200);
    lcd_E=0;
}
lcd_busy()
{ 
    unsigned char temp;
    lcd_RS=0;
    lcd_RW=1;
    delay(20);
    P0=0xff;
    delay(20);
    lcd_E=1;
    delay(20);
    temp=P0;
    delay(20);
    lcd_E=0;
    return(temp&0x80);
}
init()                       
{ 
    write_com(0x01);
    write_com(0x38);
    write_com(0x0c);
    write_com(0x06);
} 
juxingjianpan()                      
{ 
    unsigned char KeyNumber,x,y;
    P1=0x0f;              
    x=P1;
    P1=0xf0;
    y=P1;
    switch(x+y)
    { 
        case 0xee:      KeyNumber=1;break;
        case 0xde:      KeyNumber=2;break;
        case 0xbe:      KeyNumber=3;break;
        case 0x7e:      KeyNumber=4;break;
        case 0xed:      KeyNumber=5;break;
        case 0xdd:      KeyNumber=6;break;
        case 0xbd:      KeyNumber=7;break;
        case 0x7d:      KeyNumber=8;break;
        case 0xeb:      KeyNumber=9;break;         
        case 0xdb:      KeyNumber=10;break;
        case 0xbb:        KeyNumber=11;break;
    }
    return KeyNumber;
}                    
void main() {
unsigned int i,KeyNum,password="1234";
    init();  
    write_com(0x80);
    for(i=0;i<8;i++)
    {     
        write_dat(table[i]);  
    }
    write_com(0xc0);
    for(i=0;i<6;i++)
    {     
        write_dat(table1[i]);  
    }
    while(1)
    { 
         static unsigned char i = 0,x,y;
        write_com(0xc6 + i);
        KeyNum=juxingjianpan();
        z=juxingjianpan();    
        if(KeyNum)
        {      
            if(KeyNum<=10)
            {   if(x<=3)   
                {write_dat(key[KeyNum]);
                 delay(5);              
                 i++;
                 }
                 x++;
            }

                        
            if(KeyNum==11)     //确认键
            {     
                 if(KeyNum==password)
                {  write_com(0x01);
                   delay(20);
                   write_com(0x8a);
                   for(y=0;y<2;y++)
                   {write_dat(key2[y]);
                    delay(5);
                    }
                 }
            }      
        }
    }
}

  • 写回答

3条回答 默认 最新

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

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

    首先,对于您的问题,您给出的51单片机程序中已经有矩形键盘按键识别的部分(juxingjianpan()函数),它会根据行线和列线的状态确定按下的键值,并通过KeyNumber返回对应的ASCII码。然而,要将输入的按键值存入数组,您需要定义一个数组来存储密码,并在按下有效键时将其添加到数组中。

    下面是如何修改代码以实现该功能:

    #define PASSWORD_LENGTH 4 // 定义密码最大长度为4位
    
    char password[PASSWORD_LENGTH]; // 创建一个字符数组存放密码
    unsigned int password_index = 0; // 密码数组索引,用于记录已输入密码的位置
    
    // ...
    
    void main() {
        unsigned int i, KeyNum;
        
        // ... 初始化液晶屏显示部分 ...
        
        while(1) {
            KeyNum = juxingjianpan();
            
            if(KeyNum && password_index < PASSWORD_LENGTH) { // 如果检测到有效按键且未达到密码最大长度
                if(KeyNum <= 10) { // 只处理数字键
                    password[password_index++] = key[KeyNum]; // 将按键值存入密码数组,并增加数组索引
                    write_dat(key[KeyNum]); // 显示在液晶屏上
                    delay(5); 
                }
            } else if(KeyNum == 11) { // 确认键
                // 检查输入的密码是否正确,这里假设已经有一个预设的密码"1234"
                if(memcmp(password, "1234", PASSWORD_LENGTH) == 0) {
                    // 密码正确,执行相应操作,如清屏并显示"OK"
                    write_com(0x01);
                    delay(20);
                    write_com(0x8a);
                    for(i = 0; i < 2; i++) {
                        write_dat(key2[i]);
                        delay(5);
                    }
                }
                // 清空密码输入状态,准备下次输入
                password_index = 0;
            }
        }
    }
    

    以上代码对原始程序进行了以下改动:

    1. 添加了password数组和password_index变量。
    2. 当检测到有效按键并且密码未满时,将按键值存入password数组,并更新password_index
    3. 对确认键进行判断时,检查password数组中的内容是否与预设密码匹配,若匹配则执行相应操作,不匹配或输入完成则清空password_index准备下一轮输入。
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月11日
  • 创建了问题 3月4日

悬赏问题

  • ¥30 基于信创PC发布的QT应用如何跨用户启动后输入中文
  • ¥20 非root手机,如何精准控制手机流量消耗的大小,如20M
  • ¥15 远程安装一下vasp
  • ¥15 自己做的代码上传图片时,报错
  • ¥15 Lingo线性规划模型怎么搭建
  • ¥15 关于#python#的问题,请各位专家解答!区间型正向化
  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型
  • ¥15 VB.NET如何绘制倾斜的椭圆