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

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条回答
皈依
2019-07-23 01:43
骓风91 发表于 2016-10-28 23:00
我给 transNum() 返回值初值赋了11  我再查查其他原因  可能也与硬件有关  时而稳定时而不稳    谢谢指点 ...

这。。。
建议按键用中断做,如果按下再返回值 没按下就不执行num = transNum();这段代码

一周热门 更多>