标题: 这单片机按键检测代码的问题,现在是检测不到IO的状态 [打印本页]

作者: sta88128    时间: 2020-10-21 16:30
标题: 这单片机按键检测代码的问题,现在是检测不到IO的状态
#include "HT66F0185.h"
#include "key.h"
#define u8 unsigned char
#define u16 unsigned int

u8 KeyStatus=0;
u16 KeyCnt=0;

u8 KeyVal=0;
u8 KeyPress=0;//1按下,2长按


void keyinit()
{
  //按键设置为输入上拉,PC4 PA1,PC5,PA3,PB4,PB5
  _pcc4=1;//开关机
  _pcpu4=1;

  _pac1=1;//程序
  _papu1=1;

  _pcc5=1;//加
  _pcpu5=1;

  _pac3=1;//减
  _papu3=1;

  _pbc4=1;//启动/停止
  _pbpu4=1;
  
  _pbc5=1;//手动/反转
  _pbpu5=1;
}

u8 getkey()
{
  u8 temp=0;
  //将扫描的结果放在 temp 里  |= 按位或后赋值运算符 &= 按位与后赋值运算符 ~ 按位取反运算符
  //a&0x01就是取a的最低位值的运算
  if(_pc4==0)temp|=0x01;else temp&=~(0x01);
  if(_pa1==0)temp|=0x02;else temp&=~(0x02);
  if(_pc5==0)temp|=0x04;else temp&=~(0x04);
  if(_pa3==0)temp|=0x08;else temp&=~(0x08);
  if(_pb4==0)temp|=0x16;else temp&=~(0x16);
  if(_pb5==0)temp|=0x32;else temp&=~(0x32);
  return temp;
}

//扫描函数,10-20ms 扫描间隔
void keyscan()
{
  static u8 i=0;
  u8 temp;
  GCC_DELAY(10);//GCC_DELAY
  temp=getkey();
  switch(KeyStatus)
  {
    case WaitStatus: //等待状态
    if(temp!=0x00)
     {
       if(++i>=3)
        {
          i=0;
          KeyStatus=PressStatus;
        }
     }
    else
     {
       i=0;
     }
     break;
     case PressStatus: //按下状态
     if(temp!=0x00)
      {
        KeyVal=temp;
        KeyStatus=ReleaseStatus;
      }
      else
      {
        KeyStatus=WaitStatus;
      }
      break;
      case ReleaseStatus: //等待释放状态
      if(temp!=0x00)
       {
         if(++KeyCnt==KeyTime) //长按检测
          {
            KeyPress=2;
            KeyStatus=IDEStatus;
            KeyCnt=0;
          }  
       }
      else
       {
         KeyCnt=0;
         KeyStatus=WaitStatus;
         KeyPress=1;
       }
      break;
      case IDEStatus:
      if(temp==0x00)
       {
         KeyStatus=WaitStatus;
       }
      break;
  }
}



#ifndef __KEY__H__
#define __KEY__H__

#define u8 unsigned char
#define u16 unsigned int

#define WaitStatus     0     //按键过程的状态
#define PressStatus    1
#define ReleaseStatus  2
#define IDEStatus      3
#define KeyTime       800  //长按超时时间        
        
#define KEY0 0x01
#define KEY1 0x02
#define KEY2 0x04
#define KEY3 0x08
#define KEY4 0x16
#define KEY5 0x32

void keyscan();
void keyinit();
#endif
作者: sta88128    时间: 2020-10-21 16:33
如果有基础性的错误不要,小白一个
作者: sta88128    时间: 2020-10-21 17:56
各位大哥,帮帮忙,别见 ,小白一个,请指教




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1