📄 usartoriginality.c
字号:
#include <io.h>
#include <interrupt.h>
#include <signal.h>
#define F_CPU 14745600 /* 4Mhz 4000000*/
#define UART_BAUD_RATE 4800 /* 9600 baud */
#define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16l)-1)
typedef unsigned char u08;
typedef char s08;
typedef unsigned short u16;
typedef short s16;
u08 *array;
u16 counter;
u16 k,i,j;
u08 led[6];
void USART_Transmit(u08 *buf,u16 size)
{
array=buf;
counter=size;
//while(!(UCSR1A&(1<<UDRE))) //此处是否适合于要这一句有待试验,按照后面的语句,可以不用这一句。
//;
outp(*buf,UDR1);
}
SIGNAL(SIG_UART1_TRANS)
{
array++;
if(--counter)
{
for(i=0;i<=100;i++)
{
for(j=0;j<=100;j++)
;
}
outp(*array,UDR1);
}
}
SIGNAL(SIG_UART1_RECV)
/* signal handler for receive complete interrupt */
{
//outp(0x4b,PORTB); //作为每一步测试用
led[k]= inp(UDR1); /* read byte for UART data buffer */
if(k==0)
{
if(led[k]==0xc4)
k++;
}
else if(k==1)
{
if(led[k]==0xd7)
k++;
}
else if(k==2)
{
if(led[k]==0x02)
k++;
}
else if(k==3)
{
if(led[k]==0x29)
k++;
}
else if(k==4)
{
if(led[k]==0x76)
k++;
}
else
{
if(k==5)
{if(led[k]==0x0d)
{
k=0;
outp(led[3],PORTB);
} /* output received byte to PortB (LEDs) */
}
}
}
void USART_Init(u16 baud)
{
UBRR1H=(unsigned char)(baud>>8);
UBRR1L=(unsigned char)baud;
//outp((1<<RXEN)|(1<<RXCIE)|(1<<TXEN)|(1<<TXCIE),UCSR1B);
UCSR1B=(1<<RXEN)|(1<<RXCIE)|(1<<TXEN)|(1<<TXCIE); //
//outp(0x86,UCSR1C);
//UCSR1C=(1<<URSEL)|(3<<UCSZ0); //当写UCSRC寄存器时,URSEL必须写入1;
}
int main(void)
{
k=0;
u08 tt[6]={0xc4,0xd7,0x02,0xe7,0x76,0x0d};
outp(0xff,DDRB);
u16 rate=UART_BAUD_SELECT;
USART_Init(rate);
sei();
for(;;)
{
USART_Transmit(tt,6);
for(i=0;i<=255;i++)
{
for(j=0;j<=255;j++)
;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -