?? uart.c
字號:
#include <mega128.h>
#include "define.h"
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
//timer1=============================================================
bool rx_time_overflow; //溢處標志,由TIMER1定時得到。
//定時器定時設置
#define TH 0x00
#define TL 0x00
interrupt [TIM1_OVF] void timer1_ovf_isr(void){
rx_time_overflow=1;
}
//uart0==================================================================
// USART0 Receiver buffer
#define RX_BUFFER_SIZE0 32
char rx_buffer0[RX_BUFFER_SIZE0];
unsigned char rx_wr_index0,rx_rd_index0,rx_counter0;
bool rx_buffer_overflow0;
//==========================================
void uart_on(void);
void uart_off(void);
//==========================================
void uart_on(void){
rx_time_overflow=0;
rx_buffer_overflow0=0;
rx_wr_index0=rx_rd_index0=rx_counter0=0;
TCNT1H=TH; //溢出計數器清0
TCNT1L=TL;
UCSR0B|=0x80;
TCCR1B=0x04;
}
void uart_off(void){
UCSR0B&=0x7F;
TCCR1B=0x00;
}
//====================================
// USART0 Receiver interrupt service routine
interrupt [USART0_RXC] void usart0_rx_isr(void)
{
char status,data;
status=UCSR0A;
data=UDR0;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer0[rx_wr_index0]=data;
if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
if (++rx_counter0 == RX_BUFFER_SIZE0)
{
rx_counter0=0;
rx_buffer_overflow0=1;
};
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART0 Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter0==0)
if (rx_time_overflow) return 0;
data=rx_buffer0[rx_rd_index0];
if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
cli();
--rx_counter0;
sei();
return data;
}
#pragma used-
#endif
unsigned char gets_OK(char* dst,int max_num){
unsigned char i;
uart_on();
for (i=0;i<(max_num-1);i++)
{
TCNT1H=TH; //溢出計數器清0
TCNT1L=TL;
*(dst++)=getchar();
if (rx_time_overflow)
{
i=0;
break;
}
else if ((i>2)&&(*(dst-4)=='O')&&(*(dst-3)=='K')&&(*(dst-2)=='\r')&&(*(dst-1)=='\n'))
{
*dst=0;
break;
}
}
uart_off();
*(dst+max_num-1)=0;
if (rx_buffer_overflow0) i=0;
return i;
}
char gets_dayu(void){
bool flag=0;
uart_on();
while (!rx_time_overflow)
{
TCNT1H=TH; //溢出計數器清0
TCNT1L=TL;
if (getchar()=='>')
{
flag=1;
break;
}
}
uart_off();
return flag;
}
//uart1=================================================================
// USART1 Receiver buffer
#define RX_BUFFER_SIZE1 8
char rx_buffer1[RX_BUFFER_SIZE1];
unsigned char rx_wr_index1,rx_counter1;
//unsigned char rx_rd_index1;
bool rx_buffer_overflow1;
//字幕機損壞,下面兩個函數暫時不用
/*/===============================
void uart1_on(void);
void uart1_off(void);
//==========================
void uart1_on(void){
rx_time_overflow=0;
rx_buffer_overflow1=0;
rx_wr_index1=rx_rd_index1=rx_counter1=0;
TCNT1H=TH; //溢出計數器清0
TCNT1L=TL;
UCSR1B|=0x80;
TCCR1B=0x04;
}
void uart1_off(void){
UCSR1B&=0x7F;
TCCR1B=0x00;
}
*/
//========================
// USART1 Receiver interrupt service routine
interrupt [USART1_RXC] void usart1_rx_isr(void)
{
char status,data;
status=UCSR1A;
data=UDR1;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer1[rx_wr_index1]=data;
if (++rx_wr_index1 == RX_BUFFER_SIZE1) rx_wr_index1=0;
if (++rx_counter1 == RX_BUFFER_SIZE1)
{
rx_counter1=0;
rx_buffer_overflow1=1;
};
};
}
//字幕機損壞,此函數暫時不用。。。
/*/ Get a character from the USART1 Receiver buffer
#pragma used+
char getchar1(void){
char data;
uart1_on();
while (rx_counter1==0)
if (rx_time_overflow) return 0;
data=rx_buffer1[rx_rd_index1];
if (++rx_rd_index1 == RX_BUFFER_SIZE1) rx_rd_index1=0;
#asm("cli")
--rx_counter1;
#asm("sei")
uart1_off();
return data;
}
#pragma used-
*/
// Write a character to the USART1 Transmitter
#pragma used+
void putchar1(char c)
{
while ((UCSR1A & DATA_REGISTER_EMPTY)==0);
UDR1=c;
}
#pragma used-
void put1_tg(void){
unsigned int i;
unsigned char temp=4;
putchar1(0x9A);
putchar1(0x01); //ID_LENGTH
putchar1(0x00); //0號字幕機
if (temp>array) temp=array;
for (i=0;i<temp;i++)
{
putchar1(tg[i]); //長度統計中出現0x9A發送兩遍
if (tg[i]==0x9A)
{
putchar1(tg[i]);
tg[array-1]+=0x9A; //校驗位校正
}
}
for (i=4;i<array;i++)
{
putchar1(tg[i]);
}
if ( tg[array-1]==0x9A ) //校驗位為0x9A則發送兩遍
{
putchar1(0x9A);
}
}
/*
void put1(unsigned char *p, unsigned char num)
{
unsigned char i;
for (i = num; i; i--)
{
putchar1(*p++);
}
}
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -