按键扫描Key_Scan中为什么设2个变量

2019-07-15 16:45发布

本帖最后由 playwife_花 于 2015-1-21 09:04 编辑

疑问:把变量 key_check去掉, key_check = KeyPort和 switch (key_check &= 0x0F)中的check改成checkin功能也能实现;;;;;完整代码楼下,求助大神!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
playwife_花
1楼-- · 2019-07-15 19:33
#include <msp430x14x.h>
#include "Config.h"
uchar key;a
//*************************************************************************
//        初始化IO口子程序
//*************************************************************************
void Port_init()
{
  //用于控制按键

  P1DIR = 0xF0;                   //P10~P13输入模式,外部电路已接上拉电阻            
  P6DIR = 0xFF;                   //P6口输出模式
}
//**********************************************************************
//        键盘扫描子程序,采用逐键扫描的方式
//**********************************************************************
uchar Key_Scan(void)
{
  uchar key_check;
  uchar key_checkin;
  key_checkin=KeyPort;                  //读取IO口状态,判断是否有键按下
  key_checkin&= 0x0F;                          //读取IO口状态,判断是否有键按下                          

   
  if(key_checkin!=0x0F)                    //IO口值发生变化则表示有键按下
    {
      delay_ms(20);                          //键盘消抖,延时20MS
      key_checkin=KeyPort;
      if(key_checkin!=0x1F)
      {
          key_check = KeyPort;
          switch (key_check &= 0x0F)
            {
              case 0x0E:key=1;break;
              case 0x0D:key=2;break;
              case 0x0B:key=3;break;
              case 0x07:key=4;break;
            }
     }     
   }
  else
   {
     key=0xFF;        
   }
  return key;
}

void main(void)
{     
  WDT_Init();                            //看门狗设置
  Clock_Init();                          //系统时钟设置
  Port_init();                           //系统初始化,设置IO口属性
  delay_ms(100);                         //延时100ms
  while(1)
    {
      Key_Scan();                       //键盘扫描,看是否有按键按下
      if(key!=0xff)                     //如果有按键按下,则显示该按键键值1~4
        {
          {
            switch(key)
              {
                case 1: LED8 = 0xFC;break;        //给不同的键赋键值,键值1,亮2个LED灯
                case 2: LED8 = 0xF3;break;        //给不同的键赋键值,键值2,亮2个LED灯
                case 3: LED8 = 0xCF;break;         //给不同的键赋键值,键值3,亮2个LED灯
                case 4: LED8 = 0x3F;break;         //给不同的键赋键值,键值4,亮2个LED灯
              }
          }
       }
     else
     {
     // LED=key;                      //没有按键的时候显示上次的键值
     }
    }
}


只改变Key_Scan,其他不变;
uchar Key_Scan(void)
{  uchar key_checkin;
  key_checkin=KeyPort;                  //读取IO口状态,判断是否有键按下
  key_checkin&= 0x0F;                          //读取IO口状态,判断是否有键按下                          

   
  if(key_checkin!=0x0F)                    //IO口值发生变化则表示有键按下
    {
      delay_ms(20);                          //键盘消抖,延时20MS
      key_checkin=KeyPort;
      if(key_checkin!=0x1F)
      {
          key_checkin = KeyPort;
          switch (key_checkin&= 0x0F)
            {
              case 0x0E:key=1;break;
              case 0x0D:key=2;break;
              case 0x0B:key=3;break;
              case 0x07:key=4;break;
            }
     }     
   }
playwife_花
2楼-- · 2019-07-15 20:14
终于搞懂了,原来是为了怕弄混淆而设置了两个变量,一个功能是读取IO状态判断是否有按键按下,一个是判断哪个按键按下,心里好明快,结贴

一周热门 更多>