找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1208|回复: 2
收起左侧

这单片机按键检测代码的问题,现在是检测不到IO的状态

[复制链接]
ID:691113 发表于 2020-10-21 16:30 | 显示全部楼层 |阅读模式
#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
回复

使用道具 举报

ID:691113 发表于 2020-10-21 16:33 | 显示全部楼层
如果有基础性的错误不要,小白一个
回复

使用道具 举报

ID:691113 发表于 2020-10-21 17:56 | 显示全部楼层
各位大哥,帮帮忙,别见 ,小白一个,请指教
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表