📄 userexperience.c
字号:
unsigned char menuPosition, quit = 0;
int i;
halAccelerometerShutDown();
halAdcInitTempVcc();
RTCExitSec = 1; // To update digital clock
halButtonsInterruptEnable( BUTTON_ALL );
halLcdClearScreen();
halLcdImage(TI_TINY_BUG, 4, 32, 104, 12 );
menuPosition = 0;
//Print menu title
halLcdPrintLine(menuText, 0, 0 );
//Print menu items
for (i=1;i<menuNum;i++)
halLcdPrintLine(&menuText[i*MENU_ITEM_WIDTH+16], i+1, OVERWRITE_TEXT );
//First line is inverted text, automatic selection
halLcdPrintLine(&menuText[0*MENU_ITEM_WIDTH+16], 1, \
INVERT_TEXT | OVERWRITE_TEXT );
timeOutCounter = 0;
buttonsPressed = 0;
halAdcSetQuitFromISR( 0 );
while (CpuMode == ACTIVE_MODE && quit == 0)
{
TA0CTL &= ~TAIFG;
__bis_SR_register(LPM3_bits + GIE); //Returns if button pressed or clock ticks
__no_operation(); // For debugger only
if (buttonsPressed)
{
switch (buttonsPressed)
{
case BUTTON_UP: menuUpdate(menuText, &menuPosition, 0, menuNum); break;
case BUTTON_DOWN: menuUpdate(menuText, &menuPosition, 1, menuNum); break;
case BUTTON_SELECT: CpuMode = APPLICATION_MODE; break;
case BUTTON_S2: CpuMode = APPLICATION_MODE; break;
case BUTTON_S1: quit = 1;
default: break;
}
timeOutCounter = 0;
}
else //if no button pressed --> clock ticks
{
halAdcStartRead();
digitalClockDraw();
halAdcReadTempVcc(TemperatureStr, VccStr);
halLcdPrintLineCol(TemperatureStr, 7, 12, OVERWRITE_TEXT);
halLcdPrintLineCol(VccStr, 8, 12, OVERWRITE_TEXT);
if (++timeOutCounter > TIME_OUT)
CpuMode = LPM3_MODE;
}
buttonsPressed = 0;
}
RTCExitSec = 0;
halAdcShutDownTempVcc();
return menuPosition;
}
/**********************************************************************//**
* @brief This is the example code's main function.
*
* @param none
*
* @return none
*************************************************************************/
void UserExperience( void )
{
/* Check for the version of the board */
if(!assert_board_version())
while(1);
//Initialize clock and peripherals
halBoardInit();
halBoardStartXT1();
halBoardSetSystemClock(SYSCLK_16MHZ);
loadSettings();
//Initialize LCD and backlight
halLcdInit();
halLcdBackLightInit();
halLcdSetBackLight(lcdBackLightLevelSettingLOCAL);
halLcdSetContrast(lcdContrastSettingLOCAL);
halLcdClearScreen();
halLcdImage(TI_BUG, 14, 106, 10, 0);
//Initialize buttons
buttonDebounce = 1;
halButtonsInit( BUTTON_ALL );
halButtonsInterruptEnable( BUTTON_ALL );
__bis_SR_register(LPM3_bits + GIE); // Enter LPM3
__no_operation(); // For debugging only
CpuMode = ACTIVE_MODE;
setupRTC();
while (1) // main loop
{
switch (CpuMode)
{
case LPM3_MODE : lowPowerMode3(); break;
case ACTIVE_MODE : menuPos = activeMenuMode(menuText, MENU_MAX);
break;
case APPLICATION_MODE:
CpuMode = ACTIVE_MODE;
halButtonsInterruptEnable( BUTTON_ALL );
switch (menuPos)
{
case APP_BAL_BALL : balanceBall(); break;
case APP_CLOCK : displayAnalogClock(); break;
case APP_USB : usbTest(); break;
case APP_AUDIO : audio(); saveSettings(); break;
case PMM_MCLK : menuPMMMCLK(); break;
case MENU_SETTING :
CpuMode = ACTIVE_MODE;
settingMenuPos = activeMenuMode(settingMenuText, SETTING_MENU_MAX);
if (CpuMode == APPLICATION_MODE)
switch (settingMenuPos)
{
case SET_TIME : setTime(); break;
case SET_CONTRAST : setContrast(); break;
case SET_BACKLIGHT : setBackLight();break;
case SET_TEMPERATURE_CONVERSION: setTemperatureConversion();
break;
case CONFIGURE_ACCELEROMETER : configureAccelerometer();
break;
case EXIT_SETTING : saveSettings();
menuPos = APP_CLOCK;
CpuMode = ACTIVE_MODE;
break;
}
//save settings if timeout in setting menu
if (CpuMode == LPM3_MODE)
saveSettings();
}
break;
}
}
}
/**********************************************************************//**
* @brief Initializes the RTC calendar.
*
* Initial values are January 01, 2009, 12:30:05
*
* @param none
*
* @return none
*************************************************************************/
void setupRTC(void)
{
RTCCTL01 = RTCMODE + RTCBCD + RTCHOLD + RTCTEV_1;
SetRTCHOUR(0x12);
SetRTCMIN(0x30);
SetRTCSEC(0x05);
SetRTCDAY(0x01);
SetRTCMON(0x01);
SetRTCYEAR(0x2009);
RTCCTL01 &= ~RTCHOLD;
RTCPS1CTL = RT1IP_5; // Interrupt freq: 2Hz
RTCPS0CTL = RT0IP_7; // Interrupt freq: 128hz
RTCCTL0 |= RTCRDYIE + RTCTEVIE; // Enable interrupt
}
/**********************************************************************//**
* @brief Sets up the WDT as a button debouncer, only activated once a
* button interrupt has occurred.
*
* @param none
*
* @return none
*************************************************************************/
void startWDT()
{
//WDT as 250ms interval counter
SFRIFG1 &= ~WDTIFG;
WDTCTL = WDTPW + WDTSSEL_1 + WDTTMSEL + WDTCNTCL + WDTIS_5;
SFRIE1 |= WDTIE;
}
/************************************************************************/
#pragma vector=RTC_VECTOR
__interrupt void RTC_ISR(void)
{
static unsigned char counter=0;
switch (RTCIV)
{
case 0x02: if (RTCExitSec == 1)
__bic_SR_register_on_exit(LPM3_bits);
if (RTCAccSec == 1)
{
halAccelerometerInit();
halAdcStartRead();
}
break;
case 0x04: break;
case 0x08: if (RTCExit64Hz == 1)
if (++counter == 4)
{
counter = 0;
__bic_SR_register_on_exit(LPM3_bits);
}
break;
case 0x0A: if (RTCAccHalfSec == 1)
{
ADC12IFG = 0;
ADC12CTL0 |= ADC12ENC | ADC12SC;
}
break;
}
RTCCTL0 &= ~RTCRDYIFG;
}
#pragma vector=WDT_VECTOR
__interrupt void WDT_ISR(void)
{
if (buttonDebounce == 2)
{
buttonDebounce = 1;
SFRIFG1 &= ~WDTIFG;
SFRIE1 &= ~WDTIE;
WDTCTL = WDTPW + WDTHOLD;
}
}
#pragma vector=PORT2_VECTOR
__interrupt void Port2_ISR(void)
{
if (buttonDebounce == 1)
{
buttonsPressed = P2IFG;
buttonDebounce = 2;
startWDT();
__bic_SR_register_on_exit(LPM3_bits);
}
else if (0 == buttonDebounce)
{
buttonsPressed = P2IFG;
__bic_SR_register_on_exit(LPM4_bits);
}
P2IFG = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -