PIC Microcontroller

PIC16F877A[기본프로그램] + 시리얼통신(12Byt 통신)

EP 기술연구소 2010. 4. 16. 11:29

/*****************************************************************
 Project : PIC16F877A TestBoard controller
 Divice : PIC16F877A(40pin-DIP)
 Version :
 Date    : 2007-10-17 10:59오후
 Author  : kornan Park(kornanp@empal.com)
 Company : EU-Technology
 Comments:
                                                                     
 
*****************************************************************/
#include "C:\Demo\PIC16F877_Board\F877A_Ctl.h"
#include <stdio.h>
#ZERO_RAM

#include "F877A_Ctl_sub.c" // 16F877A Test Board Sub-control
#include "F877_KeyCheck.c" // Keychek Routine
#include "F877_display.c" // 7-Segment display routine
#include "SerialCtl_F877.c"

//==============================================================================
#int_RTCC
void  RTCC_isr(void)
{
 // Fosc/4/32
 TMR0 = 237;  //Fosc(20MHz)/4/256 1mSec Timer interrupt
 mSec1Flag = 1;
 
}

#int_AD
void  AD_isr(void)
{
 TestPin = ~TestPin;
}

//==============================================================================
#int_TBE
void  TBE_isr(void)
{
 if(++Tx_Counter <= TX_BUFFER_SIZE){
  TXREG = TX_Buffer[Tx_Counter];
  TXSTA |= TX_ENABLE;   // Tx Interrupt Enable
 }
 else{
  TX_buffer_overflow = 1;
  TXSTA &= ~TX_ENABLE;  // Tx Interrupt Disable
 }
 
}

//==============================================================================
#int_RDA
void  RDA_isr(void)
{
 unsigned char status, data;
 
 status = RCSTA;
 data = RCREG;
 if ((status & (FRAMING_ERROR | OVERRUN_ERROR))==0){
  if((RX_counter >= RX_BUFFER_SIZE) & (data == 0x2A)) RX_counter = 0;
  RX_Buffer[RX_counter] = data;
  if(++RX_counter == RX_BUFFER_SIZE) RX_buffer_overflow = 1;
 };

}

//==============================================================================
#int_TIMER1
void  TIMER1_isr(void)
{
 //TMR1 = (0xFFFF-625); // 20MHz(Fosc)/4 / 8 / 625 = 1mSec
 TMR1 = (0xFFFF-54); // 20MHz(Fosc)/4 / 8 / 625 = 100uSec
 
 //if(BuzOnFlag) BuzOut =1;
 //else BuzOut = 0;
 
}
//==============================================================================

#int_TIMER2
void  TIMER2_isr(void)
{

}


//==============================================================================
void main()
{
 PORTA = 0xFF;
 set_tris_a(0x1F);
 
 set_tris_b(0xFF);
 
 set_tris_c(0x80); // PORTC.7(Rx) = input, Other = All Output
 
 PORTD = 0xFF;  // segment all off
 set_tris_d(0x00); // PORTD = All Output
 
 PORTE = 0;
 set_tris_e(0);  // PORTE = all output

   setup_adc_ports(AN0_AN1_AN3);
   setup_adc(ADC_OFF);
  
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
  
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   setup_timer_2(T2_DIV_BY_16,0,1);
  
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
  
   TXSTA &= ~TX_ENABLE;  // Tx Interrupt Disable
  
   BuzOn(2);
  
 enable_interrupts(INT_RTCC);  // RCC Timer overflow Interrupt Enable
 enable_interrupts(INT_AD);
 enable_interrupts(INT_TBE);   // Serial Tx Interrupt Enable
 enable_interrupts(INT_RDA);   // Serial Rx Interrupt Enable
 enable_interrupts(INT_TIMER1);
 //enable_interrupts(INT_TIMER2);
  
 enable_interrupts(GLOBAL);

 while(1){
  if(mSec1Flag){
   mSec1Flag = 0;  // 1 mSec Interrupt operating routine
   
   if(BuzFlag) BuzTimeCtl();
   if(BuzOnFlag) BuzOut =1;
   else BuzOut = 0;
   
   Segment_disp(); 
   KeyScan();   // Key check
   //ADC_Start();  // ADC Start
  }
  
  //1. Serial Interface control Routine
  if(RX_buffer_overflow) RX_Complete();
  if(USART_SendFlag) TX_Start();

 }

}

F877A_Ctl.h

 

SerialCtl_F877.c

 

SerialCtl_F877.c
0.0MB
F877A_Ctl.h
0.0MB

'PIC Microcontroller' 카테고리의 다른 글

PIC18F4680 기본 프로그램   (0) 2010.05.04
PIC USB STK Schemetic  (0) 2010.05.01
PIC 18F6722 기본프로그램  (0) 2010.04.05
16F877A_ demo board 회로도  (0) 2009.03.30
PIC16F877A 기본 프로그램  (0) 2007.11.04