向高手求助
时间:10-02
整理:3721RD
点击:
u8 Key_Down()//判断有无键按下
{
u8 key_num,scan_code;
scan_code = 0xC7;
PORTB = scan_code;//逐行扫描的行全部为零,列全部为1,高2位与键盘无关,全为1
key_num = PORTB;
if((key_num&0x07)!=0x07)
{
key_down_state=1;
if(key_down_time)//消抖
{
key_down_time=0;
key_num = PORTB;
if((key_num&0x07)!=0x07) return 1;
else return 0;
}
else return 0;
// return 1;
}
else
{
return 0;
}
}
u8 Scan_Key_Down()
{
u8 i,scan_code,key_num;
//scan_code = 0xf7; //逐行扫描的第一行清零
//if(Key_Down())
//{
scan_code = 0xf7; //逐行扫描的第一行清零
for(i=0;i<3;i++)
{
PORTB = scan_code;//逐行扫描的扫描码
key_num = PORTB;
if((key_num&0x07)!=0x07)
{
break;
}
scan_code=(scan_code<<1)|0x0f;
}
// key_num=~key_num;
//return key_num;
//}
return key_num;
}
u8 Key_Manage(u8 key_code)
{
u8 key_value;
//while(Key_Down());//等待按键释放
//{
switch(key_code)
{
case 0xf6://第一行第一列1111 0 110
key_value &= 0x00;
key_value |= 0x01;
break;
case 0xf5://第一行第二列 1111 0 101
key_value &= 0x00;
key_value |= 0x02;
break;
case 0xf3: //第一行第三列1111 0 011
key_value &= 0x00;
key_value |= 0x03;
break;
case 0xee://第二行第一列 1110 1 110
key_value &= 0x00;
key_value |= 0x04;
break;
case 0xed://第二行第二列 1110 1 101
key_value &= 0x00;
key_value |= 0x05;
break;
case 0xeb: //第二行第三列 1110 1 011
key_value &= 0x00;
key_value |= 0x06;
break;
case 0xde://第三行第一列 1101 1 110
key_value &= 0x00;
key_value |= 0x07;
break;
case 0xdd: //第三行第二列 1101 1 101
key_value &= 0x00;
key_value |= 0x08;
break;
case 0xdb: //第三行第三列 1101 1 011
key_value &= 0x00;
key_value |= 0x09;
break;
default: key_value &= 0x00;
}
//}
return key_value;
}
u8 Scan_Key()
{
u8 Key_Code;
static u8 key_value;
if(Key_Down())
{
Key_Code = Scan_Key_Down();
while(Key_Down());
key_value = Key_Manage(Key_Code);
}
return key_value;
}
定时中断里面
if(key_down_state)
{
key_down_count++;
if(key_down_count>10)
{
key_down_count=0;
key_down_state=0;
key_down_time=1;
}
}
主函数里面
while(1)
{
Key_Value=Scan_Key();
Seg_Display(2,(Key_Value/16)); //显示十位数
Seg_Display(3,(Key_Value%16)); //显示个位数
}
上面的程序运行之后,是可以显示出键值,但是并不是每次弹起后显示的都是按键的键值,有时候会出现显示的00的情况
每个按键都是这样的情况
{
u8 key_num,scan_code;
scan_code = 0xC7;
PORTB = scan_code;//逐行扫描的行全部为零,列全部为1,高2位与键盘无关,全为1
key_num = PORTB;
if((key_num&0x07)!=0x07)
{
key_down_state=1;
if(key_down_time)//消抖
{
key_down_time=0;
key_num = PORTB;
if((key_num&0x07)!=0x07) return 1;
else return 0;
}
else return 0;
// return 1;
}
else
{
return 0;
}
}
u8 Scan_Key_Down()
{
u8 i,scan_code,key_num;
//scan_code = 0xf7; //逐行扫描的第一行清零
//if(Key_Down())
//{
scan_code = 0xf7; //逐行扫描的第一行清零
for(i=0;i<3;i++)
{
PORTB = scan_code;//逐行扫描的扫描码
key_num = PORTB;
if((key_num&0x07)!=0x07)
{
break;
}
scan_code=(scan_code<<1)|0x0f;
}
// key_num=~key_num;
//return key_num;
//}
return key_num;
}
u8 Key_Manage(u8 key_code)
{
u8 key_value;
//while(Key_Down());//等待按键释放
//{
switch(key_code)
{
case 0xf6://第一行第一列1111 0 110
key_value &= 0x00;
key_value |= 0x01;
break;
case 0xf5://第一行第二列 1111 0 101
key_value &= 0x00;
key_value |= 0x02;
break;
case 0xf3: //第一行第三列1111 0 011
key_value &= 0x00;
key_value |= 0x03;
break;
case 0xee://第二行第一列 1110 1 110
key_value &= 0x00;
key_value |= 0x04;
break;
case 0xed://第二行第二列 1110 1 101
key_value &= 0x00;
key_value |= 0x05;
break;
case 0xeb: //第二行第三列 1110 1 011
key_value &= 0x00;
key_value |= 0x06;
break;
case 0xde://第三行第一列 1101 1 110
key_value &= 0x00;
key_value |= 0x07;
break;
case 0xdd: //第三行第二列 1101 1 101
key_value &= 0x00;
key_value |= 0x08;
break;
case 0xdb: //第三行第三列 1101 1 011
key_value &= 0x00;
key_value |= 0x09;
break;
default: key_value &= 0x00;
}
//}
return key_value;
}
u8 Scan_Key()
{
u8 Key_Code;
static u8 key_value;
if(Key_Down())
{
Key_Code = Scan_Key_Down();
while(Key_Down());
key_value = Key_Manage(Key_Code);
}
return key_value;
}
定时中断里面
if(key_down_state)
{
key_down_count++;
if(key_down_count>10)
{
key_down_count=0;
key_down_state=0;
key_down_time=1;
}
}
主函数里面
while(1)
{
Key_Value=Scan_Key();
Seg_Display(2,(Key_Value/16)); //显示十位数
Seg_Display(3,(Key_Value%16)); //显示个位数
}
上面的程序运行之后,是可以显示出键值,但是并不是每次弹起后显示的都是按键的键值,有时候会出现显示的00的情况
每个按键都是这样的情况
666666666666666666666666666
