📄 maindemo.c
字号:
break;
case VAR_ANAIN_AN0:
*val = AN0String[(BYTE)ref];
if(AN0String[(BYTE)ref] == '\0')
return HTTP_END_OF_VAR;
else if(AN0String[(BYTE)++ref] == '\0' )
return HTTP_END_OF_VAR;
return ref;
// case VAR_ANAIN_AN1:
// *val = AN1String[(BYTE)ref];
// if(AN1String[(BYTE)ref] == '\0')
// return HTTP_END_OF_VAR;
// else if(AN1String[(BYTE)++ref] == '\0' )
// return HTTP_END_OF_VAR;
// return ref;
case VAR_DIGIN0:
*val = BUTTON0_IO ? '1':'0';
break;
case VAR_DIGIN1:
*val = BUTTON1_IO ? '1':'0';
break;
case VAR_DIGIN2:
*val = BUTTON2_IO ? '1':'0';
break;
case VAR_DIGIN3:
*val = BUTTON3_IO ? '1':'0';
break;
case VAR_STACK_VERSION:
if(ref == HTTP_START_OF_VAR)
{
strcpypgm2ram(VarString, VERSION);
}
*val = VarString[(BYTE)ref];
if(VarString[(BYTE)ref] == '\0')
return HTTP_END_OF_VAR;
else if(VarString[(BYTE)++ref] == '\0' )
return HTTP_END_OF_VAR;
return ref;
case VAR_STACK_DATE:
if(ref == HTTP_START_OF_VAR)
{
strcpypgm2ram(VarString, __DATE__ " " __TIME__);
}
*val = VarString[(BYTE)ref];
if(VarString[(BYTE)ref] == '\0')
return HTTP_END_OF_VAR;
else if(VarString[(BYTE)++ref] == '\0' )
return HTTP_END_OF_VAR;
return ref;
#if ENABLE_REMOTE_CONFIG
case VAR_MAC_ADDRESS:
if ( ref == HTTP_START_OF_VAR )
{
VarStringLen = 2*6+5; // 17 bytes: 2 for each of the 6 address bytes + 5 octet spacers
// Format the entire string
i = 0;
VarStringPtr = VarString;
while(1)
{
*VarStringPtr++ = btohexa_high(AppConfig.MyMACAddr.v[i]);
*VarStringPtr++ = btohexa_low(AppConfig.MyMACAddr.v[i]);
if(++i == 6)
break;
*VarStringPtr++ = '-';
}
}
// Send one byte back to the calling function (the HTTP Server)
*val = VarString[(BYTE)ref];
if ( (BYTE)++ref == VarStringLen )
return HTTP_END_OF_VAR;
return ref;
case VAR_SERIAL_NUMBER:
if ( ref == HTTP_START_OF_VAR )
{
// Obtain the serial number. For this demo, we will call
// the two low bytes of our MAC address (required to be
// organization assigned) our board's serial number
itoa(AppConfig.SerialNumber.Val, VarString);
VarStringLen = strlen(VarString);
}
// Send one byte back to the calling function (the HTTP Server)
*val = VarString[(BYTE)ref];
// If this is the last byte to be returned, return
// HTTP_END_OF_VAR so the HTTP server won't keep calling this
// application callback function
if ( (BYTE)++ref == VarStringLen )
return HTTP_END_OF_VAR;
return ref;
case VAR_IP_ADDRESS:
case VAR_SUBNET_MASK:
case VAR_GATEWAY_ADDRESS:
// Check if ref == 0 meaning that the first character of this
// variable needs to be returned
if ( ref == HTTP_START_OF_VAR )
{
// Decide which 4 variable bytes to send back
if(var == VAR_IP_ADDRESS)
DataSource = (BYTE*)&AppConfig.MyIPAddr;
else if(var == VAR_SUBNET_MASK)
DataSource = (BYTE*)&AppConfig.MyMask;
else if(var == VAR_GATEWAY_ADDRESS)
DataSource = (BYTE*)&AppConfig.MyGateway;
// Format the entire string
VarStringPtr = VarString;
i = 0;
while(1)
{
itoa((WORD)*DataSource++, VarStringPtr);
VarStringPtr += strlen(VarStringPtr);
if(++i == 4)
break;
*VarStringPtr++ = '.';
}
VarStringLen = strlen(VarString);
}
// Send one byte back to the calling function (the HTTP Server)
*val = VarString[(BYTE)ref];
// If this is the last byte to be returned, return
// HTTP_END_OF_VAR so the HTTP server won't keep calling this
// application callback function
if ( (BYTE)++ref == VarStringLen )
return HTTP_END_OF_VAR;
return ref;
case VAR_DHCP_TRUE:
case VAR_DHCP_FALSE:
// Check if ref == 0 meaning that the first character of this
// variable needs to be returned
if ( ref == HTTP_START_OF_VAR )
{
if((var == VAR_DHCP_TRUE) ^ AppConfig.Flags.bIsDHCPEnabled)
return HTTP_END_OF_VAR;
VarStringLen = 7;
memcpypgm2ram(VarString, (rom void *)"checked", 7);
}
*val = VarString[(BYTE)ref];
if ( (BYTE)++ref == VarStringLen )
return HTTP_END_OF_VAR;
return ref;
#endif
}
return HTTP_END_OF_VAR;
}
#endif
#if defined(STACK_USE_FTP_SERVER) && defined(MPFS_USE_EEPROM)
ROM char FTP_USER_NAME[] = "ftp";
ROM char FTP_USER_PASS[] = "microchip";
#undef FTP_USER_NAME_LEN
#define FTP_USER_NAME_LEN (sizeof(FTP_USER_NAME)-1)
#define FTP_USER_PASS_LEN (sizeof(FTP_USER_PASS)-1)
BOOL FTPVerify(char *login, char *password)
{
if ( !memcmppgm2ram(login, (ROM void*)FTP_USER_NAME, FTP_USER_NAME_LEN) )
{
if ( !memcmppgm2ram(password, (ROM void*)FTP_USER_PASS, FTP_USER_PASS_LEN) )
return TRUE;
}
return FALSE;
}
#endif
/*********************************************************************
* Function: void InitializeBoard(void)
*
* PreCondition: None
*
* Input: None
*
* Output: None
*
* Side Effects: None
*
* Overview: Initialize board specific hardware.
*
* Note: None
********************************************************************/
static void InitializeBoard(void)
{
// LEDs
LED0_TRIS = 0;
LED1_TRIS = 0;
LED2_TRIS = 0;
LED3_TRIS = 0;
LED4_TRIS = 0;
LED5_TRIS = 0;
LED6_TRIS = 0;
#if !defined(EXPLORER_16) // Pin multiplexed with a button on EXPLORER_16
LED7_TRIS = 0;
#endif
LED0_IO = 0;
LED1_IO = 0;
LED2_IO = 0;
LED3_IO = 0;
LED4_IO = 0;
LED5_IO = 0;
LED6_IO = 0;
LED7_IO = 0;
#ifdef __C30__
#if defined(__dsPIC33F__) || defined(__PIC24H__)
// Crank up the core frequency
PLLFBD = 39; // Multiply by 40 for 160MHz VCO output (8MHz XT oscillator)
CLKDIV = 0x0000; // FRC: divide by 2, PLLPOST: divide by 2, PLLPRE: divide by 2
// Port I/O
AD1PCFGHbits.PCFG23 = 1; // Make RA7 (BUTTON1) a digital input
#endif
// ADC
AD1CON1 = 0x84E4; // Turn on, auto sample start, auto-convert, 12 bit mode (on parts with a 12bit A/D)
AD1CON2 = 0x0404; // AVdd, AVss, int every 2 conversions, MUXA only, scan
AD1CON3 = 0x1003; // 16 Tad auto-sample, Tad = 3*Tcy
AD1CHS = 0; // Input to AN0 (potentiometer)
AD1PCFGbits.PCFG5 = 0; // Disable digital input on AN5 (potentiometer)
AD1PCFGbits.PCFG4 = 0; // Disable digital input on AN4 (TC1047A temp sensor)
AD1CSSL = 1<<5; // Scan pot
// // Enable ADC interrupt
// IFS0bits.AD1IF = 0;
// IEC0bits.AD1IE = 1;
// UART
UARTTX_TRIS = 0;
UARTRX_TRIS = 1;
U2BRG = (INSTR_FREQ+8ul*BAUD_RATE)/16/BAUD_RATE-1;
U2MODE = 0x8000; // UARTEN set
U2STA = 0x0400; // UTXEN set
#else
// Enable 4x PLL on PIC18F87J10, PIC18F97J60, etc.
OSCTUNE = 0x40;
// Set up analog features of PORTA
// PICDEM.net 2 board has POT on AN2, Temp Sensor on AN3
#if defined(PICDEMNET2) || defined(PIC18F97J60_TEST_BOARD)
ADCON0 = 0b10001001; // ADON, Channel 2, Calibrate next conversion
ADCON1 = 0b00001011; // Vdd/Vss is +/-REF, AN0, AN1, AN2, AN3 are analog
TRISA = 0x2F;
#elif defined(__18F452)
ADCON0 = 0b10000001; // ADON, Channel 0, Fosc/32
ADCON1 = 0b10001110; // Right justified, Fosc/32, AN0 only anlog, VREF+/VREF- are VDD/VSS
TRISA = 0x23;
#else
ADCON0 = 0b00000001; // ADON, Channel 0
ADCON1 = 0b00001110; // Vdd/Vss is +/-REF, AN0 is analog
TRISA = 0x23;
#endif
ADCON2 = 0b10111110; // Right justify, 20TAD ACQ time, Fosc/64 (~21.0kHz)
// Enable internal PORTB pull-ups
INTCON2bits.RBPU = 0;
// Configure USART
TXSTA = 0b00100000; // Low BRG speed
//#if defined(FS_USB)
// RCSTA = 0b10000000; // PICDEM FS USB demo board has UART RX pin multipled with SPI, we must not enable the UART RX functionality
//#else
RCSTA = 0b10010000;
//#endif
SPBRG = SPBRG_VAL;
// Enable Interrupts
T0CON = 0;
INTCONbits.GIEH = 1;
INTCONbits.GIEL = 1;
// Do a calibration A/D conversion
#if defined(__18F87J10) || defined(__18F86J15) || defined(__18F86J10) || defined(__18F85J15) || defined(__18F85J10) || defined(__18F67J10) || defined(__18F66J15) || defined(__18F66J10) || defined(__18F65J15) || defined(__18F65J10) || defined(__18F97J60) || defined(__18F96J65) || defined(__18F96J60) || defined(__18F87J60) || defined(__18F86J65) || defined(__18F86J60) || defined(__18F67J60) || defined(__18F66J65) || defined(__18F66J60)
ADCON0bits.ADCAL = 1;
ADCON0bits.GO = 1;
while(ADCON0bits.GO);
ADCON0bits.ADCAL = 0;
#endif
// // Enable ADC interrupt
// PIR1bits.ADIF = 0;
// PIE1bits.ADIE = 1;
#endif
#if defined(DSPICDEM11)
// Deselect the LCD controller (PIC18F252 onboard) to ensure there is no SPI2 contention
LCDCTRL_CS_TRIS = 0;
LCDCTRL_CS_IO = 1;
// Hold the codec in reset to ensure there is no SPI2 contention
CODEC_RST_TRIS = 0;
CODEC_RST_IO = 0;
#endif
}
/*********************************************************************
* Function: void InitAppConfig(void)
*
* PreCondition: MPFSInit() is already called.
*
* Input: None
*
* Output: Write/Read non-volatile config variables.
*
* Side Effects: None
*
* Overview: None
*
* Note: None
********************************************************************/
static void InitAppConfig(void)
{
#if defined(MPFS_USE_EEPROM)
BYTE c;
BYTE *p;
#endif
#if defined(STACK_USE_DHCP) || defined(STACK_USE_IP_GLEANING)
AppConfig.Flags.bIsDHCPEnabled = TRUE;
#else
AppConfig.Flags.bIsDHCPEnabled = FALSE;
#endif
#if defined(MPFS_USE_EEPROM)
p = (BYTE*)&AppConfig;
XEEBeginRead(EEPROM_CONTROL, 0x00);
c = XEERead();
XEEEndRead();
/*
* When a record is saved, first byte is written as 0x55 to indicate
* that a valid record was saved.
*/
if(c == 0x55)
{
XEEBeginRead(EEPROM_CONTROL, 0x01);
for ( c = 0; c < sizeof(AppConfig); c++ )
*p++ = XEERead();
XEEEndRead();
}
else
SaveAppConfig();
#endif
}
#if defined(MPFS_USE_EEPROM)
static void SaveAppConfig(void)
{
BYTE c;
BYTE *p;
p = (BYTE*)&AppConfig;
XEEBeginWrite(EEPROM_CONTROL, 0x00);
XEEWrite(0x55);
for ( c = 0; c < sizeof(AppConfig); c++ )
{
XEEWrite(*p++);
}
XEEEndWrite();
}
#endif
ROM char menu[] =
"\r\n\r\n\rMicrochip TCP/IP Config Application ("VERSION", " __DATE__ ")\r\n\r\n"
"\t1: Change Board serial number.\r\n"
"\t2: Change Board Host Name.\r\n"
"\t3: Change default IP address.\r\n"
"\t4: Change default gateway address.\r\n"
"\t5: Change default subnet mask.\r\n"
"\t6: Change default DNS server address.\r\n"
"\t7: Enable DHCP & IP Gleaning.\r\n"
"\t8: Disable DHCP & IP Gleaning.\r\n"
"\t9: Download MPFS image.\r\n"
"\t0: Save & Quit.\r\n"
"\r\n"
"Enter a menu choice (1-0): ";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -