3239|6

13

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

launchpad 矩阵键盘 [复制链接]

各位,调了半天了,怎么貌似都不得行啊,麻烦各位大神帮我看一看~,谢谢!
#include "msp430g2553.h"

unsigned char H[]={0xe0,0xd0,0xb0,0x70};  //行
unsigned char L[] ={BIT0,BIT1,BIT2,BIT3};  //列
unsigned int keyvalue;
unsigned int keyscan(void);

int main( void )
{

          WDTCTL = WDTPW + WDTHOLD;         // Stop watchdog timer to prevent time out reset
          P1SEL=0X00;
          P1DIR =0Xf0;
          P2DIR |= BIT0;                                // 设置输出
        //  P2OUT &=~BIT0;
      for(;;)
        {
                        keyscan();
                        if(keyvalue<16)
                        {
                         P2OUT &=~BIT0;
                         _delay_cycles(500);
                    }
        }
}

unsigned int keyscan(void)
{
    unsigned int i=0,lie=0,j=0,hang=0;

    P1REN=0X0F;    //上拉使能
//    P1IN=0X0f;
    P1OUT=0xf0;
    if((P1IN & 0X0F)!=0X0F)
    {
            _delay_cycles(100);
        if((P1IN & 0X0F)!=0X0F)
        {

           _delay_cycles(100);
           for(i=0;i<4;i++)     //行检测
          {
                 P1OUT = H;
             for(j=0;j<4;j++)//列检测
             {
                  if((P1IN & L[j])!=L[j])
                  {
//                       P1OUT=0X00;
                    hang=i;
                    lie=j;
                    keyvalue=lie+hang*4;
                  }
              }
           }
       }
    }
    return keyvalue;
}

最新回复

高人啊,终于可以了  详情 回复 发表于 2013-8-29 19:49
 
点赞 关注(1)

回复
举报

71

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
到处都是小毛病,适合做二级C的改错题

[ 本帖最后由 carlnerv 于 2012-8-3 09:41 编辑 ]

点评

请明示都哪些地方有小毛病,unsigned char H[]={0x10,0x20,0x40,0x80}; //行,行扫这样也不得行!我是新手,忘不吝赐教!  详情 回复 发表于 2012-8-3 09:43
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
原帖由 carlnerv 于 2012-8-3 01:16 发表
到处都是小毛病,适合做二级C的改错题

而且扫描行是让行逐个为高电平不是低电平吧
请明示都哪些地方有小毛病,unsigned char H[]={0x10,0x20,0x40,0x80};  //行,行扫这样也不得行!我是新手,忘不吝赐教!
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(高级)

4
 
感觉有点乱啊,/*xxx*/是我补的注释。论坛显示代码补全,你可以复制到别的地方看
  1. #include "msp430g2553.h" /*这里引号行吗?引号引用工程内文件,<>尖括号引用编译器的文件*/


  2. unsigned char H[]={0xe0,0xd0,0xb0,0x70};  //行    /*低电平扫描行的话,列的针脚最好加上拉电阻*/
  3. unsigned char L[] ={BIT0,BIT1,BIT2,BIT3};  //列    /*最好与行对应为低电平*/
  4. unsigned int keyvalue;
  5. unsigned int keyscan(void); /*这个函数里已经对keyvalue操作了,就不用返回keyvalue值了*/

  6. int main( void )
  7. {

  8.           WDTCTL = WDTPW + WDTHOLD;         // Stop watchdog timer to prevent time out reset
  9.           P1SEL=0X00;  /*这句一般不用写,PxSEL默认是00*/
  10.           P1DIR =0Xf0;
  11.           P2DIR |= BIT0;                                // 设置输出
  12.         //  P2OUT &=~BIT0;
  13.       for(;;)
  14.         {
  15.                         keyscan();
  16.                         if(keyvalue<16)
  17.                         {
  18.                          P2OUT &=~BIT0;
  19.                          _delay_cycles(500);
  20.                     }
  21.         }
  22. }

  23. unsigned int keyscan(void)
  24. {
  25.     unsigned int i=0,lie=0,j=0,hang=0;
  26.     P1REN=0X0F;    //上拉使能  /*这句可以放在main中初始化部分*/
  27. //    P1IN=0X0f;
  28.     P1OUT=0xf0;
  29.     if((P1IN & 0X0F)!=0X0F)  /*这部分是判断有键持续按下吧,但是不扫描怎么知道有键按下,这个可以放到扫描语句里*/
  30.     {
  31.             _delay_cycles(100);
  32.         if((P1IN & 0X0F)!=0X0F)
  33.         {
  34.            _delay_cycles(100);
  35.            for(i=0;i<4;i++)     //行检测
  36.           {
  37.                  P1OUT = H;  /*笔误吧,或者是跟论坛的代码冲突了*/
  38.              for(j=0;j<4;j++)//列检测
  39.              {
  40.                   if((P1IN & L[j])!=L[j])  /*我不太会这种判断,我一般直接判断哪个脚等于什么值*/
  41.                   {
  42. //                       P1OUT=0X00;
  43.                     hang=i;    /*这两句有点啰嗦吧*/
  44.                     lie=j;
  45.                     keyvalue=lie+hang*4;  /*G2553能直接做乘法吗?我编译时总提示让我用硬件乘法器,而且硬乘还得等几个机器周期*/
  46.                   }
  47.               }
  48.            }
  49.        }
  50.     }
  51.     return keyvalue; /*这句没什么用*/
  52. }                           
复制代码
我写了一个,你可以参考一下
  1. /*  4x4键盘,按键值为0-15,并以2进制数点亮Led
  2. *
  3. *  P1.0-P1.7接键盘1-8脚,P2.0-P2.3接Led,共阴接法
  4. *
  5. */

  6. #include

  7. const unsigned char Row[]={0x01,0x02,0x04,0x08};  //行为高电平扫描
  8. const unsigned char Col[]={0x10,0x20,0x40,0x80};  //列检测高电平
  9. const unsigned char Led[]={0x00,0x01,0x02,0x03,
  10.                             0x04,0x05,0x06,0x07,
  11.                             0x08,0x09,0x0a,0x0b,
  12.                             0x0c,0x0d,0x0e,0x0f};  //Led亮法

  13. volatile unsigned short KeyBuff = 0;  //定义为char的话存储的不是数值,不知为何
  14. volatile unsigned int i,j,temp1;  //全局定义会不会对内存有优化,而不是每次调用函数都重新定义

  15. void ScanKey()
  16. {

  17.     //KeyBuff = 0;
  18.     for(i=0;i<4;i++) //行扫描
  19.     {
  20.         P1OUT = Row[i];  //行依次为高电平
  21.         __delay_cycles(1000);  //防抖延时,不知道该插到哪里
  22.         temp1 = P1IN & 0xf0;  //只取列的数据,PxOUT会影响PxIN的数据
  23.         for(j=0;j<4;j++)  //扫描列
  24.         {
  25.             if(temp1 == Col[j])  //判断按键取值为那一列对应的值
  26.             {
  27.                 KeyBuff = (i<<2) + j;  //计算该按键对应的数值
  28.             }
  29.         }
  30.                
  31.     }
  32.    
  33. }

  34. void main(void)
  35. {
  36.     WDTCTL = WDTPW + WDTHOLD;
  37.    
  38.     P1DIR |= 0x0f; //P1方向,低位输出,高位输入
  39.     P1REN |= 0xf0; //开启P1输入端电阻
  40.     P2DIR |= 0x0f;  //P2输出
  41.    
  42.     while(1)
  43.     {
  44.         ScanKey();  //扫描按键
  45.         P2OUT = Led[KeyBuff];  //点亮Led
  46.     }
  47. }
复制代码

[ 本帖最后由 carlnerv 于 2012-8-3 15:04 编辑 ]

点评

高人啊,终于可以了  详情 回复 发表于 2013-8-29 19:49
万分感谢!  详情 回复 发表于 2012-8-3 16:00
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

5
 
原帖由 carlnerv 于 2012-8-3 07:03 发表
感觉有点乱啊,/*xxx*/是我补的注释。论坛显示代码补全,你可以复制到别的地方看#include "msp430g2553.h" /*这里引号行吗?引号引用工程内文件,尖括号引用编译器的文件*/


unsigned char H[]={0xe0,0xd0,0xb0, ...
万分感谢!
 
 
 

回复

471

帖子

0

TA的资源

一粒金砂(高级)

6
 
G2253的内部上拉很弱的。建议你改为外部上拉试试
 
 
 

回复

91

帖子

5

TA的资源

一粒金砂(中级)

7
 

回复 4楼carlnerv 的帖子

高人啊,终于可以了
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表