以下这个程序我用CMS89F6285B来做的,但是发现IO口没有检测到上拉的5V。更是检测不了按键。请问=大神帮忙看看是哪里错了
#include <cms.h>
#define BSET(x,y) x|=(1<<y) //将寄存器x第y位置1
#define BCLR(x,y) x&=~(1<<y) //将寄存器x第y位置0
#define Key1 RB1 //定义按键IO口
#define Key2 RB2
#define Key3 RB3
#define Key4 RB4
#define Led1 RE3 //定义Led IO口
volatile unsigned char KeyData; //按键值
volatile unsigned char KeyFlag; //按键标志,0位有按键、1位有短按键、2位有长按键
//函数声明
void Kscan(void);
void Maink(void);
//主程序
void main(void)
{
TRISA = 0B11111111; //配置IO状态
TRISB = 0B11111111;
TRISC = 0B11111111;
TRISE = 0B00000000;
//PORTB = 0B11111111;
WPUA = 0B11111111; //配置上拉情况
WPUB = 0B00011110;
WPUC = 0B00000000;
WPUE = 0B00000000; //1为使能上拉,0为禁止上拉
while(1)
{
asm("clrwdt"); //清看门狗
Kscan(); //按键扫描
Maink(); //按键处理
}
}
/***********************************************
函数名称:Kscan
函数功能:按键扫描
入口参数:无
出口参数:无
备注:
************************************************/
void Kscan()
{
static unsigned char keycount,nkeycount,keyold;
static unsigned int keylong;
KeyData = 0;
if(!Key1) //为低时有按键
BSET(KeyData,0);
if(!Key2)
BSET(KeyData,1);
if(!Key3)
BSET(KeyData,2);
if(!Key4)
BSET(KeyData,3);
if(KeyData) //有按键
{
if(KeyData == keyold) //键值等于旧键值
{
if(KeyFlag & 0x02) //有按键判断长按键
{
if((KeyData == 0x99) && (++keylong >= 200))//匹配有长按键的按键,如需长按键可修改KeyData匹配值
{
keylong =0;
BSET(KeyFlag,0); //有按键标志
BSET(KeyFlag,2); //长按键标志
}
}
else if(++keycount >= 5) //消抖动
{
BSET(KeyFlag,0); //有按键标志
BSET(KeyFlag,1); //短按键标志
}
}
else
{
keyold =KeyData;
keycount =0;
}
}
else //无按键
{
keycount =0;
keylong =0;
if(++nkeycount >=5) //无按键超过5次时清标志位
{
KeyFlag =0;
KeyData =0;
keyold =0;
}
}
}
/***********************************************
函数名称:Maink
函数功能:按键处理
入口参数:无
出口参数:无
备注:
************************************************/
void Maink()
{
if(KeyFlag & 0x01)
{
BCLR(KeyFlag,0);
switch(KeyData)
{
case 0x01: Led1 = 1; break;
case 0x02: Led1 = 0; break;
case 0x04: Led1 = 1; break;
case 0x08: Led1 = 0; break;
}
}
}
|