⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 本代码实现了MSP430单片机的4*4键盘扫描
💻 C
字号:

// 此示例程序为中断方式,得到键盘的键值,存放在队列keybuff[10]中
// 此示例程序没有显示,
// 键盘的按键按下引起P1口的中断服务程序,得到键盘的键值,保存到键值队列
// 在其他的中断服务程序中通过键值队列中的数据引导程序的流程


//头文件
#include<MSP430x14x.h>


//unsigned char keybuff[10];
unsigned char keypoint=0; 
unsigned char x;//为了让软件去抖,定义一个全局变量,每次都记住一个键值,防止抖动

void delay(int v)//延时程序
    {
        while(v!=0)v--;
    }
 
unsigned char key(void)
  {
    //unsigned char x;
    P1DIR|=0X0F;//
    P1OUT=0XFE;//扫描第一行
    
    if((P1IN&0XF0)==0XE0)       
       x=0X01;
       else
          if((P1IN&0XF0)==0XD0)
            x=0X02;
                else
                  if((P1IN&0XF0)==0xB0)
                    x=0X03;
                       else 
                         if((P1IN&0XF0)==0x70)
                              x=0X04;
       else 
        {
          P1OUT=0XFD;            //扫描第二行
          if((P1IN&0XF0)==0XE0)
             x=0X05;
             else
               if((P1IN&0XF0)==0XD0)
                  x=0X06;
                    else
                      if((P1IN&0XF0)==0xB0)
                        x=0X07;
                           else
                             if((P1IN&0XF0)==0x70)
                                x=0X08;
           else
           {
            P1OUT=0XFB;           //扫描第三行
            if((P1IN&0XF0)==0XE0)
              x=0X09;
              else
                if((P1IN&0XF0)==0XD0)
                  x=0X0A;
                  else
                    if((P1IN&0XF0)==0xB0)
                      x=0X0B;
                      else
                         if((P1IN&0XF0)==0x70)
                             x=0X0C;
             else 
             {
               P1OUT=0XF7;           //扫描第四行
                  if((P1IN&0XF0)==0XE0)
                      x=0X0D;
                     else
                       if((P1IN&0XF0)==0XD0)
                         x=0X0E;
                           else
                              if((P1IN&0XF0)==0xB0)
                                   x=0X0F;
                                 else
                                   if((P1IN&0XF0)==0x70)
                                     x=0X1F;
                    }
             }      
         }    
  return(x);
  }
  
  
unsigned char keyj(void) 
    {
      unsigned char x;
      P1DIR|=0X0F;//低四位设置为输出 高四位输入
      P1OUT=0XF0;//低四位输出低电平,高四位上拉态 //键盘硬件:P10--P13为行线,最上面一根为P10
      x=(P1IN&0XF0); //P14--P16为列线,最左边一根为P14,列线下拉
      return(x);  //无按键,返回 0?; 有按键返回 非0
    }  

#pragma vector=PORT1_VECTOR
__interrupt void p1int(void)
        {
        if(keyj()!=0X00)
           {
           delay(200)  ;   //消抖动
               if(keyj()!=0X00)
                 {
                    P4OUT=key();//按键见键值保存到队列
                   // keypoint++;                 
                   // if(keypoint==10)
                   //keypoint=0;
                  }
            }
         P1OUT=0XF0;
         P1IFG=0X00; //清除中断标志,中断结束后一定要对中断标志清零
        }

void main(void)
{ 
  WDTCTL = WDTPW + WDTHOLD;  /*   // Stop WDT */
  
  
   P4DIR=0XFF;//P4口设置为输出
   P4OUT=0X00;
   
   P1DIR=0X0F;//低四位设置为输出,高四位输入,高四位为中断入口
   P1OUT=0XF0;//低四位输出高电平,高四位上拉态
   
   P1IES|=0X0F;//下降沿触发中断
   P1IE|=0XF0;//列线下降沿允许P1中断 高四位   一旦高四位导通则为低电平  触发中断
   
   _EINT();  /*/ Enable interrupts   */
  
  while(1)
  { 
  
     LPM0;                   
    _NOP();   
   
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -