以下這個程序我用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;
}
}
}
|