#include <avr/io.h>
#include <avr/interrupt.h>
int main()
{
  DDRB|=0x82;
  DDRC=0x00;
  DDRD=0xFF;
  TCNT1H=(-640)>>8;
  TCNT1L=(-640);
  TCCR1A=0X00;
  TCCR1B=0X01;
  TIMSK=(1<<TOIE0)|(1<<TOIE1)
  sei();
  PORTD=PINC;
}

ISR(TIMER1_OVF_vect)
{
  TCNT1H=(-640)>>8;
  TCNT1L=(-640);
  PORTB^=0X80;
}

请帮助我解决TCNT1H=(-640)>>8; TCNT1L=(-640);代码….这真的很混乱,因为我一直在使用0-256的值。。。。

最佳答案

这个问题的答案是two's complementbit shift
在上面的代码中,-640只是编写位模式1111 1101 1000 0000的一种奇特(且不直观)的方式,而>>8部分是用于切掉较低8位的常用习惯用法。
这可能不是在C中设置AVR定时器寄存器的最干净的方法,因为至少第二个赋值TCNT1L=(-640);取决于编译器将丢弃8个最低有效位以上的所有位的假设。(大多数(?)编译器(包括avr-gcc,我猜)实际上可以做到这一点,但这是不保证的,而且依赖于实现的行为也是不可靠的。)

10-08 02:03