单片机
返回首页

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)的形式使用;

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 如何利用ESP8266制作一个简单的四轴飞行器

  • 非常简单的150W功放电路图

  • 如何使用LED驱动器LM3915制作振动计

  • 一个简单的立体声平衡指示器电路

  • 分享一个电网倾角计电路

  • 一种构建12V和230V双直流电源的简单方法

    相关电子头条文章