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);
}
}
43.PORTB=0x1E;
结果,PORTB0=0了。 第79行 PORTB&=(0<<3)|(0<<4);你全清了好不好 本帖最后由 biying 于 2014-5-6 20:47 编辑
takashiki 发表于 2014-5-6 19:33
第79行你全清了好不好
你的意思是说 PORTB&=(0<<3)|(0<<4)这句其实也把PB0、PB1、PB2、PB5清了?那如果我只想清其中某些位,其它位不动要怎么写呢?教材上说这句其它位不动变呢。我的本意思是只想让3和4闪亮,其它位不变 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 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]