找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5440|回复: 19
收起左侧

求助如何用矩阵键盘按出来任意两位数

  [复制链接]
ID:450993 发表于 2019-3-9 17:49 | 显示全部楼层 |阅读模式
您好,我想问个问题


51单片机如何用矩阵键盘按出来一个两位数,并送之LCD显示


我在做一个项目,温度继电器,想设置一个2位数的温度阈值


目前我能做到按一个健,能搞成10   20  30 这样的,但无法搞成想23   32这样的


想问下能指点下吗


我有想法,但代码敲不出来  尴尬


回复

使用道具 举报

ID:213173 发表于 2019-3-9 20:37 | 显示全部楼层
用矩阵键盘按一次键出来特定两位数或多位数都没有问题,按出来任意(随机)两位数也不难。但这有什么实际意义呢?
回复

使用道具 举报

ID:405033 发表于 2019-3-9 20:51 | 显示全部楼层
没有贴代码出来吗,而且按出23等这些数字不就是在显示那里改一下吗
回复

使用道具 举报

ID:487478 发表于 2019-3-9 21:15 | 显示全部楼层
将按键定义成加减就行了,基数自己定,如从10加,从10减之类
回复

使用道具 举报

ID:469417 发表于 2019-3-9 22:11 | 显示全部楼层
这个个位与10位要进行拆分才能正常显示,去看一下别人的代码

评分

参与人数 3黑币 +38 收起 理由
areyouok + 16 很给力!
春风十里吹 + 12 回帖助人的奖励!
zhengchong60 + 10 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:466164 发表于 2019-3-9 22:46 | 显示全部楼层
定一个数组:
uchar set[2];
set[0]=按键值
set[1]=按键值
把数组发到数码管。
回复

使用道具 举报

ID:137676 发表于 2019-3-9 23:18 | 显示全部楼层
这个好办!一个全局变量,一个全局数组。变量记录按键的次数,数组记录按键值。很容易的。
回复

使用道具 举报

ID:404797 发表于 2019-3-9 23:22 | 显示全部楼层
     不知你的要求如何,我设计了一个利用4X4键盘矩阵产生2位数的方案,不知对你有用吗,供参考。以下是原理图:
ask6a.JPG
以下是配套程序:
#include<reg51.h>
sbit kx0=P2^0;
sbit kx1=P2^1;
sbit kx2=P2^2;
sbit kx3=P2^3;
sbit ky0=P2^4;
sbit ky1=P2^5;
sbit ky2=P2^6;
sbit ky3=P2^7;
//====================================================
int KeyDown()
{char v,x,y;
x=4;y=4;
P2=0x0f;v=P2;
if(v!=0x0f){if(kx0==0)x=0;if(kx1==0)x=1;if(kx2==0)x=2;if(kx3==0)x=3;
             P2=0xf0;if(ky0==0)y=0;if(ky1==0)y=1;if(ky2==0)y=2;if(ky3==0)y=3;
             }
return x*4+y;
}
//###################################################
void main()
{char w,num,key;
  w=0;P0=0;
  while(1)
  {key=KeyDown();
   if(key<10)
   {key=KeyDown();while(key==KeyDown());
    if(w==0){num=key;w=1;}
else {num=num*10+key;w=0;}
    P0=(num/10)*16+num%10;
    }
   };
}

回复

使用道具 举报

ID:137676 发表于 2019-3-10 00:28 | 显示全部楼层
void key_delayms(unsigned char xms)
{
        unsigned char i,j;
                for(i=xms;i>0;i--)
                        for(j=110;j>0;j--);

        
}
void deep(unsigned char b_beep)
{
        unsigned char i;
        for(i=0;i<20;i++)
        {
                BEEP=0;
                key_delayms(4);
                BEEP=1;
                key_delayms(b_beep+4);
        }
}
unsigned char  keyscan()
{
        unsigned char  temp,key;
        key=0xff;
        key_port=0xfe;        //μúò»DD¼üÅì
        temp=key_port&0xf0;
        if(temp!=0xf0)
        {
                key_delayms(10);    //Ïû3y°′¼ü¶¶¶ˉ
                temp=key_port;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=key_port;
                        switch(temp)
                        {
                                case 0xee:        key='D';        break;
                                case 0xde:        key='C';        break;
                                case 0xbe:        key='B';        break;
                                case 0x7e:        key='A';        break;
                        }
                        while(temp!=0xf0)  //ìõ¼tÂú×ãê±êÇ1£»μè′y°′¼üêí·Å£»
                        {
                                temp=key_port;         //Õaá½¾äêÇÔö¼ó3ìDòμÄÎ趨DÔ
                                temp=temp&0xf0;
                        }
                }                                
        }
        key_port=0xfd;         //μú¶tDD¼üÅì
        temp=key_port&0xf0;
        if(temp!=0xf0)
        {
                key_delayms(10);    //Ïû3y°′¼ü¶¶¶ˉ
                temp=key_port;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=key_port;
                        switch(temp)
                        {
                                case 0xed: key=        '#';        break;
                                case 0xdd: key=        '9';        break;
                                case 0xbd: key=        '6';        break;
                                case 0x7d: key=        '3';        break;
                        }
                        while(temp!=0xf0)  //ìõ¼tÂú×ãê±êÇ1£»μè′y°′¼üêí·Å£»
                        {
                                temp=key_port;         //Õaá½¾äêÇÔö¼ó3ìDòμÄÎ趨DÔ
                                temp=temp&0xf0;
                        }
                }                                
        }
        key_port=0xfb;                              //μúèyDD¼üÅì   
        temp=key_port&0xf0;
        if(temp!=0xf0)
        {
                key_delayms(10);    //Ïû3y°′¼ü¶¶¶ˉ
                temp=key_port;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=key_port;
                        switch(temp)
                        {
                                case 0xeb:        key='0';        break;
                                case 0xdb:        key='8';        break;
                                case 0xbb:        key='5';break;
                                case 0x7b:        key='2';break;
                        }
                        while(temp!=0xf0)  //ìõ¼tÂú×ãê±êÇ1£»μè′y°′¼üêí·Å£»
                        {
                                temp=key_port;         //Õaá½¾äêÇÔö¼ó3ìDòμÄÎ趨DÔ
                                temp=temp&0xf0;
                        }
                }
        }
        key_port=0xf7;            //μúËÄDD¼üÅì
        temp=key_port&0xf0;
        if(temp!=0xf0)
        {
                key_delayms(10);    //Ïû3y°′¼ü¶¶¶ˉ
                temp=key_port;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=key_port;
                        switch(temp)
                        {
                                case 0xe7:        key='*';break;
                                case 0xd7:        key='7';break;
                                case 0xb7:        key='4';break;
                                case 0x77:        key='1';break;
                        }
                        while(temp!=0xf0)  //ìõ¼tÂú×ãê±êÇ1£»μè′y°′¼üêí·Å£»
                        {
                                temp=key_port;         //Õaá½¾äêÇÔö¼ó3ìDòμÄÎ趨DÔ
                                temp=temp&0xf0;
                        }
                }                                
        }
        key_port=0xff;
    if(key!=0xff)
    deep(10);
        return key;
}
回复

使用道具 举报

ID:137676 发表于 2019-3-10 00:46 | 显示全部楼层
void s_temp()
{
        key_dat=keyscan();
        if(key_dat!=0xff)
        {
                if((key_dat>='0')&&(key_dat<='9'))
                {
                        temp1[add]=key_dat-0x30;
                        switch (add)
                        {
                                case  0 :key_Data=temp1[0];
                                        break;
                                case  1 :key_Data=(temp1[0]*10)+temp1[1];
                                        break;
                        }
                        add++;
                       key_dat=0xff;
          }
          if(key_dat=='#')//表示确认
       {
             XXX=temp1[0]+temp1[1];   //xxx代表你的设定值
       }
}

评分

参与人数 1黑币 +7 收起 理由
太阳之子 + 7 谢谢

查看全部评分

回复

使用道具 举报

ID:479806 发表于 2019-3-10 08:20 | 显示全部楼层
使用:十位=ge/10,个位=ge%10
或者直接定义sprintf的空数组将你的结果按你想要的位数和格式打印出来
回复

使用道具 举报

ID:104472 发表于 2019-3-10 09:17 | 显示全部楼层
其实用矩阵的四个键就可以了,一个加,一个减,一个左移,一个右移,这个还可以根据实际进行增减。
回复

使用道具 举报

ID:310519 发表于 2019-3-10 10:05 | 显示全部楼层
比如你想输入温度值为120:

定义2个变量,一个用来处理输入input,一个用来存储输入的值temperature。

按下键,得到键值keyvalues,

if (input ==0)
{
    input =keyvalues;
}else{

      input =input *10 +keyvalues;
}

按下确定后,


temperature = input;

input =0;

评分

参与人数 1黑币 +3 收起 理由
太阳之子 + 3 谢谢

查看全部评分

回复

使用道具 举报

ID:404797 发表于 2019-3-10 11:15 | 显示全部楼层
      再次理解你的需求,发现你是要从键盘矩阵输入一个任意2位整数,并输出到LCD显示器上,为此本人将昨天的程序做了修改,做成一个从矩阵键盘获取任意2位整数的函数(其实可以简单获得任意整数),获取一个任意2位整数并在LCD上显示。以供参考。
下面是修改后的程序:
#include<reg51.h>
sbit kx0=P2^0;
sbit kx1=P2^1;
sbit kx2=P2^2;
sbit kx3=P2^3;
sbit ky0=P2^4;
sbit ky1=P2^5;
sbit ky2=P2^6;
sbit ky3=P2^7;

sbit rs=P3^5;
sbit rw=P3^6;
sbit E=P3^7;
//==============================================================================
void delay(int ii){int i;for(i=0;i<ii;i++);}
void writeCmd(unsigned char c){E=0;rw=0;rs=0;delay(50);delay(50);P1=c;delay(50);E=1;delay(50);E=0; }
void writeDat(unsigned char c){E=0;rw=0;rs=1;delay(50);delay(50);P1=c;delay(50);E=1;delay(50);E=0;}
void Prtstr(char *cp){char i=0;while(cp!=0){writeDat(cp);i++;}}
//------------------------------------------------------------------------------
int KeyDown()
{char v,x,y;
x=4;y=4;
P2=0x0f;v=P2;
if(v!=0x0f){if(kx0==0)x=0;if(kx1==0)x=1;if(kx2==0)x=2;if(kx3==0)x=3;
             P2=0xf0;if(ky0==0)y=0;if(ky1==0)y=1;if(ky2==0)y=2;if(ky3==0)y=3;
             }
return x*4+y;
}
//---------------------------------------------------------------
int GetNum()
{char w,num,key;
  w=0;
  while(1)
  {key=KeyDown();
   if(key<10)
   {key=KeyDown();while(key==KeyDown());
    if(w==0){num=key;w=1;}
else {num=num*10+key;w=0;P0=(num/10)*16+num%10;return num;}
    P0=(num/10)*16+num%10;

    }
   };
}
//################################################################
void main()
{int n;
writeCmd(0x38);writeCmd(0x0f);writeDat('a');
while(1)
{writeCmd(0x80);
  Prtstr("Please Input Int:");
  n=GetNum();writeCmd(0x80+0x40);Prtstr("Your Input=");
  writeDat(n/10+0x30);writeDat(n%10+0x30);
  }
}

程序运行载图如下:
ask6b.JPG

评分

参与人数 1黑币 +8 收起 理由
太阳之子 + 8 很感谢

查看全部评分

回复

使用道具 举报

ID:450993 发表于 2019-3-10 22:47 来自手机 | 显示全部楼层
疯子本人 发表于 2019-3-9 20:51
没有贴代码出来吗,而且按出23等这些数字不就是在显示那里改一下吗

我想设置个温度阀值,能刷新的那种
回复

使用道具 举报

ID:450993 发表于 2019-3-10 22:48 来自手机 | 显示全部楼层
谢谢,太谢谢了各位大哥哥了,谢谢
回复

使用道具 举报

ID:450993 发表于 2019-3-10 22:52 | 显示全部楼层
twp90 发表于 2019-3-9 21:15
将按键定义成加减就行了,基数自己定,如从10加,从10减之类

如果是10的基数的话,这个简单,我会
回复

使用道具 举报

ID:450993 发表于 2019-3-14 19:12 | 显示全部楼层
已解决
回复

使用道具 举报

ID:498702 发表于 2019-3-26 20:50 | 显示全部楼层

楼主方便将你的程序私发一下看看吗,我最近学习也遇到了这个问题,好长时间了都没有解决。方便的话,加一下qq:769868782
回复

使用道具 举报

ID:492413 发表于 2019-12-12 20:25 来自手机 | 显示全部楼层
怎么通过矩阵键盘输入一个数据然后这个数据传出去呢 而且能反复输入  求解答
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表