#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的值,所以真的让人感到困惑....
答案 0 :(得分:5)
这个问题的答案是two's complement和bit shift。
在上面的代码中,-640只是一种花哨的(和非直觉)写入位模式1111 1101 1000 0000
的方式,而>>8
部分是常用的成语切断低8位。
它可能不是在C中设置AVR定时器寄存器的最干净方法,因为至少第二个赋值TCNT1L=(-640);
取决于编译器将丢弃高于8个最低有效位的所有位的假设。 (大多数(?)编译器(包括我猜的avr-gcc)实际上会做到这一点,但它不能保证和依赖于实现的行为AFAIK。)