//****************************************************************************************** // PIC16F88 Sample Program // Project : // Program Name : // Programer : // Create date : Version 1.0 H24.06.05 // Replace date : // History : // Laungage : HI_TECH PICC C Laungage Version 9.83 //****************************************************************************************** // Description // OSC : Internal OSC 8MHz //****************************************************************************************** #include #include #include //__CONFIG( FOSC_HS & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & BOREN_OFF & LVP_OFF & CPD_OFF & WRT_OFF & // DEBUG_OFF & CCPMX_RB0 & CP_OFF ); __CONFIG( FOSC_INTOSCIO & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & BOREN_OFF & LVP_OFF & CPD_OFF & WRT_OFF & DEBUG_OFF & CCPMX_RB0 & CP_OFF ); __CONFIG( FCMEN_OFF & IESO_OFF ); // #define PI_DOT_LEN 1000 #define PI_MAX_DATA_AREA 20 #define PI_MAX_INT 32768 #define PI_CHT_COUNT 300 // void Init_USART(void); void Trans_USART(char *); void Rec_USART(char *); void Trans_USART_s(char *); void timer(unsigned int); void M_cnv(char *,char *); void Sw_on(unsigned int *); void Sw_off(unsigned int *); void Sw_check(char *); void Strcpy(char *,char *); int Strcmp(char *,char *); int main(void) { char tmp_char[2]; char M_dot_data[PI_MAX_DATA_AREA]; char Dat_char; unsigned int lp1; // ************************* // 1.Initialized Segment // ************************* TRISA=0xff; TRISB=0xdf; //0b1101,1111 PORTA=0x00; PORTB=0x00; OSCCON=0x7E; //OSC 8MHz ANSEL=0x00; //ALL Degital PORT Init_USART( ); //Init USART Trans_USART_s(" Connect PIC16F88 OK > "); // ************************* // 2.Program Main // ************************* while(1){ Sw_check(M_dot_data); M_cnv(&Dat_char,M_dot_data ); for(lp1=0;lp1<1000;lp1++); Trans_USART(&Dat_char); for(lp1=0;lp1<1000;lp1++); Trans_USART_s("["); Trans_USART_s(M_dot_data); Trans_USART_s("]"); Trans_USART_s(" "); } } //**************************************************************************** // Function Name : Sw_check // Title : // Input : // Output : // Description : //**************************************************************************** void Sw_check(char M_dot_data[]) { unsigned int Index=0; unsigned int counter; // // 1.Intialize // M_dot_data[0]=0x00; // // 2.Program-Main // while(1){ // (1)SW-OFF Sw_off(&counter); if(counter > ( PI_DOT_LEN * 2)){ M_dot_data[Index]=0x00; if(Index>0){ return; } } // (2)SW-ON Sw_on(&counter); if(counter >( PI_DOT_LEN *2) ){ //M_hyp((unsigned int)40); M_dot_data[Index]='-'; Index++; }else{ //M_dot((unsigned int)40); M_dot_data[Index]='0'; Index++; } // (3)Over-Data-Buffer if(Index >=( PI_MAX_DATA_AREA-1)){ M_dot_data[Index]=0x00; return; } } } //**************************************************************************** // Function Name : Sw_on // Title : // Input : // Output : // Description : //**************************************************************************** void Sw_on(unsigned int *counter) { unsigned int tmp_i; unsigned int lp; unsigned int tmp_counter=0; *counter =0; // // 0.Function start (ON) // while(1){ tmp_i = PORTB & 0x80; //1000,0000 if(tmp_i != 0)break; } // // 1.Wait(SW-OFF) // while(1){ tmp_i = PORTB & 0x80; //1000,0000 if(tmp_i == 0){ if(tmp_counter < PI_CHT_COUNT){ tmp_counter=0; }else{ break; } } *counter = *counter + 1; if(*counter > (PI_MAX_INT - 5)) *counter=PI_MAX_INT - 5; tmp_counter++; if(tmp_counter > (PI_MAX_INT - 5)) tmp_counter=PI_MAX_INT - 5; for(lp=0;lp<20;lp++); } // // 2.Wait // // for(lp=0;lp<1000;lp++); } //**************************************************************************** // Function Name : Sw_off // Title : // Input : // Output : // Description : //**************************************************************************** void Sw_off(unsigned int *counter) { unsigned int tmp_i; unsigned int tmp_counter=0; unsigned int lp; *counter =0; // // 1.Wait(SW-OFF) // while(1){ tmp_i = PORTB & 0x80; //1000,0000 if(tmp_i != 0){ if(tmp_counter < PI_CHT_COUNT){ tmp_counter=0; }else{ break; } } if(*counter > ( PI_DOT_LEN * 4)){ *counter=PI_MAX_INT - 5; return; } *counter = *counter + 1; if(*counter >(PI_MAX_INT - 5)) *counter=PI_MAX_INT - 5; tmp_counter++; if(tmp_counter > (PI_MAX_INT - 5)) tmp_counter=PI_MAX_INT - 5; for(lp=0;lp<20;lp++); } } //**************************************************************************** // Function Name : Trans_USART_s // Title : // Input : // Output : // Description : //**************************************************************************** void Trans_USART_s(char in_str[] ) { unsigned int lp=0; unsigned int lp1; while(in_str[lp]!=0x00){ Trans_USART(&in_str[lp]); for(lp1=0;lp1<1000;lp1++); lp++; } } //**************************************************************************** // Function Name : Init_USART // Title : // Input : // Output : // Description : //**************************************************************************** void Init_USART( ) { // // TXSTA;TRANSMIT STATUS AND CONTROL REGISTER // Bit7:Async ==> Don't care // BIT6:Selects 8-bit ==> 0 // BIT5:Transmit Enable Bit ==> 1:Enable 0:Disable // BIT4:AUSART Select mode ==> 1:Synce 0:Async // BIT3:Read As '0' // BIT2:High BAUD Rate Select ==> 1:High Speed 0:Low Speed // BIT1:TSR Status bit ==> 1:TSR Empty 0:TSR Full // BIT0:9Th Bit of Transmit data , can be parity bit // TXSTA=0x20; //0b0010,0000 // // RCSTA;RECIVE STATUS AND CONTROL REGISTER // Bit7:Serial Port Enable bit==> 1:Serial Port Enable 0:Serial Port Disable // BIT6:Selects 8-bit ==> 0 // BIT5:Single Recive Enable ==> Asyn:Don't Care // BIT4:AUSART Select mode ==> 1:Enable 0:Disable // BIT3:When Bit6=1 // BIT2: 1:Framing error 0:No Framing error // BIT1: 1:Overrun error 0:Overrun error // BIT0:9Th bit Recived data // RCSTA=0x90; //0b1001,0000 // // SPBRG;Baund Rate Genarator REGISTER // 9600BPS, OSC:8MHz(Inside) ==> SPREG=12 SPBRG=0x0C; } //**************************************************************************** // Function Name : Trans_USART // Title : // Input : // Output : // Description : //**************************************************************************** void Trans_USART(char *IO_data ) { char chk_flg; // // 1.Check Send Flag // while(1){ chk_flg = TXSTA & 0x02; //0000,0010 TXSTA(TRMT) if(chk_flg != 0x00)break; } // // 2.Set data // TXREG = *IO_data; } //**************************************************************************** // Function Name : Rec_USART // Title : // Input : // Output : // Description : //**************************************************************************** void Rec_USART(char *IO_data ) { char chk_flg; // // 1.Check Recvive Flag // while(1){ chk_flg = PIR1 & 0x20; //0010,0000 PIR1(RCIF) if(chk_flg != 0x00)break; } // // 2.Check error // chk_flg = RCSTA & 0x06; //0000,0110 RCSTA(FERR,OERR) See PIC16F88 Manual P.98 if(chk_flg != 0x00){ *IO_data = 0x00; return; } // // 3.Set Recive Data // *IO_data = RCREG; } //**************************************************************************** // Function Name : M_cnv // Title : // Input : // Output : // Description : //**************************************************************************** void M_cnv(char *out_char,char in_str[] ) { // ******************** // 1.Set data // ******************** *out_char ='?'; if(Strcmp(in_str,"0-") ==0) *out_char='A'; if(Strcmp(in_str,"-000") ==0) *out_char='B'; if(Strcmp(in_str,"-0-0") ==0) *out_char='C'; if(Strcmp(in_str,"-00") ==0) *out_char='D'; if(Strcmp(in_str,"0") ==0) *out_char='E'; if(Strcmp(in_str,"00-0") ==0) *out_char='F'; if(Strcmp(in_str,"--0") ==0) *out_char='G'; if(Strcmp(in_str,"0000") ==0) *out_char='H'; if(Strcmp(in_str,"00") ==0) *out_char='I'; if(Strcmp(in_str,"0---") ==0) *out_char='J'; if(Strcmp(in_str,"-0-") ==0) *out_char='K'; if(Strcmp(in_str,"0-00") ==0) *out_char='L'; if(Strcmp(in_str,"--") ==0) *out_char='M'; if(Strcmp(in_str,"-0") ==0) *out_char='N'; if(Strcmp(in_str,"---") ==0) *out_char='O'; if(Strcmp(in_str,"0--0") ==0) *out_char='P'; if(Strcmp(in_str,"--0-") ==0) *out_char='Q'; if(Strcmp(in_str,"0-0") ==0) *out_char='R'; if(Strcmp(in_str,"000") ==0) *out_char='S'; if(Strcmp(in_str,"-") ==0) *out_char='T'; if(Strcmp(in_str,"00-") ==0) *out_char='U'; if(Strcmp(in_str,"000-") ==0) *out_char='V'; if(Strcmp(in_str,"0--") ==0) *out_char='W'; if(Strcmp(in_str,"-00-") ==0) *out_char='X'; if(Strcmp(in_str,"-0--") ==0) *out_char='Y'; if(Strcmp(in_str,"--00") ==0) *out_char='Z'; // // if(Strcmp(in_str,"-----")==0) *out_char='0'; if(Strcmp(in_str,"0----")==0) *out_char='1'; if(Strcmp(in_str,"00---")==0) *out_char='2'; if(Strcmp(in_str,"000--")==0) *out_char='3'; if(Strcmp(in_str,"0000-")==0) *out_char='4'; if(Strcmp(in_str,"00000")==0) *out_char='5'; if(Strcmp(in_str,"-0000")==0) *out_char='6'; if(Strcmp(in_str,"--000")==0) *out_char='7'; if(Strcmp(in_str,"---00")==0) *out_char='8'; if(Strcmp(in_str,"----0")==0) *out_char='9'; return; } //**************************************************************************** // Function Name : Strcmp // Title : // Input : // Output : // Description : //**************************************************************************** int Strcmp(char in1[],char in2[]) { unsigned int lp=0; while(in1[lp]!=0x00){ if(in1[lp]!=in2[lp]){ return(2); } lp++; } // lp=0; while(in2[lp]!=0x00){ if(in1[lp]!=in2[lp]){ return(2); } lp++; } return(0); }