你这程序把清RCIF语句屏蔽了,但TXREG=RCREG这一句就是读接收结果(把接收结果RCREG送到发送寄存器TXREG里),所以会自动让RCIF清0,只有新数据来时,RCIF才会置1,才能再进入中断。
如果你把发送的语句改为TXREG=0X12(或其他不是RCREG的寄存器的变量),因此中断后没有读取接收数据,也就不能清RCIF,RCIF仍然为1,即中断服务程序退出后,还存在的中断请求,因此就会马上进入中断,从而出现不停的发送数据的现象。
解决的办法有2:
1、让原来屏蔽的语句RCIF=0有效;
2、空读RCREG,如定义一个变量A(unsigned
char
A),在发送数据后或前,增加A=RCREG就可以了。
给你个例子,pic16f77 usart的驱动;http://blog.ednchina.com/warden/236267/message.aspx
上面例子是用轮循方式做的,在很多地方有限制。
PIC的USART使用发送中断时要注意:Once the TXREG register transfers the data to the TSR register(occurs in one TCYCLE), the TXREG is empty and interrupt bit TXIF (PIR1<4>) is set。就是只要TXREG里没有数据就会置TXIF中断标志。
你可以这样实现:先把TX中断关了,把要发的数据放入一个定义好的TX_BUF[]中,然后再开TX中断,把TX_BUF发出,发完之后再关TX中断!
希望对你有点帮助。
if(RCIF==1)
{
v = RCREG
rxstr[rx_count]=v
PrintChar(rxstr[rx_count])//PrintChar的原型是什么???
rx_count++
if(rx_count >7)
testcomflag =1
}
// RCIF=0去掉这两句,没必要+上去
// RCIE=1
1。把最后两句去掉
2。你的PintChar原型是什么?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)