⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 userexperience.c

📁 msp430 test code and examples for using a 5438
💻 C
📖 第 1 页 / 共 2 页
字号:
  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 + -