|
我使用的是ICCAVR6。25,对照书上例子,将TXC与RXC两个脚直接连接起来,程序发送0-15,RX接收后显示,可是结果只显示0,我看了好几天了,不明白,马老师能帮我看看指点一下吗?谢谢你了!
按理说没有问题啊。。。
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define BAUD 9600
#define CRYSTAL 4000000
#define FRAMING_ERROR (1<<FE) //接收帧错
#define PARITY_ERROR (1<<PE) //校验错误
#define DATA_OVERRUN (1<<DOR) //接收数据溢出错
#define DATA_REGISTER_EMPTY (1<<UDRE) //数据寄存器空
#pragma data:code
const table_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};
const table_wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
#pragma interrupt_handler USART_RXC:12 //RX接收中断涵数
void USART_RXC()
{
uchar status,data;
UCSRB&=~BIT(RXCIE);//RXCIE
status=UCSRA;
data=UDR;
if(status&(FRAMING_ERROR|PARITY_ERROR|DATA_OVERRUN)==0)
PORTC=table_duan[data];
UCSRB|=BIT(RXCIE);
}
void USTART_TXC(uchar data) //数据发送
{
while(!(UCSRA&DATA_REGISTER_EMPTY));
UDR=data;
}
void init_usart() //初始化
{
PORTD=0X03;
DDRD=0X02;
UCSRA=0X00;
UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);//10011000
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
UBRRH=0;// 晶振使用4M,波特率9600
UBRRL=25;//
}
void delay(uint z) //延时函数
{
uint x,y;
for(x=0;x<z;x++)
for(y=0;y<5;y++);
}
void main()
{
uchar i=0;
DDRA=0X0f;
PORTA=table_wei[0]; //数码管位选
DDRC=0xff;
PORTC=table_duan[0]; //数码管段选
init_usart();
SEI();
while(1)
{
if(i++==15)i=0;
USTART_TXC(i);
delay(5000);
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|