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

📄 jianpan.c

📁 基于MSP430十六位超低功耗单片机的
💻 C
字号:
/***********************************************************
* 3*4矩阵键盘检测,这里用LED显示对应按键的键值来测试程序
*20080306在实验箱上仿真通过
************************************************************/


#include <msp430x44x.h>

/***********************************************************
* 变量定义
************************************************************/
unsigned char key_pressed;     // 是否有键值按下
unsigned char key_released;    // 是否一个按下的按键已经松开
unsigned char key_value;       // 存放键值

unsigned char key_map[12] ={    //设置键盘逻辑键值与程序计算键值的映射
                           1,2,3,10,4,5,
                           6,0,7,8,9,11
                           };

/***********************************************************
* 函数声明(可以声明一个写一个,避免遗漏)
************************************************************/
void delay();//延时函数
void init_keyboard();//初始化键盘设备
void scan_key();//扫描键盘,确定有按键按下
void check_key();//确定键值

/***********************************************************
* delay(),延时函数,用于消除抖动
************************************************************/
void delay()
{
  unsigned char tmp;
  for(tmp=0xff;tmp>0;tmp--);
}

/********************************************************
*  init_keyboard(),初始化键盘设备
********************************************************/
void init_keyboard(void)
{
  P1DIR &= 0x01;  // P1.4~P1.7 设置为输入模式
  P1DIR |= 0x0E;  // set p1.1~p1.3 设置为输出模式
  P1OUT |= 0x0E;  // 配合后面的函数使p1.1~p1.3 输出值清零
  key_pressed = 0;// 初始化key_pressed,表明没有按键按下 
  key_released = 0;// 初始化key_released,表明没有按键被释放  
}

/************************************************************
*  scane_key(),检测键盘是否有键按下,如果有获取键值
*************************************************************/
void scan_key(void)
{  
  unsigned char tmp;
  P1OUT &= 0x01;         // 设置P1OUT输出值,之所以在这里设置输出低电平是为了保证每次检测的时候都能在p1.1~p1.3 输出低电平
  tmp = P1IN;            // 获取 p1IN
  if ((key_pressed ==0)&&((tmp & 0xf0) < 0xf0))   //是否有键按下  
  {                    
    delay();           //消除抖动
    if ((key_pressed ==0)&&((tmp & 0xf0) < 0xf0)) //确认是否确实有按键按下
    {
      key_pressed = 1;   // 如果有按键按下,设置key_pressed标识
    }
  }
  else 
    if ((key_pressed ==1)&&((tmp & 0xf0) == 0xf0))//判断按下的按键是否被释放
    {                     
      key_pressed = 0;   // 清除key_pressed标识
      key_released = 1;   // 设置key_released标识,表明按下的按键已经被释放,可以读取键值
    }     
}

/*********************************************
* check_key(),检查按键,确认键值
*********************************************/
void check_key(void)
{ 
  unsigned char row ;// 用来判断按键的行地址
  unsigned char col;//用来判断按键的列地址
  unsigned char tmp1;//用来判断按键的行地址
  unsigned char tmp2;//用来判断按键的列地址
  tmp1 = 0x08;
  for(row=0;row<3;row++) // 行检测 
  {
    P1OUT |= 0x0E; // p1.1~P1.3=1
    P1OUT -= tmp1; // P1.1~p1.3中有一个为0,即令键盘上有一行输出为0
    tmp1 = tmp1/2; // tmp1右移一位,以便使下一行输出低电平     
    if ((P1IN & 0xf0) < 0xf0) // 按键是否在这一行
    {                     
      tmp2 = 0x80; 
      for(col =0;col<4;col++) // 列检测 
      {         
        if((P1IN & tmp2)==0x00) // 是否是该列
        {         
          key_value = key_map[ row*4 +col] ; // 获取键值
          return;                         // 退出循环
        }
        tmp2 /= 2; // 不在这一列的话,tmp2右移,检测下一列
      }
    }
  }        
}


/*****************************************************/
/*   数据定义                                        */
/*****************************************************/
const unsigned char num_led[17]=
                       {0xd7,0x14,0xcd,0x5d,0x1E,  // 0 ~ 4
                       0x5b,0xdb,0x15,0xdf,0x5f,   // 5 ~ 9
                       0x9f,0xda,0xc3,0xcc,0xcf,   // a ~ e
                       0x8b,0x00};                 //f,0x00使LED不显示

                       

void init_port()
{
  P3DIR |= 0XFF;
  P3OUT &= 0X00;
  P4DIR |= 0X03;
  P4OUT &= 0XFC;
}
void disp_led(char data)
{
  P4OUT |=0X01;
  P3OUT =0x00;
  P4OUT &=0XFE;
  P4OUT |=0X02;
  P3OUT =num_led[data];
  P4OUT &=0XFD;
}
/*********************************************
*  main()函数
*********************************************/
void main(void)
{
    
     WDTCTL = WDTHOLD + WDTPW ;           // 停止看门狗
     init_port();
     init_keyboard();                     // 初始化键盘                
    disp_led(0);
     while(1)
     {
          scan_key();   //键盘扫描,看是否有案件按下,有则设置key_released = 1,表明可以检测键值了
           if (key_released == 1) // 是否有按键按下
           {  
            check_key();  // 有按键按下,则检测按键的位置,并计算键值 
           }
           
           switch(key_value)//根据是哪个按键被按下,执行对应的功能程序
          {
          case 0 : disp_led(0);
                   break;
          case 1 : disp_led(1);
                   break;
          case 2 : disp_led(2);
                   break;
          case 3 : disp_led(3);
                   break;         
          case 4 : disp_led(4);
                   break;
          case 5 : disp_led(5);
                   break;
          case 6 : disp_led(6);
                   break;
          case 7 : disp_led(7);
                   break; 
          case 8 : disp_led(8);
                   break;
          case 9 : disp_led(9);
                   break;
          case 10 : disp_led(10);
                   break;
          
          }
           
          }
                           
   
}

⌨️ 快捷键说明

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