⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 Atmel AVR Mega324 的Uart驱动
💻 C
字号:
#ifndef __UART_C__
#define __UART_C__

#include "NGVDP_VDP.h"
/*
uint8 Add_byte_to_receive_buf(uint8 Uart_num, uint8 * receive_buf, uint8 data)
{
    switch (Uart_num)
    {
    case Uart0:
    {
        if (Uart0_receive_pointer < MAX_UART0_RECEIVE_BUF)
        {
            receive_buf[Uart0_receive_pointer] = data;
            Uart0_receive_pointer ++;
        }
    }
    break;
    case Uart1:
    {
        if (Uart1_receive_pointer < MAX_UART1_RECEIVE_BUF)
        {
            receive_buf[Uart1_receive_pointer] = data;
            Uart1_receive_pointer ++;
        }
    }
    break;
    }
    return 0;
}
*/
uint8 Uart_enable_send(uint8 Uart_num)
{
    switch (Uart_num)
    {
    case Uart0:
    {
        UartTxCtrl (Uart0, ON);
        Uart0_send_pointer = 0;
        UDR0 = Uart0_send_buf[Uart0_send_pointer];
        Uart0_state = Uart_State_sending;
    }
    break;
    case Uart1:
    {
        UartTxCtrl (Uart1, ON);
        Uart1_send_pointer = 0;
        UDR1 = Uart1_send_buf[Uart1_send_pointer];
        Uart1_state = Uart_State_sending;
        //UDR0 = 0xff;
    }
    }
    return 0;
}



void UartTxCtrl(uint8 port, uint8 opt)
{
    switch (port)
    {
    case Uart0:
        (opt) ? (PORTD = PIND | (1 << PORT_485EN0)) : (PORTD = PIND & (~(1 << PORT_485EN0)));
        break;
    case Uart1:
        (opt) ? (PORTD = PIND | (1 << PORT_485EN1)) : (PORTD = PIND & (~(1 << PORT_485EN1)));
        break;
    default:
        break;
    }
}
/*
void UartPutChar (uint8 port, uint8 ch)
{
    switch (port)
    {
    case Uart0:
        UartTxCtrl (port, ON);
        while (!(UCSR0A& 0x20));
        UDR0 = ch;
        break;
    case Uart1:
        UartTxCtrl (port, ON);
        while (!(UCSR1A& 0x20));
        UDR1 = ch;
        break;
    default:
        break;
    }
}
*/
void UartPuts (uint8 port, uint8 *buffer, uint8 len)
{
    unsigned char i;

// for (i=0;i<len;i++)
    switch (port)
    {
    case Uart0:
        UartTxCtrl (port, ON);
        for (i = 0;i < len;i++)
        {
            while (!(UCSR0A& 0x20));
            UDR0 = *(buffer + i);
        }
        break;
    case Uart1:
        UartTxCtrl (port, ON);
        for (i = 0;i < len;i++)
        {
            while (!(UCSR1A& 0x20));
            UDR1 = *(buffer + i);
        }
        break;
    default:
        break;
    }
}


void UartInit (uint8 port)
{
    switch (port)
    {
    case Uart0:
        //  QClear (QUEUE_UART0);
        UartTxCtrl (port, OFF);
        UCSR0B = 0x00;
        UCSR0A = 0x00;
        /*
        baud = ((OSC/16)/BAUD)-1;
        UBRR0H =(baud / 0x100) & 0x0f;
        UBRR0L = baud & 0xff;
        */
        //	UCSR0A = (1<<U2X0);
        UBRR0H = 0x00;
        UBRR0L = 0xcf;
        //    UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(0<<TXCIE0)|(1<<TXEN0);
        UCSR0B = (1 << RXCIE0) | (1 << RXEN0) | (1 << TXEN0) | (0 << TXCIE0);
        //  UCSR0C = (3<<UCSZ00) |(1 << UPM01) |(1 << UPM00);
        UCSR0C = (3 << UCSZ00);
        break;
    case Uart1:
        //   QClear (QUEUE_UART0);
        UartTxCtrl (port, OFF);
        UCSR1B = 0x00;
        UCSR1A = 0x00;
        /*  baud = ((OSC/16)/BAUD)-1;
          UBRR1H =(baud / 0x100) & 0x0f;
          UBRR1L = baud & 0xff;*/
        UBRR1H = 0;
        UBRR1L = 0xcf;
        UCSR1B = (1 << RXCIE1) | (1 << RXEN1) | (0 << TXCIE1) | (1 << TXEN1);
        UCSR1C = (3 << UCSZ10) ;//|(1 << UPM11) |(1 << UPM10);
        break;
    default:
        break;
    }
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -