biying 发表于 2014-5-6 17:59:18

tiny13A未清零的其它位怎么也清零了

请朋友们帮我分析一下,端口初始化是输出1的,到了主程序,我只清零3和4,怎么2和0会是输出0呢? 现在的实际效果是PB2和PB0长亮,PB3和PB4闪亮,PB1不亮。不是说清零时,其它位不受影响吗?这是完整文件
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.1b Evaluation
Automatic Program Generator
?Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 2014-5-6
Author: Freeware, for evaluation and non-commercial use only
Company :
Comments:


Chip type               : ATtiny13A
AVR Core Clock frequency: 9.600000 MHz
Memory model            : Tiny
External RAM size       : 0
Data Stack size         : 16
*****************************************************/

#include <tiny13a.h>
#include<delay.h>
// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=Out Func3=Out Func2=Out Func1=In Func0=Out
// State5=T State4=1 State3=1 State2=1 State1=P State0=0
PORTB=0x1E;
DDRB=0x1D;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR0=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

while (1)
      {
      PORTB&=(0<<3)|(0<<4);
      delay_ms(500);
          PORTB|=(1<<3)|(1<<4);
          delay_ms(500);

      }
}

skylly3 发表于 2014-5-6 18:48:40

43.PORTB=0x1E;

结果,PORTB0=0了。

takashiki 发表于 2014-5-6 19:33:24

第79行      PORTB&=(0<<3)|(0<<4);你全清了好不好

biying 发表于 2014-5-6 20:45:46

本帖最后由 biying 于 2014-5-6 20:47 编辑

takashiki 发表于 2014-5-6 19:33
第79行你全清了好不好

你的意思是说 PORTB&=(0<<3)|(0<<4)这句其实也把PB0、PB1、PB2、PB5清了?那如果我只想清其中某些位,其它位不动要怎么写呢?教材上说这句其它位不动变呢。我的本意思是只想让3和4闪亮,其它位不变

takashiki 发表于 2014-5-7 05:42:51

PORTB&=(0<<3)|(0<<4)等价于PORTB &= 0,效果就是PORTB = 0,全都清0了。
只清3、4位这样:PORTB &= ~((1<<3)|(1<<4));和PORTB|=(1<<3)|(1<<4);是对应的,但是要先括起来再取反,某些操作可能需要强制转换。

biying 发表于 2014-5-7 08:57:53

本帖最后由 biying 于 2014-5-7 09:00 编辑

takashiki 发表于 2014-5-7 05:42
PORTB&=(0

谢谢,照你说的做,成功了!请问如果需要强制转换要怎么做呢?如果多位清零就可以这样是吧:PORTB &= ~((1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4));如果置位:PORTB|=(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)和PORTB|=((1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4))是一样的是吧?
页: [1]
查看完整版本: tiny13A未清零的其它位怎么也清零了