打印
[ZLG-ARM]

请教高手LPC2148 4×4按键问题

[复制链接]
1678|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kingorwei|  楼主 | 2008-3-23 11:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教问题,同事休假,他没调完的东东给我调了,CPU采用的是lpc2148,我也是刚接触这个片子,对它的脾气还不熟,。按键采用的是4×4的矩阵按键,直接占用了8个GPIO口的那种,不知到为什么,当我将ROW和COL进行反相读值的时候,读不到正确的数值,然而第一次进入的时候读到值又是正确的,我认为是程序的逻辑关系搞混乱了,但我现在查不出那个地方乱了,所以请教周工,帮我看看那个地方搞的还不对。谢谢:

#define  COL0    1 << 9   // P0.9连接COL0
#define  COL1    1 << 10   // P0.10连接COL1
#define  COL2    1 << 20   // P0.20连接COL2
#define  COL3    1 << 12   // P0.13连接COL3

#define  ROW0    1 << 15   // P0.15连接ROW0
#define  ROW1    1 << 16   // P0.16连接ROW1
#define  ROW2    1 << 17   // P0.17连接ROW2
#define  ROW3    1 << 18   // P0.18连接ROW3

Uint32 Scan_Key_bak(void)
{

        Uint32 i;
   //**********************************//
    IO0SET |= (ROW0|ROW1|ROW2|ROW3);    // ROW set high 
    IO0CLR |= (COL0|COL1|COL2|COL3);         //COL 设为0

    IO0DIR &=~(ROW0|ROW1|ROW2|ROW3);   // ROW控制口输入
    IO0DIR |=(COL0|COL1|COL2|COL3);            // COL控制口输出
//**********************************//   
 
    value0=0;
    value1=0;
    value2=0;
 
    value0 =  IO0PIN ;//& 0x00001e00 ;//读取row 方向的值
     value1 = value0 &(COL0|COL1|COL2|COL3);
    value0 &= (ROW0|ROW1|ROW2|ROW3);
 
    if( value0 != (ROW0|ROW1|ROW2|ROW3))  // 有按键按下
   {
       OSTimeDly(1);
       value1 =  IO0PIN ;//& 0x00001e00 ;//读取row 方向的值
        value1 &= (ROW0|ROW1|ROW2|ROW3);
        if(value0 == value1)                   //  此处读到ROW的值是正确的。
       {

//**********************************//
            IO0DIR |=(ROW0|ROW1|ROW2|ROW3);  // ROW控制口输出
   
            IO0SET |= (COL0|COL1|COL2|COL3);  // COL set high 
            IO0CLR |= (ROW0|ROW1|ROW2|ROW3);  //ROW 设为0   执行完这行以后GPIO的输出电平是正确的

            IO0DIR &=~(COL0|COL1|COL2|COL3); // COL控制口输入  执行完这行代码后,GPIO逻辑电平为0了,所以数据读不到了
//**********************************// 
  
            value1 = IO0PIN ;//读取col 方向的值
            value1 &= (COL0|COL1|COL2|COL3);//读取col 方向的值
   
            if( value1 != (COL0|COL1|COL2|COL3))  //按键没松开
           {
                  OSTimeDly(1);
                  value2 = IO0PIN ;//读取col 方向的值
                  value2 &= (COL0|COL1|COL2|COL3);//读取col 方向的值
    
                 if( value1 == value2)
                 {
                    value2 = value0 + value1;
                    for(i=0; i<16; i++)      // 查找0~15的键值
                   {
                       if( value2 == KeyTableVal)
                      {
                          value2 = i;
                            break;
                      }
                  }
                if (value2 < 16)
                {
                     return value2;
               }
           }
       }
     }    
   }
 return 0xff;
}

相关帖子

沙发
kingorwei|  楼主 | 2008-3-23 11:34 | 只看该作者

附图是相关的电路

附图是相关的电路,Row和Col都是直接连接到2148的GPIO上的,并且也初始化了相关的寄存器,将相应端口配置成了GPIO口

使用特权

评论回复
板凳
lyl831015| | 2008-3-23 12:05 | 只看该作者

7290

zlg7290很好用的,4*4的键盘,I2C接口直接读取。

使用特权

评论回复
地板
kingorwei|  楼主 | 2008-3-23 16:49 | 只看该作者

电路已经定了,不会再更改了

3楼的大哥,电路已经定了,不会再更改了,谢谢

使用特权

评论回复
5
kingorwei|  楼主 | 2008-3-23 17:07 | 只看该作者

IOSET寄存器的说明看不明白

IOSET GPIO 端口输出置位寄存器。该寄存器和IOCLR 寄存器一起控制输出管脚的状态。写入1 使对应管脚输出高电平。写入0 无效。
我不明白的是话是:该寄存器和IOCLR 寄存器一起控制输出管脚的状态

使用特权

评论回复
6
zhonggx| | 2008-3-23 19:48 | 只看该作者

COL方向没有上接电阻。

你的COL方向没有上接电阻。
如果不想改硬件,可以用逐列扫描的办法。

使用特权

评论回复
7
zlgarm| | 2008-3-24 21:22 | 只看该作者

I/O口

kingorwei 您好:
  
   问题在您程序处理上,电路没有问题。IOSET寄存器中,对应位置1时输出高电平,置0无效,IOCLR寄存器中,对应位置1清零IOSET中的相应位,同时使引脚变为低电平,写0无效。因此,引脚的最终电平有这两个寄存器决定。
    在使用时请检查一下您的IODIR寄存器有无设置正确,IODIR相应位为1时,引脚只为输出,为0时为输入。
                                 on duty:zlgarm_zhanghuping

使用特权

评论回复
8
kingorwei|  楼主 | 2008-3-27 09:42 | 只看该作者

谢谢ZlgArm的答复,还有问题

谢谢ZLG的答复,看了一下,寄存器好像没设错
   我的想法是
   1,将Row端口设为输入端口,同时将端口置为高,将Col端口设为输出端口,同时置为低,然后读Row 端口得到一个状态值 RowData
   2,Row& Col 方向反相,将Col端口设为输入端口,同时将端口置为高,将Row端口设为输出端口,同时置为低,然后读Col端口得到一个状态值ColData
   3,两个状态值相加得到一个确定的按键扫描值 RowData+ColData = KeyData;
   
   问题1:设置IOSET 、IOCLR 时,只有在IODIR 设为输出的时候才能有效,那么在第2条中,我想将Col设为输入端口,还想将Col设为高电平(这样按下的键是低电平,才能有效检测到),我应该怎么做,第一条同第二条。
   问题2:我的按键扫描思想是否有逻辑错误,如果有错误,应该如何修正。

使用特权

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

本版积分规则

7

主题

31

帖子

1

粉丝