newpro 发表于 2009-4-13 11:08:47

傻孩子帮帮忙~

#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()
{
ucharkey_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.

Gorgon_Meducer 发表于 2009-4-13 15:22:04

在定时器触发的间隔, key_temp一直保持上一次的值……比如,上一次key_temp的值为1,
那么在下一次定时器触发前,主循环会一直检测到key_temp == 1的条件成立,于是,time就
一直加一,你检测到time = 75,恰好说明,再每次定时器触发的间隔,主循环一功能执行75次。

newpro 发表于 2009-4-15 09:28:45

谢谢^_^,其实道理挺简单,当时怎么就没想明白呢
页: [1]
查看完整版本: 傻孩子帮帮忙~