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

📄 ana_uart.c

📁 NEC527多功能电表完整源代码,包括LCD驱动,显示,计量,存储,整个527驱动程序!
💻 C
字号:
#pragma interrupt INTP4         MD_INTP4
#pragma interrupt INTTM001     MD_INTTM001
#include "includes.h"

unsigned char AnaUartBitCount = 0;
unsigned char AnaUartRxByte = 0;
unsigned char AnaCommParity = 0;

void AnaUartRxReady(void)
{
    AnaUartBitCount = 10;
    AnaUartRxByte = 0;
    AnaCommParity = UART_BIT_9_L;    
    TMIF001 = 0;
    TMMK001 = 1;
    PMK4 = 0;
    PIF4 = 0;
}

void INTP4Init(void)
{
    ANA_UART_RX_DIR = 1;
    AnaUartBitCount = 10;
    AnaUartRxByte = 0;
    AnaCommParity = UART_BIT_9_L;        
    PMK4 = 1;   
    PIF4 = 0;
    PPR1 = 0;
    EGP = 0x00;
    EGN.4 = 0x01;
    PMK4 = 0;
}

__interrupt void MD_INTP4( void )
{
    CommPortChose |= ANA_UART_PORT;
    PMK4 = 1;
    TMMK001 = 1;
    TMC01 = 0x00;
    CRC01 = 0x00;
    PRM01 = 0x01;
    CR001 = ANA_UART_START_BIT_WAIT;
    PR1H.2 = 0;
    TMIF001 = 0;	
    TMMK001 = 0;
    TMC01 = 0x0C;        
}

__interrupt void MD_INTTM001( void )
{
    unsigned char temp;
        
    TMIF001 = 0;
    if( AnaUartBitCount == 10 )
    {
        TMC01 = 0x00; 
        CR001 = ANA_UART_BAUD_RATE_5000;
        TMC01 = 0x0C; 
    }

    temp = ANA_UART_RX;
    if ( AnaUartBitCount > 2 )
    {
        AnaUartRxByte >>= 1;
        if ( temp )
        {
            AnaUartRxByte |= 0x80;
            AnaCommParity =  ~ AnaCommParity;
        }        
        AnaUartBitCount--;
    }
    else if( AnaUartBitCount == 2 )
    {
        if ( temp )
        {
            if( ( UART_BIT_9_H == AnaCommParity ) == 0 )
            {
                FrameBuffer[0] = 0;
            }
        }
        else
        {
            if( ( UART_BIT_9_L == AnaCommParity ) == 0 )
            {
                FrameBuffer[0] = 0;
            }
        }
        AnaUartBitCount--;
        UartRxByte = AnaUartRxByte;
        RxFrameDispose();        
    }
    else
    {
        if( temp == 0 )
        {
            AnaUartBitCount = 0;
        }
        TMC01 = 0x00;
        TMMK001 = 1;
        AnaUartRxReady();
    }   
}

void AnaUartSend0(void)
{
    ANA_UART_TX = 0;
}

void AnaUartSend1(void)
{
    ANA_UART_TX = 1;
    AnaCommParity =~ AnaCommParity;
}

/*Send one byte(11bits)*/
void AnaUartSendByte(unsigned short sData)
{
    unsigned char sBitCount = 11;

    TMC01 = 0x00; 
    CR001 = ANA_UART_BAUD_RATE_5000; 
    TMC01 = 0x0C; 
    TMMK001 = 1;
    TMIF001 = 0;
    AnaCommParity = UART_BIT_9_L;
    sData<<=1;
    sData|=0x0400;
        do{
        if(sBitCount!=2)
        {
            if(sData&0x0001)
                AnaUartSend1();
            else
                AnaUartSend0();
        }else{
            if(AnaCommParity==UART_BIT_9_H)
                AnaUartSend1();
            else
                AnaUartSend0();
        }
        sData>>=1;
        while(!TMIF001);//在这里等待
        TMIF001 = 0;
     }while(--sBitCount);
     TMIF001 = 0;
}

void AnaUartStartToTx( void )
{
    unsigned char ii;

    for ( ii = 0; ii < FrameBuffer[ FRM_DATALEN ] + 12; ii++ )
    {
        AnaUartSendByte( FrameBuffer[ii] );
    }
    _sys_evt_add( EVT_INIT_COMM );
}

⌨️ 快捷键说明

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