Rev 876 | Blame | Compare with Previous | Last modification | View Log | Download
#include <16F887.h>#device *=16#device adc=8#device PASS_STRINGS=IN_RAM#zero_ram#FUSES NOWDT //No Watch Dog Timer#FUSES INTRC_IO //Internal RC Osc, no CLKOUT#FUSES PUT //Power Up Timer#FUSES MCLR //Master Clear pin enabled#FUSES NOPROTECT //Code protected from reads#FUSES NOCPD //No EE protection#FUSES BROWNOUT //Reset when brownout detected#FUSES NOIESO //Internal External Switch Over mode disabled#FUSES NOFCMEN //Fail-safe clock monitor disabled#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O#FUSES NODEBUG //No Debug mode for ICD#FUSES NOWRT //Program memory not write protected#FUSES BORV21 //Brownout reset at 2.1V#use delay(clock=8000000,RESTART_WDT)//#use rs232(baud=9600,parity=N,xmit=TXD,rcv=RXD,bits=8,errors)#use rs232(baud=9600,parity=N,xmit=PIN_B7,rcv=PIN_B6,bits=8)/*$F*************************************************************************** Copyright (C)pa 2004 Mark Norton** Permission is hereby granted, free of charge, to any person obtaining* a copy of this software and associated documentation files (the* "Software"), to deal in the Software without restriction, including* without limitation the rights to use, copy, modify, merge, publish,* distribute, sublicense, and/or sell copies of the Software, and to* permit persons to whom the Software is furnished to do so, subject to* the following conditions:** The above copyright notice and this permission notice shall be included* in all copies or substantial portions of the Software.** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.** Functional* Description: Implementation of sscanf() function for the CCS compiler******************************************************************************/#include <string.h>#include <stdlib.h>/* Uncomment any of these to reduce the code sizeNote that the HEX is a big hog*/#define NO_FLOAT// #define NO_INT// #define NO_SIGNED_INT// #define NO_STRING// #define NO_HEX/* *************************************************************************DESCRIPTION: Converts string pointed to by s to an unsigned long (16 bit)RETURN: result of the conversionALGORITHM: noneNOTES: the next position in the string is returned in endptr*************************************************************************** */long my_atoul(char *s, char *endptr, int base){signed long result;int index;char c;index = 0;result = 0;*endptr = s;if (( !s ) || ( !*s ))return ( 0 );c = *s;// increase index if positive sign is detectedif (c == '+'){c = *(++s);}// The number is a decimal numberif (base == 10){while (c >= '0' && c <= '9'){result = 10*result + (c - '0');c = *(++s);}}else if (base == 16) // The number is a hexa number{if (c == '0' && (*(s+1) == 'x' || *(s+1) == 'X')){s += 2;c = *s;}c = toupper(c);while (true){if (c >= '0' && c <= '9')result = (result << 4) + (c - '0');else if (c >= 'A' && c <='F')result = (result << 4) + (c - 'A' + 10);elsebreak;c = toupper(*(++s));}}*endptr = s;return(result);}/* *************************************************************************DESCRIPTION: Converts string pointed to by s to a floatRETURN: result of the conversionALGORITHM: noneNOTES: the next position in the string is returned in endptr*************************************************************************** */float my_atof(char * s, char *endptr){float pow10 = 1.0;float result = 0.0;int sign = 0;char c;c = *s;if(c == '-'){sign = 1;c = *(++s);}else if(c == '+')c = *(++s);while((c >= '0' && c <= '9')){result = 10*result + c - '0';c = *(++s);}if (c == '.'){c = *(++s);while((c >= '0' && c <= '9')){pow10 = pow10*10;result += (c - '0')/pow10;c = *(++s);}}if (sign == 1)result = -1*result;*endptr = s;return(result);}/* *************************************************************************DESCRIPTION: Implementation of scanf() using CCS C compilerRETURN: total number of arguments readALGORITHM: noneNOTES: none*************************************************************************** */int8 sscanf(char *buf, /* pointer to the buffer that we are scanning */char *fmt, /* pointer to the format string */char *pArgs) /* pointer to array of arguments */{int8 count = 0;char *p;int1 size_long;int1 sign;char *endptr;while (true){/* Look to see if we are out of arguments */if ( !pArgs )return( count );/* Gobble up the fmt string */while (*buf == *fmt){if ((*buf == 0) || (*fmt == 0))return (count);buf++;fmt++;}/* Check for the % */if (*fmt != '%')break;/* fmt should be '%' go to the next character */fmt++;/* get the size modifier */switch (*fmt){case 'l':case 'L':fmt++;size_long = TRUE;break;default:size_long = FALSE;break;}/* fmt should point to our first conversion letter at this point */switch (*fmt){#ifndef NO_FLOATcase 'f':case 'F':/* Get a pointer to this argument */p = (float *)(*pArgs);/* convert to a number */*(float *)p = (float)my_atof(buf, &endptr);/* Make sure that we succeeded */if ( buf == endptr )return ( count );buf = endptr;/* count this one */count++;break;#endif#ifndef NO_SIGNED_INTcase 'd':case 'D':/* Get a pointer to this argument */p = (signed int8 *)(*pArgs);if (*buf == '-'){buf++;sign = TRUE;}elsesign = FALSE;/* convert to a number */if ( size_long ){*(signed int16 *)p = (signed int16)my_atoul(buf, &endptr, 10);if (sign)*(signed int16 *)p = -(*(signed int16 *)p);}else{*(signed int8 *)p = (signed int8)my_atoul(buf, &endptr, 10);if (sign)*(signed int8 *)p = -(*(signed int8 *)p);}/* Make sure that we succeeded */if ( buf == endptr )return ( count );buf = endptr;/* count this one */count++;break;#endif#ifndef NO_INTcase 'u':case 'U':/* Get a pointer to this argument */p = (int8 *)(*pArgs);/* convert to a number */if ( size_long )*(int16 *)p = (int16) my_atoul(buf, &endptr, 10);else*(int8 *)p = (int8) my_atoul(buf, &endptr, 10);/* Make sure that we succeeded */if ( buf == endptr )return ( count );buf = endptr;/* count this one */count++;break;#endif#ifndef NO_STRINGcase 's':/* Get a pointer to this argument */p = (char *)(*pArgs);/* copy the chars */while (true){if ((isspace(*buf)) || (!*buf)){*p = 0;break;}else{*p = *buf;p++;buf++;}}/* count this one */count++;break;#endif#ifndef NO_HEXcase 'x':case 'X':/* Get a pointer to this argument */p = (int8 *)(*pArgs);/* convert to a number */if ( size_long )*(int16 *)p = (int16) my_atoul(buf, &endptr, 16);else*(int8 *)p = (int8) my_atoul(buf, &endptr, 16);/* Make sure that we succeeded */if ( buf == endptr )return ( count );buf = endptr;/* count this one */count++;break;#endif/* unhandled format specifier */default:return (count);}/* Technically this is incorrect but since the size of all pointersare the same, who cares ;)point to the next argument*/pArgs += sizeof(char *);/* Move to the next format char */fmt++;}return (count);}void main() {char x;char sbuffer[64];char cmd=0,param=0;char arglist[2];arglist[0] = &cmd;arglist[1] = ¶m;set_tris_a(0x80);port_b_pullups(0xFF);set_tris_b(0xFF);set_tris_d(0);set_tris_e(0x01);setup_oscillator(OSC_8MHZ);setup_adc_ports(sAN5|VSS_VDD);setup_adc(ADC_CLOCK_INTERNAL);set_adc_channel(5);setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);setup_timer_2(T2_DIV_BY_16, 155, 1);setup_ccp1(CCP_PWM);set_pwm1_duty(75);setup_comparator(NC_NC_NC_NC);sprintf(sbuffer,"/S 30\r\n");x = sscanf(sbuffer,"/%C %d", arglist);printf("\r\nsscanf sez: %u found, cmd %X param %X\r\n",x,cmd,param);}