标题:
这单片机按键检测代码的问题,现在是检测不到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