/*******************************************************************************/
//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)的形式使用;
上一篇:基于ATMEGA8A_AVR单片机温度测控系统proteus仿真
下一篇:ATmega88输出1khz的方波
推荐阅读最新更新时间:2024-11-08 12:19
设计资源 培训 开发板 精华推荐
- 使用 Analog Devices 的 LTC3803IS6-5 的参考设计
- LT1952MPGN-1 36V 至 72V 输入至 5V/20A 同步正向转换器的典型应用电路
- AM3GH-2412DZ ±12V 传导和辐射发射 DC/DC 转换器的典型应用
- EVB-EC2630QI,用于 EC2630QI 4.5A、27W、12V DC-DC 中压总线转换器的评估板
- LT6656AIDC-2.5、2.5V ADC 电压基准和桥式激励电源的典型应用
- LTC1261LIMS8-4 最小部件数 -4.5V 发生器的典型应用电路
- STEVAL-ILL043V1,使用 L6562A 高端、75 W 高功率因数反激式 LED 驱动器和两个可调光灯串的演示板
- AD8033ARZ高速单位增益峰值检测器的典型应用电路
- EVAL-AD5755-1SDZ,使用 AD5755-1 四通道、16 位、串行输入、4 mA 至 20 mA、电压输出 DAC 的评估板
- 触屏T12