📄 f93x_captouchsense_switch.c
字号:
EA = 0; // Disable interrupts
TouchSense_Update(); // Update switch variables
// Erase the scratchpad
FLASH_PageErase (CAL_ADDRESS, SCRATCHPAD);
if(switch_number == 0)
{
// Write the expected switch value to the scratchpad
FLASH_ByteWrite ((U16)(CAL_ADDRESS+MSB), SW20_Timer_Count.U8[MSB], SCRATCHPAD);
FLASH_ByteWrite ((U16)(CAL_ADDRESS+LSB), SW20_Timer_Count.U8[LSB], SCRATCHPAD);
} else
{
// Write the expected switch value to the scratchpad
FLASH_ByteWrite ((U16)(CAL_ADDRESS+MSB), SW21_Timer_Count.U8[MSB], SCRATCHPAD);
FLASH_ByteWrite ((U16)(CAL_ADDRESS+LSB), SW21_Timer_Count.U8[LSB], SCRATCHPAD);
}
if ((EA_Save & 0x80) != 0) // Restore EA
{
EA = 1;
}
}
//-----------------------------------------------------------------------------
// Get_Calibration
//-----------------------------------------------------------------------------
//
// Return Value :
// 1) unsigned int - calibration value
// range is full range of integer: 0 to 65335
// Parameters: None
//
// This routine reads the calibration value from Flash
//-----------------------------------------------------------------------------
U16 Get_Calibration(void)
{
UU16 cal_value;
cal_value.U8[MSB] = FLASH_ByteRead ((U16)(CAL_ADDRESS+MSB), SCRATCHPAD);
cal_value.U8[LSB] = FLASH_ByteRead ((U16)(CAL_ADDRESS+LSB), SCRATCHPAD);
return cal_value.U16;
}
//-----------------------------------------------------------------------------
// Flash Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// FLASH_ByteWrite
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters :
// 1) FLADDR addr - address of the byte to write to
// valid range is from 0x0000 to 0xFBFF for 64K devices
// valid range is from 0x0000 to 0x7FFF for 32K devices
// 2) char byte - byte to write to Flash.
//
// This routine writes <byte> to the linear FLASH address <addr>.
//-----------------------------------------------------------------------------
void FLASH_ByteWrite (U16 addr, U8 byte, U8 SFLE)
{
U8 EA_Save = IE; // Preserve EA
SEGMENT_VARIABLE_SEGMENT_POINTER (pwrite, U8, xdata, data);
//unsigned char xdata * data pwrite;// FLASH write pointer
EA = 0; // Disable interrupts
VDM0CN = 0x80; // Enable VDD monitor
RSTSRC = 0x06; // Enable VDD monitor as a reset source
// Leave missing clock detector enabled
pwrite = (char xdata *) addr;
FLKEY = 0xA5; // Key Sequence 1
FLKEY = 0xF1; // Key Sequence 2
PSCTL |= 0x01; // PSWE = 1
if(SFLE)
{
PSCTL |= 0x04; // Access Scratchpad
}
VDM0CN = 0x80; // Enable VDD monitor
RSTSRC = 0x02; // Enable VDD monitor as a reset source
*pwrite = byte; // Write the byte
PSCTL &= ~0x05; // SFLE = 0; PSWE = 0
if ((EA_Save & 0x80) != 0) // Restore EA
{
EA = 1;
}
}
//-----------------------------------------------------------------------------
// FLASH_ByteRead
//-----------------------------------------------------------------------------
//
// Return Value :
// unsigned char - byte read from Flash
// Parameters :
// 1) FLADDR addr - address of the byte to read to
// valid range is from 0x0000 to 0xFBFF for 64K devices
// valid range is from 0x0000 to 0x7FFF for 32K devices
//
// This routine reads a <byte> from the linear FLASH address <addr>.
//-----------------------------------------------------------------------------
U8 FLASH_ByteRead (U16 addr, U8 SFLE)
{
U8 EA_Save = IE; // Preserve EA
SEGMENT_VARIABLE_SEGMENT_POINTER (pread, U8, code, data);
//char code * data pread; // FLASH read pointer
unsigned char byte;
EA = 0; // Disable interrupts
pread = (char code *) addr;
if(SFLE)
{
PSCTL |= 0x04; // Access Scratchpad
}
byte = *pread; // Read the byte
PSCTL &= ~0x04; // SFLE = 0
if ((EA_Save & 0x80) != 0) // Restore EA
{
EA = 1;
}
return byte;
}
//-----------------------------------------------------------------------------
// FLASH_PageErase
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters :
// 1) FLADDR addr - address of any byte in the page to erase
// valid range is from 0x0000 to 0xFBFF for 64K devices
// valid range is from 0x0000 to 0x7FFF for 32K devices
//
// This routine erases the FLASH page containing the linear FLASH address
// <addr>. Note that the page of Flash containing the Lock Byte cannot be
// erased if the Lock Byte is set.
//
//-----------------------------------------------------------------------------
void FLASH_PageErase (U16 addr, U8 SFLE)
{
U8 EA_Save = IE; // Preserve EA
SEGMENT_VARIABLE_SEGMENT_POINTER (pwrite, U8, xdata, data);
//unsigned char xdata * data pwrite;// FLASH write pointer
EA = 0; // Disable interrupts
VDM0CN = 0x80; // Enable VDD monitor
RSTSRC = 0x06; // Enable VDD monitor as a reset source
// Leave missing clock detector enabled
pwrite = (char xdata *) addr;
FLKEY = 0xA5; // Key Sequence 1
FLKEY = 0xF1; // Key Sequence 2
PSCTL |= 0x03; // PSWE = 1; PSEE = 1
if(SFLE)
{
PSCTL |= 0x04; // Access Scratchpad
}
VDM0CN = 0x80; // Enable VDD monitor
RSTSRC = 0x02; // Enable VDD monitor as a reset source
*pwrite = 0; // Initiate page erase
PSCTL &= ~0x07; // SFLE = 0; PSWE = 0; PSEE = 0
if ((EA_Save & 0x80) != 0) // Restore EA
{
EA = 1;
}
}
//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// TouchSense_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configure Comparator 0 and Timer 2 for use with Touchsense.
//-----------------------------------------------------------------------------
void TouchSense_Init (void)
{
// Initialize Comparator0
CPT0CN = 0x8F; // Enable Comparator0; clear flags
// select maximum hysterisis
CPT0MD = 0x0F; // Comparator interrupts disabled,
// lowest power mode
CPT0MX = 0xC8; // Positive Mux: P2.0 - TouchSense Switch
// Negative Mux: TouchSense Compare
// Initialize Timer2
CKCON |= 0x10; // Timer2 counts system clocks
TMR2CN = 0x16; // Capture mode enabled, capture
// trigger is Comparator0.
// Start timer (TR2 = 1).
SW20_Status = 1; // Set switch status to finger not
SW21_Status = 1; // detected.
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configure the Crossbar and GPIO ports.
//
// P0.2 digital open-drain SW2
// P0.3 digital open-drain SW3
// P0.4 digital push-pull UART TX
// P0.5 digital open-drain UART RX
//
// P1.5 digital push-pull Red LED
// P1.6 digital push-pull Yellow LED
//
// P2.0 analog open-drain Touch Sense Switch
// P2.1 analog open-drain Touch Sense Switch
//
//
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
// Configure TouchSense switches
P2MDIN &= ~0x03; // P2.0, P2.1 are analog
P2MDOUT &= ~0x03; // P2.0, P2.1 are open-drain
P2 |= 0x03; // P2.0, P2.1 latches -> '1'
// Configure Hardware Switches
P0MDIN |= 0x0C; // P0.2, P0.3 are digital
P0MDOUT &= ~0x0C; // P0.2, P0.3 are open-drain
P0 |= 0x0C; // Set P0.2, P0.3 latches to '1'
// Configure LEDs
P1MDIN |= 0x60; // P1.5, P1.6 are digital
P1MDOUT |= 0x60; // P1.5, P1.6 are push-pull
// Configure Crossbar
XBR2 = 0x40; // Enable crossbar and weak pull-ups
}
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// This routine initializes the system clock to use the internal precision
// oscillator at its maximum frequency and enables the missing clock
// detector.
//
//-----------------------------------------------------------------------------
void SYSCLK_Init (void)
{
OSCICN |= 0x80; // Enable the precision internal osc.
RSTSRC = 0x06; // Enable missing clock detector and
// leave VDD Monitor enabled.
CLKSEL = 0x00; // Select precision internal osc.
// divided by 1 as the system clock
}
//-----------------------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -