打印

MSP430键盘程序[中断方式]

[复制链接]
1211|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
马善松|  楼主 | 2011-12-6 13:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
// 此示例程序为中断方式,得到键盘的键值,存放在队列keybuff[10]中
// 此示例程序没有显示,
// 键盘的按键按下引起P1口的中断服务程序,得到键盘的键值,保存到键值队列
// 在其他的中断服务程序中通过键值队列中的数据引导程序的流程
#include <msp430x14x.h>  
unsigned char keybuff[10];
unsigned char keypoint=0;

void delay(int v)
    {
        while(v!=0)v--;
    }
     
unsigned char key(void)
  {
    unsigned char x=0xff;
    P1DIR=0X0F;
    P1OUT=0X01;                 //扫描第一行
    if((P1IN&0X70)==0X10)      
       x=0;
       else
          if((P1IN&0X70)==0X20)
            x=1;
                else
                  if((P1IN&0X70)==0x40)
                    x=2;
       else
        {
          P1OUT=0X2;            //扫描第二行
          if((P1IN&0X70)==0X10)
             x=3;
             else
               if((P1IN&0X70)==0X20)
                  x=4;
                    else
                      if((P1IN&0X70)==0x40)
                        x=5;
           else
           {
            P1OUT=0X4;           //扫描第三行
            if((P1IN&0X70)==0X10)
            x=6;
              else
                if((P1IN&0X70)==0X20)
                x=7;
                  else
                  if((P1IN&0X70)==0x40)
                    x=8;
             else
             {P1OUT=8;           //扫描第四行
             if((P1IN&0X70)==0X10)
       x=9;
       else
          if((P1IN&0X70)==0X20)
            x=10;
                else
                  if((P1IN&0X70)==0x40)
                    x=11;
                    }
             }      
         }   
  return(x);
  }
  
  
unsigned char keyj(void)      
    {unsigned char x;
    P1DIR=0x0f;
    P1OUT=0x0f;        //键盘硬件:P10--P13为行线,最上面一根为P10
    x=(P1IN&0X70);      //         P14--P16为列线,最左边一根为P14,列线下拉
    return(x);          // 无按键,返回 0?;  有按键返回 非0
    }  
     
      
interrupt[PORT1_VECTOR] void port1key(void)
        {
        if(keyj()!=0X00)
           {
           delay(300)  ;   //消抖动
               if(keyj()!=0X0)
                 {
                    keybuff[keypoint]=key();    //按键见键值保存到队列
                    keypoint++;                 //
                    if(keypoint==10)
                         keypoint=0;
                  }
            }
         P1OUT=0X0F;
         P1IFG=0X0;         //清除中断标志
        }

   

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;  /*   // Stop WDT */
  P1DIR=0XF;
  P1OUT=0XF;
  P1IES=0X0;
  P1IE=0X70;    //列线上升沿允许P1中断
   _EINT();                      /*/ Enable interrupts                 */
  
  while(1)
  {
  
     LPM0;                  
    _NOP();   
   
  }
}



相关帖子

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

本版积分规则

14

主题

131

帖子

0

粉丝