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

📄 uart.c

📁 STC51系列的源码
💻 C
字号:
/********************************************************************************/
/* filename : UART.c                                                            */
/* created  : xillinx                                                           */
/* descript : 处理与串口相关的事情                                              */
/********************************************************************************/
#include "../CPU/CPU.h"
#include "../CFG/CFG.h"
#include "../UART/UART.h"

unsigned char code ascii_table[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

unsigned char UART_send_buffer[UART_SEND_BUF_MAX];
unsigned int  uart_xmit_wr;
unsigned int  uart_xmit_rd;
unsigned char data uart_xmit_start;

unsigned char UART_recv_buffer[UART_RECV_BUF_MAX];
unsigned char data uart_recv_wr;
unsigned char data uart_recv_rd;
unsigned char data uart_recv_start;

/********************************************************************************/
/* fun_name : UART_buffer_initilize()                                           */
/* version  : v1.00                                                             */
/* created  : xillinx                                                           */
/********************************************************************************/
void UART_buffer_initilize(void)
{   uart_xmit_start = 0x0;
    uart_recv_start = 0x0;
    uart_xmit_wr    = 0x0;
    uart_xmit_rd    = 0x0;
    uart_recv_wr    = 0x0;
    uart_recv_rd    = 0x0;
}

/********************************************************************************/
/* fun_name : UART_printf()                                                     */
/* version  : v1.00                                                             */
/* created  : xillinx                                                           */
/********************************************************************************/
void UART_printf(char * string,...)
{   unsigned int  length;
    unsigned char i;
    char uart_buffer[UART_EACH_MSG_MAX];
    va_list arguments;
    EA=0x0;
    va_start(arguments,string);
    vsprintf(uart_buffer,string,arguments);
    va_end(arguments);
    length=strlen(uart_buffer);
    
    for(i=0x0;i<length;i++)
    {  if(((uart_xmit_wr+0x1)&UART_SEND_BUF_MSK)==uart_xmit_rd) //* 缓冲区已经满了
       {  break;
       }
       UART_send_buffer[uart_xmit_wr]=uart_buffer[i];
       uart_xmit_wr++;
       uart_xmit_wr&=UART_SEND_BUF_MSK;
    }
    
    if(uart_xmit_start==0x0)    //* 如果需要启动发生,就启动
    {  uart_xmit_start=0x1;
       TI=1;
    }
    EA=0x1;
    return;
}

/********************************************************************************/
/* fun_name : UART_print_ascii()                                                */
/* version  : v1.00                                                             */
/* created  : xillinx                                                           */
/********************************************************************************/
void UART_print_ascii(unsigned char * buffer, unsigned char len)
{   unsigned char i;
    ES=0x0;
    for(i=0x0;i<len;i++)
    {   if(((uart_xmit_wr+0x1)&UART_SEND_BUF_MSK)==uart_xmit_rd) //* 缓冲区已经满了
       {  break;
       }
       UART_send_buffer[uart_xmit_wr]=ascii_table[(buffer[i]>>0x4)&0xF];
       uart_xmit_wr++;
       uart_xmit_wr&=UART_SEND_BUF_MSK;
       if(((uart_xmit_wr+0x1)&UART_SEND_BUF_MSK)==uart_xmit_rd) //* 缓冲区已经满了
       {  break;
       }
       UART_send_buffer[uart_xmit_wr]=ascii_table[(buffer[i]>>0x0)&0xF];
       uart_xmit_wr++;
       uart_xmit_wr&=UART_SEND_BUF_MSK;
       if(((uart_xmit_wr+0x1)&UART_SEND_BUF_MSK)==uart_xmit_rd) //* 缓冲区已经满了
       {  break;
       }
       UART_send_buffer[uart_xmit_wr]='|';
       uart_xmit_wr++;
       uart_xmit_wr&=UART_SEND_BUF_MSK;
    }
    if(uart_xmit_start==0x0)    //* 如果需要启动发生,就启动
    {  uart_xmit_start=0x1;
       TI=1;
    }
    ES=0x1;
    return;
}

/********************************************************************************/
/* fun_name : UART_put_double_char()                                            */
/* version  : v1.00                                                             */
/* created  : xillinx                                                           */
/********************************************************************************/
void UART_put_double_char(unsigned char status, unsigned char hi,unsigned char lo)
{   UART_send_buffer[uart_xmit_wr]=status;
    uart_xmit_wr++;
    uart_xmit_wr&=UART_SEND_BUF_MSK;
    UART_send_buffer[uart_xmit_wr]=ascii_table[(hi>>0x4)&0xF];
    uart_xmit_wr++;
    uart_xmit_wr&=UART_SEND_BUF_MSK;
    UART_send_buffer[uart_xmit_wr]=ascii_table[(hi>>0x0)&0xF];
    uart_xmit_wr++;
    uart_xmit_wr&=UART_SEND_BUF_MSK;
    UART_send_buffer[uart_xmit_wr]=ascii_table[(lo>>0x4)&0xF];
    uart_xmit_wr++;
    uart_xmit_wr&=UART_SEND_BUF_MSK;
    UART_send_buffer[uart_xmit_wr]=ascii_table[(lo>>0x0)&0xF];
    uart_xmit_wr++;
    uart_xmit_wr&=UART_SEND_BUF_MSK;
    if(uart_xmit_start==0x0)    //* 如果需要启动发生,就启动
    {  uart_xmit_start=0x1;
       TI=1;
    }
}

/********************************************************************************/
/* fun_name : UART_putchar()                                                    */
/* version  : v1.00                                                             */
/* created  : xillinx                                                           */
/********************************************************************************/
void UART_putchar(char ch)
{   if(((uart_xmit_wr+0x1)&UART_SEND_BUF_MSK)==uart_xmit_rd) //* 缓冲区已经满了
    {  return;
    }
    EA=0x0;
    UART_send_buffer[uart_xmit_wr]=ch;
    uart_xmit_wr++;
    uart_xmit_wr&=UART_SEND_BUF_MSK;
    if(uart_xmit_start==0x00)
    {  uart_xmit_start=0x1;
       TI=0x1;
    }
    EA=0x1;
    return;
}

/********************************************************************************/
/* fun_name : UART_xmit_isr_process()                                           */
/* version  : v1.00                                                             */
/* created  : xillinx                                                           */
/********************************************************************************/
void UART_xmit_isr_process(void)
{   if(uart_xmit_wr!=uart_xmit_rd)
    {  SBUF=UART_send_buffer[uart_xmit_rd];
       uart_xmit_rd++;
       uart_xmit_rd&=UART_SEND_BUF_MSK;
       uart_xmit_start=0x1;
    }
    else
    {  uart_xmit_start=0x0;
    }
    return;
}

/********************************************************************************/
/* fun_name : UART_recv_isr_process()                                           */
/* version  : v1.00                                                             */
/* created  : xillinx                                                           */
/********************************************************************************/
void UART_recv_isr_process(void)
{   unsigned char mdata;
    mdata=SBUF;
    if(((uart_recv_wr+0x1)&UART_RECV_BUF_MSK)==uart_recv_rd) //* 缓冲区已经满了
    {  uart_recv_rd=uart_recv_wr;
       return;
    }
    UART_recv_buffer[uart_recv_wr]=mdata;
    uart_recv_wr++;
    uart_recv_wr&=UART_RECV_BUF_MSK;
    if(mdata==0xFF)
    {  uart_recv_start=0x1;
    }
    return;
}

⌨️ 快捷键说明

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