launchpad 矩阵键盘

2019-03-24 12:17发布

各位,调了半天了,怎么貌似都不得行啊,麻烦各位大神帮我看一看~,谢谢!
#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;
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
carlnerv
1楼-- · 2019-03-24 16:26
到处都是小毛病,适合做二级C的改错题

[ 本帖最后由 carlnerv 于 2012-8-3 09:41 编辑 ]
haiduoduo
2楼-- · 2019-03-24 20:32
 精彩回答 2  元偷偷看……
carlnerv
3楼-- · 2019-03-25 00:06
感觉有点乱啊,/*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 编辑 ]
haiduoduo
4楼-- · 2019-03-25 04:02
原帖由 carlnerv 于 2012-8-3 07:03 发表
感觉有点乱啊,/*xxx*/是我补的注释。论坛显示代码补全,你可以复制到别的地方看#include "msp430g2553.h" /*这里引号行吗?引号引用工程内文件,尖括号引用编译器的文件*/


unsigned char H[]={0xe0,0xd0,0xb0, ...
万分感谢!
zw357234798
5楼-- · 2019-03-25 09:50
 精彩回答 2  元偷偷看……
默默沉默中
6楼-- · 2019-03-25 14:23
高人啊,终于可以了

一周热门 更多>

相关问题

    相关文章