1. 程式人生 > >Pic16f1828 1829串列埠收發

Pic16f1828 1829串列埠收發

#include<PIC.h> 

// PIC16f1828 / PIC16f1828      8M

 

unsigned char error=0x00; 

bit Q=0; 

unsigned data;

void interrupt isr(void) // 中斷函式

{

    unsigned char Temp;

    if(RCIF&&RCIE)

    {

        Q = 1;

        while(FERR)      {error=RCREG; Q=0;};   

        while(OERR)      { CREN=0 ;  CREN=1 ; error=RCREG; Q=0;}

        

        TXREG = RCREG;  //收到的資料立馬進行回顯

    }

}

void Uart_init() //UART初始

{

   // SCS FOSC; SPLLEN disabled; IRCF 8MHz_HF; 

    OSCCON = 0x70;

    // LFIOFR disabled; HFIOFL not2percent_acc; OSTS intosc; PLLR disabled; HFIOFS not0.5percent_acc; HFIOFR disabled; MFIOFR disabled; T1OSCR disabled; 

    OSCSTAT = 0x00;

    // TUN 0x0; 

    OSCTUNE = 0x00;

    // Set the secondary oscillator

    

#ifndef USE_DEAFULT_TX

    APFCON0bits.TXCKSEL = 1; //TX引腳使用1 = RC4  ------- 第二功能管腳

    TRISCbits .TRISC4 =  0;

#else

    APFCON0bits.TXCKSEL = 0; //TX引腳使用1 = RB7  --------原來的LED-FULL

    TRISBbits .TRISB7 =  0;    

#endif

    

#ifdef USE_DEAFULT_RX    

    APFCON0bits.RXDTSEL = 0; //RX引腳使用0 = RB5     

    TRISBbits .TRISB5 =  1;

    ANSELBbits.ANSB5 = 0;  ;  //關閉RB5的模擬輸入功能

#else

    APFCON0bits.RXDTSEL = 1;   //RX引腳使用0 = RC5       第二功能管腳

    TRISCbits .TRISC5 =  1;

    //ANSELCbits.ANSC5 = 0;  ;  //關閉RB5的模擬輸入功能

#endif      

    

    

    //8mhz晶體  波特率設定, datasheet裡面有執行緒的引數表格

    SPBRG=51;//?9600,8M??

    BRGH=1; //

    

    SYNC=0;

    SPEN=1; //串列埠使能

    TXEN=1; //USART 傳送使能

    TXIE=0; //關傳送中斷

    RCIE=1; //開接收中斷

    CREN=1; //接收允許

    PEIE = 1; //開外圍裝置中斷

    GIE = 1;

}

 

void main() 

{

Uart_init();

    while(1){}

}