|
发表于 2009-12-25 22:41:18
|
显示全部楼层
状态机一毫秒扫描一次,长按100MS后以10MS一次返回键值
//L0 为高
#define L0H PORTB=PORTB|0b00000010;
//L1 为高
#define L1H PORTD=PORTD|0b01000000;
//L2 为高
#define L2H PORTD=PORTD|0b10000000;
//L0 为低
#define L0L PORTB=PORTB&(~(1<<1));
//L1 为低
#define L1L PORTD=PORTD&(~(1<<6));
//L2 为低
#define L2L PORTD=PORTD&(~(1<<7));
//读H0-H2口电平
#define KEYDATA ((PIND>>2)&0b00000111)
void KEYBOARD_INT(void)
{
//H输入.L输出
DDRB=DDRB|0b00000010; //L0 为输出
DDRD=DDRD|0b10000000; //L1 为输出
DDRD=DDRD|0b01000000; //L2 为输出
DDRD=DDRD&0b11100011; //H0,H1,H2为输入
PORTD=PORTD|0b00011100; //H0,H1,H2为上拉
L0H
L1H
L2H
}
void KEYBOARD(unsigned char *DATA)
{
unsigned char JIANZHI[3][8]={
{7,6,5,4,3,2,1,0},
{14,13,12,11,10,9,8,0},
{21,20,19,18,17,16,15,0}
};
L0L
DATA[3]=JIANZHI[0][KEYDATA];
L0H
L1L
DATA[3]=JIANZHI[1][KEYDATA]+DATA[3];
L1H
L2L
DATA[3]=JIANZHI[2][KEYDATA]+DATA[3];
L2H
if(DATA[3]!=0)
{
if(DATA[1]==DATA[3])
{
if(DATA[2]<100) //长按100MS后
{
DATA[2]++;
if(DATA[2]==10)//10MS一次返回键值
DATA[0]=DATA[1];
else
DATA[0]=0;
}
else
{
if(DATA[4]==10)
{
DATA[0]=0;
DATA[4]=0;
}
DATA[4]++;
if(DATA[4]==10) DATA[0]=DATA[1];
}
}
else
{
DATA[1]=DATA[3];
DATA[2]=0;
DATA[4]=0;
DATA[0]=0;
}
}
else
{
DATA[2]=0;
DATA[4]=0;
DATA[0]=0;
}
} |
|