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

📄 f4270_altimeter_sb_iar.c

📁 德州仪器的msp430单片机
💻 C
📖 第 1 页 / 共 3 页
字号:
        case PM_DISPLAY_CONTR :
          ProgramMode = PM_SET_CONTR;
          LCDM1 = 0x00;                         // Display 'SEt    '
          LCDM2 = DIG_S;
          LCDM3 = DIG_E;
          LCDM4 = DIG_T;
          LCDM5 = 0x00;
          LCDM6 = 0x00;
          LCDM7 = 0x00;
          StatusFlags |= SF_HOLD_DISPL;         // Hold display contents
          break;
        case PM_CAL_A  :
          ProgramMode = PM_MEASURE_A;
          StoreCalInFlash();
          break;
        case PM_CAL_P :
          ProgramMode = PM_MEASURE_P;
          StoreCalInFlash();
          break;
        case PM_SET_TIME :
          ProgramMode = PM_DISPLAY_TIME;
          LCDM1 = 0x00;                         // Clear display and output
          LCDM2 = DIG_D;                        // 'done'
          LCDM3 = DIG_O;
          LCDM4 = DIG_N;
          LCDM5 = DIG_E;
          LCDM6 = 0x00;
          LCDM7 = 0x00;
          StatusFlags |= SF_HOLD_DISPL;         // Hold display contents
          break;
        case PM_CAL_TEMP :
          ProgramMode = PM_MEASURE_TEMP;
          StoreCalInFlash();
          break;
        case PM_SET_CONTR :
          ProgramMode = PM_DISPLAY_CONTR;
          StoreCalInFlash();
          break;
      }
      StatusFlags &= ~(SF_PB1_PRESSED + SF_PB2_PRESSED);
    }
    else if ((StatusFlags & SF_PB1_PRESSED) && (PB1DownCtr > 124))
    {
      switch (ProgramMode)
      {
        case PM_CAL_A :
          CalConstA -= 5;
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
        case PM_CAL_P :
          CalConstP -= 5;
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
        case PM_SET_TIME :
          RTC_Dec(1);                           // Decrement minutes
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
        case PM_CAL_TEMP :
          CalConstT--;
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
      }
    }
    else if ((StatusFlags & SF_PB1_RELEASED) && (PB1DownCtr < 62))
    {
      switch (ProgramMode)
      {
        case PM_MEASURE_A :
          StopConversion();
          ProgramMode = PM_MEASURE_P;
          InitConversion();
          StatusFlags |= SF_SD16_START;
          ModeCtr = 0;                          // Reset timeout counter
          break;
        case PM_MEASURE_P :
          StopConversion();
          ProgramMode = PM_DISPLAY_TIME;
          break;
        case PM_DISPLAY_TIME :
          ProgramMode = PM_MEASURE_TEMP;
          InitConversion();
          StatusFlags |= SF_SD16_START;
          break;
        case PM_MEASURE_TEMP :
          StopConversion();
          ProgramMode = PM_DISPLAY_CONTR;
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
        case PM_DISPLAY_CONTR :
          ProgramMode = PM_MEASURE_A;
          InitConversion();
          StatusFlags |= SF_SD16_START;
          ModeCtr = 0;                          // Reset timeout counter
          break;
        case PM_CAL_A  :
          CalConstA--;
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
        case PM_CAL_P :
          CalConstP--;
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
        case PM_SET_TIME :
          RTC_Dec(1);                           // Decrement minutes
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
        case PM_CAL_TEMP :
          CalConstT--;
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
        case PM_SET_CONTR :
          if (DispContr) DispContr--;           // Decrement if possible
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
      }
      StatusFlags &= ~SF_PB1_RELEASED;
    }
    else if ((StatusFlags & SF_PB2_PRESSED) && (PB2DownCtr > 124))
    {
      switch (ProgramMode)                      // Do set/calibration
      {
        case PM_MEASURE_TEMP :
          AppFlags ^= AF_DISPLAY_DEGF;          // Toggle DegC/DegF
          StoreCalInFlash();
          StatusFlags &= ~SF_PB2_PRESSED;
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
        case PM_CAL_A  :
          CalConstA += 5;
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
        case PM_CAL_P :
          CalConstP += 5;
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
        case PM_SET_TIME :
          RTC_Tick(1);                          // Increment minutes
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
        case PM_CAL_TEMP :
          CalConstT++;
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
      }
    }
    else if ((StatusFlags & SF_PB2_RELEASED) && (PB2DownCtr < 62))
    {
      switch (ProgramMode)                      // Do set/calibration
      {
        case PM_CAL_A  :
          CalConstA++;
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
        case PM_CAL_P :
          CalConstP++;
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
        case PM_SET_TIME :
          RTC_Tick(1);                          // Increment minutes
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
        case PM_CAL_TEMP :
          CalConstT++;
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
        case PM_SET_CONTR :
          if (DispContr < 15) DispContr++;      // Increment if possible
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
        default :
          LCDACTL ^= LCDON;                     // LCD on/off
          StatusFlags |= SF_UPD_DISPLAY;        // Force display update
          break;
      }
      StatusFlags &= ~SF_PB2_RELEASED;
    }

    if (StatusFlags & SF_SD16_READY)
    {
      switch (ProgramMode)
      {
        case PM_MEASURE_A :
        case PM_MEASURE_P :
        case PM_CAL_A :
        case PM_CAL_P :
          SD16Result = SD16Temp >> 6;           // Calculate result (div 64)
          StatusFlags |= SF_SD16_START;         // Trigger SD16 conversion
          break;
        case PM_MEASURE_TEMP :
        case PM_CAL_TEMP :
          SD16Result = SD16Temp;                // Move result
          break;
      }
      StatusFlags |= SF_UPD_DISPLAY;            // Request display update
      StatusFlags &= ~SF_SD16_READY;            // Event processed
    }

    if (StatusFlags & SF_SD16_START)
    {
      StartNextConversion();                    // Start SD16 conversions
      StatusFlags &= ~SF_SD16_START;            // Event processed
    }

    if (StatusFlags & SF_UPD_DISPLAY)           // Display update requested?
    {
      if (StatusFlags & SF_HOLD_DISPL)          // Preserve display contents?
      {
        StatusFlags &= ~SF_HOLD_DISPL;          // Event processed
      }
      else
      {
        LCDAVCTL1 = DispContr << 1;             // Set LCDA charge pump voltage

        switch (ProgramMode)
        {
          case PM_MEASURE_A :
          case PM_CAL_A :
            Disp_BCD(0x0fafffff);               // Display 'A     '
            Disp_Value(0, 18400.0f *
              log(NORMAL_P / ((float)SD16Result * UV_PER_LSB * MB_PER_UV)) +
              CalConstA);                       // Display in meter
            break;
          case PM_MEASURE_P :
          case PM_CAL_P :
            Disp_BCD(0x0fefffff);               // Display 'P     '
            Disp_Value(0, (float)SD16Result * UV_PER_LSB * MB_PER_UV +
              CalConstP);
           break;
          case PM_DISPLAY_TIME :
          case PM_SET_TIME :
            Disp_BCD(0x0f000000 + ((long)Hrs << 16) + ((int)Mins << 8) + Secs);
            break;
          case PM_MEASURE_TEMP :
          case PM_CAL_TEMP :
            Disp_BCD(0x0fffffff);               // Clear display

            if (Secs & 0x01)                    // Blink degree sign
              LCDM6 = DIG_DEGR;

            if (AppFlags & AF_DISPLAY_DEGF)     // Temp display in Deg F?
            {
              LCDM7 = DIG_F;                    // Display 'F'
              Disp_Value(2, (float)SD16Result * MV_PER_LSB * K_PER_MV * 9 / 5 -
                273 * 9 / 5 + 32 + CalConstT);
            }
            else
            {
              LCDM7 = DIG_C;                    // Display 'C'
              Disp_Value(2, (float)SD16Result * MV_PER_LSB * K_PER_MV - 273 +
                CalConstT);
            }
            break;
          case PM_DISPLAY_CONTR :
          case PM_SET_CONTR :
            if (DispContr)
            {
              Disp_BCD(0x0fceffff);             // Display 'CP    '
              Disp_Value(0, DispContr);         // Contrast value
            }
            else
            {
              Disp_BCD(0x0fceffff);             // Display 'CP    '
              LCDM5 = DIG_O;                    // Display '   OFF'
              LCDM6 = DIG_F;
              LCDM7 = DIG_F;
            }
            break;
        }
        StatusFlags &= ~SF_UPD_DISPLAY;         // Event processed
      }
    }
  }
}
//------------------------------------------------------------------------------
void Init_Sys(void)
{
  int i;
  char *pLCD = (char *)&LCDM1;

  WDTCTL = WDTPW + WDTHOLD;                     // Stop WDT
  FLL_CTL0 |= XCAP18PF;                         // Set load capacitance for xtal

  for (i = 0; i < 20; i++)                      // Clear LCD memory
    *pLCD++ = 0;

  LCDACTL = LCDFREQ_96 + LCD4MUX + LCDON;       // 4mux LCD, set LCD freq
  LCDAPCTL0 = 0x0F;                             // Segs S0-S15 = outputs
  LCDAVCTL0 = LCDCPEN;                          // Enable LCDA charge pump

  BTCTL = BTDIV + BT_fCLK2_DIV128;              // 1s BT int
  IE2 |= BTIE;                                  // Enable Basic Timer interrupt

  P1OUT = 0x00;                                 // P1OUTs = 0
  P1DIR = 0xff & ~(PUSH_BUTTON1 + PUSH_BUTTON2);// Unused pins as outputs
  P1IES = PUSH_BUTTON1 + PUSH_BUTTON2;          // Button ints on falling edge
  P1IFG = 0x00;                                 // Clear P1 int flags
  P1IE = PUSH_BUTTON1 + PUSH_BUTTON2;           // Enable button interrupts
  P5SEL = 0xff;                                 // Set Rxx and COM pins for LCD
  P6OUT = 0x00;                                 // P6OUTs = 0
  P6DIR = 0xff;                                 // Unused pins as outputs
  P6SEL = 0x03;                                 // Select analog function
}
//------------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -