hot大叔,AVR的端口能否输入输出复用,我手上一个产品用的是AVR8,想加两个按键,可是都用完了,现在想把两个按键和LED灯共用。。。。LED灯是输出管脚,按键是输入管脚。我是在中断里检测按键,初始化程序是把那两个复用的管脚设为输出,在中断检测按键时,在设置成输入。我试过,要是有按键被检测到,那么其他的数码管就不能点亮了。。。。。。。附上部分程序:
void io_init(void)
{
DDRC|=(1<<PC0)|(1<<PC1)|(1<<PC3);//把cs,sdi,sclk管脚连接的io口设为输出
DDRC&=~(1<<PC2);//把SDO管脚连接的IO设为输入
PORTC|=(1<<PC2);//打开PC2的上拉电阻
DDRD|=(1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7);//数码管片选
DDRB=0XFF;//数码管
DDRD|=(1<<PD0)|(1<<PD1);//LED
DDRC|=(1<<PC4)|(1<<PC5); //LED
DDRD&=~(1<<PD2);//按键设为输入
PORTD|=(1<<PD2);//按键开上拉
PORTB=0XFF;
PORTC=0XFF;
PORTD=0XFF;
}
void led_light(uchar led)
{
if(led==1)
{
PORTC&=~(1<<PC5);//点亮右1
PORTC|=(1<<PC4);//熄灭右2
PORTD|=(1<<PD1);//熄灭右3
PORTD|=(1<<PD0);//熄灭右4
}
else if(led==2)
{
PORTC|=(1<<PC5);
PORTC&=~(1<<PC4);
PORTD|=(1<<PD1);
PORTD|=(1<<PD0);
}
else if(led==3)
{
PORTC=(1<<PC5);
PORTC|=(1<<PC4);
PORTD&=~(1<<PD1);
PORTD|=(1<<PD0);
}
else if(led==4)
{
PORTC|=(1<<PC5);
PORTC|=(1<<PC4);
PORTD|=(1<<PD1);
PORTD&=~(1<<PD0);
}
else
{
PORTC|=(1<<PC5);
PORTC|=(1<<PC4);
PORTD|=(1<<PD1);
PORTD|=(1<<PD0);
}
}
/******中断是50ms*****/
#pragma interrupt_handler clock2:4
void clock2(void)
{
DDRC&=~((1<<PC4)|(1<<PC5)); //设置为输入管脚检查按键,复用的两个按键
NOP();
NOP();
NOP();
if(key1_status==KEY_OFF)//判断按键1的状态,KEY_OFF=1,KEY_ON=0
{
if((!(PIND&(1<<PD2))))//如果按键被按下
key1_status=KEY_ON;
else key1_status=KEY_OFF;
}
else
{
if((!(PIND&(1<<PD2))))//如果按键被再次按下
{
key_count++;
//key_check++;
}
key1_status=KEY_OFF;
}
if(key2_status==KEY_OFF)//判断按键1的状态
{
if((!(PINC&(1<<PC4))))//如果按键被按下
key2_status=KEY_ON;
else key2_status=KEY_OFF;
}
else
{
if(!(PINC&(1<<PC4)))//如果按键被再次按下
{ //按键被按下
//key_count++;
key_check++;
}
key1_status=KEY_OFF;
}
NOP();
NOP();
NOP();
if(key3_status==KEY_OFF)//判断按键1的状态
{
if((!(PINC&(1<<PC5))))//如果按键被按下
key2_status=KEY_ON;
else key2_status=KEY_OFF;
}
else
{
if((!(PINC&(1<<PC5))))//如果按键被再次按下
{//按键被按下
//key_count++;
key_check++;
}
key1_status=KEY_OFF;
}
*/
io_init();//管脚再次初始化,以前直接是DDRC|=(1<<PC4)|(1<<PC5)
if(key_count==5) key_count=1;
//if(key_check==10) key_check=0;
led_light(key_count);
NOP();
}
大叔帮忙看看,我都快不行了。。。。。输入和输出到底该怎么复用呢???? |