uint8 KBPin[8]= {23,22,21,20,19,18,17,16};
PORTx KB_Port[8]={PORTB,PORTB,PORTB,PORTB,PORTB,PORTB,PORTB,PORTB};
void KBInit(void)
{
uint8 i;
for(i = 0;i < 4;i++)//
{
gpio_init (KB_Port[i], KBPin[i], GPI_UP, 0);
}
for(i = 4;i < 8;i++)
{
gpio_init (KB_Port[i], KBPin[i], GPO_HDS,0);
}
}
//============================================================================
//函数名称:KBScanN
//函数返回:多次扫描键盘得到的键值
//参数说明:重复扫描键盘的的次数(KB_count)
//功能概要:多次扫描键盘,消除"抖动"。
//============================================================================
uint8 KBScanN(uint8 KB_count)
{
uint8 i,KB_value_last,KB_value_now;
// 先扫描一次得到的键值,便于下面比较
if (0 == KB_count || 1 == KB_count)
return KBScan1();
KB_value_now = KB_value_last = KBScan1();
//以下多次扫描消除误差
for (i=0; i<KB_count-1; i++)
{
KB_value_now = KBScan1();
if (KB_value_now == KB_value_last)
return KB_value_now; //返回扫描的键值
else
KB_value_last = KB_value_now;
}
// 返回出错标志
return 0xFF;
}
//============================================================================
//函数名称:KBDef
//函数返回:无
//参数说明:键值valve
//功能概要:键值转为定义值函数。
//============================================================================
//键盘定义表
//键盘定义表
const uint8 KBtable[] =
{
0xEE,8,0xDE,9,0xBE,10,0x7E,11,
0xED,5,0xDD,6,0xBD,7,0x7D,12,
0xEB,2,0xDB,3,0xBB,4,0x7B,13,
0xE7,0,0xD7,14,0xB7,1,0x77,15,
0x00
};
uint8 KBDef(uint8 valve)
{
uint8 KeyPress; //键定义值
uint8 i;
i = 0;
KeyPress = 0xff;
while (KBtable[i] != 0x00) //在键盘定义表中搜索欲转换的键值,直至表尾
{
if(KBtable[i] == valve) //在表中找到相应的键值
{
KeyPress = KBtable[i+1]; //取出对应的键定义值
break;
}
i += 2; //指向下一个键值,继续判断
}
return KeyPress;
}
//============================================================================
//函数名称:KBScan1
//函数返回:扫描到的键值
//参数说明:键值valve
//功能概要:扫描1次4*4键盘,返回扫描到的键值,若无按键,返回0xff 。
//============================================================================
uint8 KBScan1(void)
{
uint8 i,j,tmp=0xFF;
uint8 k = 0;//
KBInit(); //键盘初始化
for (i = 0; i <= 3; i++) //最多将扫描4根行线
{
if((GPIO_PDIR_REG(GPIOx[KB_Port[i]]) & (1<<KBPin[i])) == 0)//GPIO_PDIR数据端口输入寄存器
{
for(j = 4;j <8;j++)
{
gpio_set(KB_Port[j],KBPin[j],1);
for(k = 0;k <100;k++)
{
asm("NOP");
}
if((GPIO_PDIR_REG(GPIOx[KB_Port[i]]) & (1<<KBPin[i])) != 0)
{
if(i == 0)
{
if(j == 4)
tmp = 0xEE;
else if(j == 5)
tmp = 0xDE;
else if(j == 6)
tmp = 0xBE;
else if(j == 7)
tmp = 0x7E;
}
else if(i == 1)
{
if(j == 4)
tmp = 0xED;
else if(j == 5)
tmp = 0xDD;
else if(j == 6)
tmp = 0xBD;
else if(j == 7)
tmp = 0x7D;
}
else if(i == 2)
{
if(j == 4)
tmp = 0xEB;
else if(j == 5)
tmp = 0xDB;
else if(j == 6)
tmp = 0xBB;
else if(j == 7)
tmp = 0x7B;
}
else if(i == 3)
{
if(j == 4)
tmp = 0xE7;
else if(j == 5)
tmp = 0xD7;
else if(j == 6)
tmp = 0xB7;
else if(j == 7)
tmp = 0x77;
}
else
tmp = 0x00;
break;
}
gpio_set(KB_Port[j],KBPin[j],0);
}
}
}
for(k=0;k<=80;k++)asm("NOP");
return (tmp);
}
以上是矩阵键盘扫描程序,现在我的问题是temp=0x7d.0x7b.0x77对应的3个键,当按下时,时而有效,时而无效,而其他所有按键都很灵敏,有人遇到过类似问题吗?请指教 |