📄 f4270_altimeter_sb_iar.c
字号:
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 + -