|
#include"reg51.h"
uchar key_state=0;
uchar key_temp,time=0;
#define k1_1 1
#define k1_2 2
#define k1_3 3
#define k1_4 4
#define k2_1 5
#define k2_2 6
#define k2_3 7
#define k2_4 8
#define k3_1 9
#define k3_2 10
#define k3_3 11
#define k3_4 12
#define k4_1 13
#define k4_2 14
#define k4_3 15
#define k4_4 16
uchar keyscan()
{
uchar key_value, key_line;
uchar key_return = 0, i;
switch(key_state)
{
case 0:
key_line=0xEF;//0b 0000 1000
for(i=0; i<4; i++)
{
P0=(key_line|0x0F);
if(( P0&0x0F) == 0x0F)
{
key_line<<= 1;
}
///////////////
else
{
key_value=P0;
key_state++;
break;
}
}
break;
//////////////////
case 1:
if(P0 == key_value)
{
key_value=P0;
switch (key_value )
{
case 0xEE: //0b 1110 1000
key_return = k1_1;
break;
case 0xED: //0b 1101 1000
key_return = k1_2;
break;
case 0xEB: //0b 1011 1000
key_return = k1_3;
break;
case 0xE7: //0b 0111 1000
key_return = k1_4;
break;
//////////////////////////////
case 0xDE: //0b 1110 0100
key_return = k2_1;
break;
case 0xDD: //0b 1101 0100
key_return = k2_2;
break;
case 0xDB: //0b 1011 0100
key_return = k2_3;
break;
case 0xD7: //0b 0111 0100
key_return = k2_4;
break;
/////////////////////////////////
case 0xBE: //0b 1110 0010
key_return = k3_1;
break;
case 0xBD: //0b 1101 0010
key_return = k3_2;
break;
case 0xBB: //0b 1011 0010
key_return = k3_3;
break;
case 0xB7: //0b 1011 0010
key_return = k3_4;
break;
case 0x7E: //0b 1011 0010
key_return = k4_1;
break;
case 0x7D: //0b 1011 0010
key_return = k4_2;
break;
case 0x7B: //0b 1011 0010
key_return = k4_3;
break;
case 0x77: //0b 1011 0010
key_return = k4_4;
break;
/////////////////////////////
}
key_state=2;
}
else
key_state=0;
break;
case 2:
if(( P0&0x0F) == 0x0F)key_state=0;
break;
}
return key_return;
}
////////////////////////////////////////
void init_timer1()
{
TMOD=0x10; ///定时器1方式1
TL1=0xDC;
TH1=0X00;
EA=1;
ET1=1;
TR1=1;
}
/////////////////////////////////
time1()interrupt 3 using 1
{
key_temp = keyscan();
}
////////////////////
void main()
{
init_timer1();
while(1)
{
if(key_temp ==1)time=time+1; //time等于75?
if(key_temp ==2)time=key_temp; //time==2
time_dis();
}
}
我试着把例程改成51单片机的模式,有下列问题:
用上述按键程序,本来欲实现按一次键,time就增加一。
但是却变成按一次键time+1不是一次加1,而是time一直往下加,我在case 1:里加上第二次得到的key_return值与第一次相同则不返回键值结果time就不会一直加了,key_return没变化吗?uchar key_return = 0没有作用,不知道为何?键盘程序可用,if(key_temp ==2)time=key_temp; 这段返回的是键值2. |
|