如何利用矩阵键盘连续输入两个数字

2019-07-20 15:45发布

本帖最后由 骓风91 于 2016-10-28 15:20 编辑

如题 矩阵扫描程序已经写好了  也能够输出对应的数值了  但是我需要连续输入两个数字并将这两个数字存下来用 哪位大神可以帮我指点一下代码如何写。

int main( void )
{        
        WDTCTL = WDTPW + WDTHOLD;
        OLED_Init();                //初始化OLED  
        OLED_Clear();
        while(1)
        {
            delay_ms(200);
            OLED_Clear();
            numSet = scanNum();   // 这个函数可以输出单个值
            OLED_ShowNum(80,6,numSet,3,16);//显示按键值         


        }         
        
}

char key = 0;
//延时消抖
void delays()
{
    int v=1000;
    while(v!=0)
      v--;
}
//按键扫描
void keyScan(void)
{
    char sccode,recode;
    //将P9.0、P9.1、p9.2、p9.3、设置为输出方向 将P9.4、p9.5、p9.6、P9.7设置为输入方向
    P9DIR = 0X0f;
  //将所有输出置为低电平
    P9OUT = 0X00;
    if((P9IN & 0Xf0) != 0Xf0)   //判断是否有有键按下(即输出全部置低  检测输入是否全部为高),若有 往下执行
    {
        delays();
        if((P9IN&0xf0)!=0xf0)     //再次判断列中是否是干扰信号,不是则向下执行
        {
          //从第1行进行扫描  将第一行置低 其他三行置高 检测输出是否全部是高电平 1111 1110
            sccode=0xfe;            
            //行扫描完成(4行已全部扫描完)sccode为1110 1111 停止while程序   
            while((sccode&0X10) !=0)
            {
                P9OUT = sccode;         //  行扫描码   
                if((P9IN&0xf0)!=0Xf0)  //本行有键按下(即P1(真实的状态)的高四位不全为1)
                {
                    recode=(P9IN&0xf0)|0x0f;  //列(列处于高四位,低四位补1)
                    key=(sccode & recode);     //行和列 (0表示行与列的位置)
                    break;
                 }
                else
                {
                   sccode=(sccode<<1)|0x01;   ;//行扫描码左移一位  
                 }
            }
        }
    }

}
//将按键转换为对应数值
int transNum(void)
{
   int num;
   delays();
   keyScan();
   switch(key)
   {
    case 0xee: num = 0;break;    // 1110 1110
    case 0xde: num = 1;break;    // 1101 1110
    case 0xbe: num = 2;break;    // 1011 1110
    case 0x7e: num = 3;break;    // 0111 1110

    case 0xed: num = 4;break;    // 1110 1101
    case 0xdd: num = 5;break;    // 1101 1101
    case 0xbd: num = 6;break;    // 1011 1101
    case 0x7d: num = 7;break;    // 0111 1101

    case 0xeb: num = 8;break;    // 1110 1011
    case 0xdb: num = 9;break;    // 1101 1011
//    case 0xbb: num = 0;break;    // 1011 1011
//    case 0x7b: num = 0;break;    // 0111 1011
//   
//    case 0xe7: num = 0;break;    // 1110 0111
//    case 0xd7: num = 0;break;    // 1101 0111
//    case 0xb7: num = 0;break;    // 1011 0111
//    case 0x77: num = 0;break;    // 0111 0111
    default: break;
   }
   return num;
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
dirtwillfly
1楼-- · 2019-07-20 17:08
 精彩回答 2  元偷偷看……
骓风91
2楼-- · 2019-07-20 20:36
dirtwillfly 发表于 2016-10-28 09:31
设置一个数组,把每个数都存放在数组里。然后用shownux函数逐个显示出来

while(1)
        {
            delay_ms(200);
            OLED_Clear();
            num[0] = scanNum();   // 这个函数可以输出单个值
            num[1] = scanNum();
            OLED_ShowNum(80,6,num[0]*10+num[1],3,16);//显示按键值         
       }你说的是这样吗   如果这样的话这个数组一直在while里刷新数值啊
dirtwillfly
3楼-- · 2019-07-20 21:01
 精彩回答 2  元偷偷看……
骓风91
4楼-- · 2019-07-20 22:59
dirtwillfly 发表于 2016-10-28 10:09
不是这样的。不太清楚你的OLED_ShowNum()函数是如何实现的,但看它的参数,应该是包含显示屏 ...

先不管显示这句    这样也不能连续得到两个数字啊  while循环中后面的值会把刚刚输进去的给覆盖掉啊
dirtwillfly
5楼-- · 2019-07-21 01:00
骓风91 发表于 2016-10-28 10:39
先不管显示这句    这样也不能连续得到两个数字啊  while循环中后面的值会把刚刚输进去的给覆盖掉啊
...

建议你上传下OLED_ShowNum的源码
这个函数的5个参数里,有位置信息的,在不同的位置显示不同的字符,不会覆盖的
骓风91
6楼-- · 2019-07-21 02:58
 精彩回答 2  元偷偷看……

一周热门 更多>