请教AVR单片机的问题

来源:百度知道 编辑:UC知道 时间:2024/09/19 16:43:24
void uart_send(uchar data)
{
while(!(UCSRA&(BIT(UDRE)))) ;
UDR=data;
while(!(UCSRA&(BIT(TXC))));
UCSRA|=BIT(TXC);
}

上面的一小段程序为AVR串行通信发送一个字节数据的程序
关于UCSRA|=BIT(TXC); 这句话不太理解
1.本来while(!(UCSRA&(BIT(TXC))));这句话已经检测到TXC为1了,为什么还要多UCSRA|=BIT(TXC); 这句话将其置1呢?
2.置1干什么啊,我觉得应该是置0啊,就好象51的单片机里面的TI标志位一样。
请高手解释一下吧,谢谢!
能稍微详细点说明一下吗,写1不就是把这位变成1了吗,怎么还能清零了呢?
这样岂不是更糊涂了,怎么能知道那些寄存器有这样的特点啊,总不能都是写1就是清零吧?
谢谢了

The TXC Flag bit is auto-matically cleared when a transmit complete interrupt is executed, or it can be cleared by writing
a one to its bit location.
这是datasheet里的原话,意思就是写通过写1把中断标识清零。
AVR就是这样,有时候中断得通过写1来清零。不过仅限于清某些中断标志的时候,一般不会对编程产生太大困扰。我刚开始也迷糊,后来习惯了。

AVR的有些寄存器,在上面写1起的作用是清0.
也就是说,这个语句UCSRA|=BIT(TXC); 起的作用就是把此位清零。

嗯,下个datasheet看,操作寄存器的时候查一下是不是有写1清0的特性,其实不会很麻烦。用多了就习惯了,我自己的经验。呵呵

自己KK它的datasheet就好了