ATmega88的简单引脚设置
2022-07-21 来源:csdn
/*******************************************************************************/
//ATmega88简单输出;
//pd0和pb1输入 pd1输出
//当pb0为低电平的时候,pd1输出高电平
//当pb1为低电平的时候,pd1输出高低交换电平
/*******************************************************************************/
#include #include void delay(int x) { int a,b; for(a = x;a >0;a--) { for(b = 114;b>0;b--) { } } } void main() { DDRB = 0x00; //pb input PORTB = 0x00; DDRD |= 0x02; //pd1 output PORTD = 0x00; while(1) { if((PINB & 0x04) != 0x04) //pb2weidi { PORTD = 0x00; delay(538); PORTD = 0x02; delay(538); } else if((PINB & 0x01) != 0x01) // pd0weidi { PORTD = 0x02; } else { PORTD = 0x00; } } } 问题:在判断引脚为高低电平的时候,之前是以下的判断方法: 1、if(PINB & (1 << 2) == 1) //是不是在意思是说 pb2 == 0 pb0 == 1吗?? 2、if (PINB & (1 << 0) == 0) //意思是不是说 pb2 == 0 pb0 == 0 吗? 3、if(PINB | (0 << 2) == 0) { PORTD = 0x02; } //pb0 pb2 都为高电平的时候吗?仿真中显示的是 不管P2 和Pb0是什么电平组合,都会产生灯亮的效果;是不是意思这个判断就根本不行? 解答问题: 1、 if(PINB & (1<<2) == 1) 这个判断始终不能成立,因为1左移两位,最低位是0,位操作中0&任何数都为零,所以这个操作不能成立; 2、if (PINB & (1 << 0) == 0) 这个判断只能判断pb0为0,并不能判断其他的位,因为0&任何数都为零; 3、if(PINB | (0 << 2) == 0) 移位判断的时候只能用&判断,如果用了|操作,除了第二位之外的任何位为1的时候,都不可满足。只有在第二位为0,其他位也为0的情况下才可以满足; 总结:位操作不熟练的时候最好使用if((PINB & 0x02) == 0x02)的形式使用;