user-0 提问: 求教大神如何读取两个Button上的值并返回主函数

回复:
user: user-1
content: initGPIO(4);     while(1) {         a=-1;b=-1;//加这两句         buttonreading(&a,&b);         if(a==0) {             for(int i=4;i>=1;i--) {                 PORTB |= (1<<i);                 delay(50);                 PORTB &=~(1<<i);             }         }         if(b==0) {             PORTB &=~(1<<PORTB1);             PORTB &=~(1<<PORTB2);             PORTB &=~(1<<PORTB3);             PORTB &=~(1<<PORTB4);         }     }

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:#include <avr/io.h> #include <inttypes.h> #include <MSOE/delay.c> int a,b; void initGPIO(int x); void delay(uint16_t x); int buttonreading(int *x,int *y); int main(void) {     DDRB |= (1<<PORTB1);     DDRB |= (1<<PORTB2);     DDRB |= (1<<PORTB3);     DDRB |= (1<<PORTB4);     DDRD &= ~(1<<PORTD1);     PORTD |= (1<<PORTD1);     DDRD &= ~(1<<PORTD2);     PORTD |= (1<<PORTD2);     initGPIO(4);     while(1) {         buttonreading(&a,&b);         if(a==0) {             for(int i=4;i>=1;i--) {                 PORTB |= (1<<i);                 delay(50);                 PORTB &=~(1<<i);             }         }         if(b==0) {             PORTB &=~(1<<PORTB1);             PORTB &=~(1<<PORTB2);             PORTB &=~(1<<PORTB3);             PORTB &=~(1<<PORTB4);         }     } } void initGPIO(int x) {     for(int i=1;i<=x;i++) {         PORTB |= (1<<i);         delay(50);         PORTB &= ~(1<<i);     } } void delay(uint16_t x) {     uint16_t i,j;     for(i=0;i<x;i++)         for(j=0;j<10000;j++)             ;     return; } int buttonreading(int *x,int *y) {     *x=PIND&(1<<PORTD1);     *y=PIND&(1<<PORTD2); } 你好，的确比刚刚有所改善了，但是现在小灯泡只挨个亮一次就全部不亮了，那个InitGPIO的function感觉还是应该放在while（1）里头，但是放进去之后按钮还是没用

user: user-0
content: 引用 楼主 baidu_36127636 的回复:#include <avr/io.h> #include <inttypes.h> #include <MSOE/delay.c> void initGPIO (int x); void delay(uint16_t x); int buttonreading(int *x,int *y); int main(void) { 	DDRB |= (1<<PORTB1); 	DDRB |= (1<<PORTB2); 	DDRB |= (1<<PORTB3); 	DDRB |= (1<<PORTB4); 	DDRD &= ~(1<<PORTD1); 	PORTD |= (1<<PORTD1); 	DDRD &= ~(1<<PORTD2); 	PORTD |= (1<<PORTD2); 	while(1) 	{ 		initGPIO(4); 		int a,b; 		buttonreading(&a,&b); 	    while(a==0) 	    { 	    	for(int i=4;i>=1;i--) 	    	{ 	    		PORTB |= (1<<i); 	    		delay(50); 	    		PORTB &=~(1<<i); 	    	} 	    } 	    while(b==0) 	    { 	    	PORTB &=~(1<<PORTB1); 	    	PORTB &=~(1<<PORTB2); 	    	PORTB &=~(1<<PORTB3); 	    	PORTB &=~(1<<PORTB4); 	    } 	} } void initGPIO(int x) { 	for(int i=1;i<=x;i++){ 		PORTB |= (1<<i); 		delay(50); 		PORTB &= ~(1<<i); 	} } void delay(uint16_t x) { 	uint16_t i,j; 	for(i=0;i<x;i++) 		for(j=0;j<10000;j++) 			; 	return; } int buttonreading(int *x,int *y) { 	x=PIND&(1<<PORTD1); 	y=PIND&(1<<PORTD2); }  这是我写的代码 但是连接到arduino board上似乎按钮是没反应的，按钮的连接应该是没问题。要求是一定要用函数来读取两个button的值，并返回主函数，如果第一个按钮按下去做for(int i=4;i>=1;i--) 	    	{ 	    		PORTB |= (1<<i); 	    		delay(50); 	    		PORTB &=~(1<<i); 	    	} 如果第二个按钮按下去做 while(b==0) 	    { 	    	PORTB &=~(1<<PORTB1); 	    	PORTB &=~(1<<PORTB2); 	    	PORTB &=~(1<<PORTB3); 	    	PORTB &=~(1<<PORTB4); 	    } 请大家帮忙看看我的buttonreading函数是出了什么问题？如果有更好的函数能读取两个button的值也请发上来参考一下。 你好，的确比刚刚有所改善了，但是现在小灯泡只挨个亮一次就全部不亮了，那个InitGPIO的function感觉还是应该放在while（1）里头，但是放进去之后按钮还是没用

user: user-1
content: #include <avr/io.h> #include <inttypes.h> #include <MSOE/delay.c> int a,b; void initGPIO(int x); void delay(uint16_t x); int buttonreading(int *x,int *y); int main(void) {     DDRB |= (1<<PORTB1);     DDRB |= (1<<PORTB2);     DDRB |= (1<<PORTB3);     DDRB |= (1<<PORTB4);     DDRD &= ~(1<<PORTD1);     PORTD |= (1<<PORTD1);     DDRD &= ~(1<<PORTD2);     PORTD |= (1<<PORTD2);     initGPIO(4);     while(1) {         buttonreading(&a,&b);         if(a==0) {             for(int i=4;i>=1;i--) {                 PORTB |= (1<<i);                 delay(50);                 PORTB &=~(1<<i);             }         }         if(b==0) {             PORTB &=~(1<<PORTB1);             PORTB &=~(1<<PORTB2);             PORTB &=~(1<<PORTB3);             PORTB &=~(1<<PORTB4);         }     } } void initGPIO(int x) {     for(int i=1;i<=x;i++) {         PORTB |= (1<<i);         delay(50);         PORTB &= ~(1<<i);     } } void delay(uint16_t x) {     uint16_t i,j;     for(i=0;i<x;i++)         for(j=0;j<10000;j++)             ;     return; } int buttonreading(int *x,int *y) {     *x=PIND&(1<<PORTD1);     *y=PIND&(1<<PORTD2); }