打印

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

[复制链接]
3699|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
骓风91|  楼主 | 2016-10-27 21:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 骓风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;
}


相关帖子

沙发
dirtwillfly| | 2016-10-28 09:31 | 只看该作者
设置一个数组,把每个数都存放在数组里。然后用shownux函数逐个显示出来

使用特权

评论回复
板凳
骓风91|  楼主 | 2016-10-28 09: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| | 2016-10-28 10:09 | 只看该作者
骓风91 发表于 2016-10-28 09:36
while(1)
        {
            delay_ms(200);

不是这样的。不太清楚你的OLED_ShowNum()函数是如何实现的,但看它的参数,应该是包含显示屏内像素或字符的位置信息的,你修改一下就可以在不同位置分别显示不同的字符

使用特权

评论回复
5
骓风91|  楼主 | 2016-10-28 10:39 | 只看该作者
dirtwillfly 发表于 2016-10-28 10:09
不是这样的。不太清楚你的OLED_ShowNum()函数是如何实现的,但看它的参数,应该是包含显示屏 ...

先不管显示这句    这样也不能连续得到两个数字啊  while循环中后面的值会把刚刚输进去的给覆盖掉啊

使用特权

评论回复
6
dirtwillfly| | 2016-10-28 10:46 | 只看该作者
骓风91 发表于 2016-10-28 10:39
先不管显示这句    这样也不能连续得到两个数字啊  while循环中后面的值会把刚刚输进去的给覆盖掉啊
...

建议你上传下OLED_ShowNum的源码
这个函数的5个参数里,有位置信息的,在不同的位置显示不同的字符,不会覆盖的

使用特权

评论回复
7
骓风91|  楼主 | 2016-10-28 10:49 | 只看该作者
本帖最后由 骓风91 于 2016-10-28 15:29 编辑
dirtwillfly 发表于 2016-10-28 10:46
建议你上传下OLED_ShowNum的源码
这个函数的5个参数里,有位置信息的,在不同的位置显示不同的字符,不会 ...

我现在纠结的不是显示问题  我是想连续输入两个数字 然后将这两个数字组成两位数  这个两位数在其他地方还要使用  这个显示不要都可以

使用特权

评论回复
8
武当奇人| | 2016-10-28 12:23 | 只看该作者
没有你子函数的代码无法给出详细的解决办法
但是你可以试一下这个思路:弄一个确定键,在确认件输入之前,所有输入数据存储在数组中,检测到确认键后将数组中数据组合起来
或者在显示字符串中不断添加后来输入的数据,到规定个数后自动组合在一起。。。。。

使用特权

评论回复
9
骓风91|  楼主 | 2016-10-28 15:21 | 只看该作者
武当奇人 发表于 2016-10-28 12:23
没有你子函数的代码无法给出详细的解决办法
但是你可以试一下这个思路:弄一个确定键,在确认件输入之前, ...

子函数我已经贴上了  没有中断 我不知道如何取出这两位输入的数字

使用特权

评论回复
10
justtest111| | 2016-10-28 15:39 | 只看该作者
你这个可能要使用sprintf配合数组来实现,仅凭你现在有函数配合主循环是没办法实现的。

使用特权

评论回复
11
cov0xt| | 2016-10-28 16:15 | 只看该作者
本帖最后由 cov0xt 于 2016-10-28 16:23 编辑

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


1、弄个全局变量


或者


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


--------


static 变量A;
static 变量B;
循环开始
变量B=变量A;
变量A=键盘输入值;
循环结束

使用特权

评论回复
12
皈依| | 2016-10-28 19:43 | 只看该作者
是把按键的数字保存下来?是这意思不

使用特权

评论回复
13
骓风91|  楼主 | 2016-10-28 20:07 | 只看该作者
皈依 发表于 2016-10-28 19:43
是把按键的数字保存下来?是这意思不

对的  就这个意思

使用特权

评论回复
14
皈依| | 2016-10-28 20:22 | 只看该作者
骓风91 发表于 2016-10-28 20:07
对的  就这个意思

那方法太多了,放在数组里,存在内存里 或者放在后备寄存器都可以
只要你把逻辑处理好就可以了~

使用特权

评论回复
15
骓风91|  楼主 | 2016-10-28 20:56 | 只看该作者
皈依 发表于 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了

使用特权

评论回复
16
皈依| | 2016-10-28 22:22 | 只看该作者
骓风91 发表于 2016-10-28 20:56
while(1)
            {
                int num;

感觉问题可能在 num = transNum();这句 没按键按下的时候num是多少 你得看看
另外有条件的话仿真一下看看 是从什么时候开始变成0的

使用特权

评论回复
17
骓风91|  楼主 | 2016-10-28 23:00 | 只看该作者
皈依 发表于 2016-10-28 22:22
感觉问题可能在 num = transNum();这句 没按键按下的时候num是多少 你得看看
另外有条件的话仿真一下看看 ...

我给 transNum() 返回值初值赋了11  我再查查其他原因  可能也与硬件有关  时而稳定时而不稳    谢谢指点

使用特权

评论回复
18
kerfier| | 2016-10-28 23:07 | 只看该作者
transNum()中的num 需要赋初值 11

使用特权

评论回复
19
骓风91|  楼主 | 2016-10-28 23:21 | 只看该作者
kerfier 发表于 2016-10-28 23:07
transNum()中的num 需要赋初值 11

我就是把这个赋值为11

使用特权

评论回复
20
皈依| | 2016-10-29 08:25 | 只看该作者
骓风91 发表于 2016-10-28 23:00
我给 transNum() 返回值初值赋了11  我再查查其他原因  可能也与硬件有关  时而稳定时而不稳    谢谢指点 ...

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

24

帖子

0

粉丝