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

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-22 01:04
骓风91 发表于 2016-10-28 20:07
对的  就这个意思

那方法太多了,放在数组里,存在内存里 或者放在后备寄存器都可以
只要你把逻辑处理好就可以了~
骓风91
2楼-- · 2019-07-22 04:54
皈依 发表于 2016-10-28 20:22
那方法太多了,放在数组里,存在内存里 或者放在后备寄存器都可以
只要你把逻辑处理好就可以了~ ...

            while(1)
            {
                int num;
                delay_ms(20);
                OLED_Clear();
                num = transNum();
                if((num>=0)&&(num<=9))
                {
                   num2 = num1;
                   num1 = num;
                }
               
                OLED_ShowNum(80,6,num2*10+num1,3,16);//显示ASCII字符的码值
                if(num==15) break;
            }
            我这样写的  但是很不稳定  几个循环后值就是0了
皈依
3楼-- · 2019-07-22 07:11
骓风91 发表于 2016-10-28 20:56
while(1)
            {
                int num;

感觉问题可能在 num = transNum();这句 没按键按下的时候num是多少 你得看看
另外有条件的话仿真一下看看 是从什么时候开始变成0的
骓风91
4楼-- · 2019-07-22 12:54
皈依 发表于 2016-10-28 22:22
感觉问题可能在 num = transNum();这句 没按键按下的时候num是多少 你得看看
另外有条件的话仿真一下看看 ...

我给 transNum() 返回值初值赋了11  我再查查其他原因  可能也与硬件有关  时而稳定时而不稳    谢谢指点
kerfier
5楼-- · 2019-07-22 16:40
 精彩回答 2  元偷偷看……
骓风91
6楼-- · 2019-07-22 20:52
 精彩回答 2  元偷偷看……

一周热门 更多>