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

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条回答
武当奇人
1楼-- · 2019-07-21 03:23
 精彩回答 2  元偷偷看……
骓风91
2楼-- · 2019-07-21 05:55
武当奇人 发表于 2016-10-28 12:23
没有你子函数的代码无法给出详细的解决办法
但是你可以试一下这个思路:弄一个确定键,在确认件输入之前, ...

子函数我已经贴上了  没有中断 我不知道如何取出这两位输入的数字
justtest111
3楼-- · 2019-07-21 10:37
你这个可能要使用sprintf配合数组来实现,仅凭你现在有函数配合主循环是没办法实现的。
cov0xt
4楼-- · 2019-07-21 13:22
本帖最后由 cov0xt 于 2016-10-28 16:23 编辑

不知道我理解的对不对,你要问的是不是如何保存住一个值,而不受循环影响?


1、弄个全局变量


或者


2、使用静态变量static 变量A,static 变量B


--------


static 变量A;
static 变量B;
循环开始
变量B=变量A;
变量A=键盘输入值;
循环结束
皈依
5楼-- · 2019-07-21 13:37
是把按键的数字保存下来?是这意思不
骓风91
6楼-- · 2019-07-21 19:14
 精彩回答 2  元偷偷看……

一周热门 更多>