📄 timedatetemp.c
字号:
//*******************************************************************************
// MSP-FET430P120 - Temp Sensor + Clock
//
// N. Frager & N. Brenner
// Texas Instruments, Inc
// February 2004
// Updated for IAR Embedded Workbench Version: 2.21A
// Version for MSP-FET430P120
//******************************************************************************
#include <msp430x12x.h>
// Define segments on LED display
#define a 0x01
#define b 0x02
#define c 0x04
#define d 0x08
#define e 0x10
#define f 0x20
#define g 0x40
// Define numbers on LED display
#define zero a+b+c+d+e+f
#define one b+c
#define two a+b+d+e+g
#define three a+b+c+d+g
#define four b+c+f+g
#define five a+c+d+f+g
#define six a+c+d+e+f+g
#define seven a+b+c
#define eight a+b+c+d+e+f+g
#define nine a+b+c+f+g
#define celcius d+e+g
#define fahrenheit a+e+f+g
#define blank 0x00
// Define button press numbers
#define NOPUSH 0
#define MODE 1
#define TOGGLE 2
// Define state values
#define SHOW_TIME 0
#define SHOW_DATE 1
#define SHOW_YEAR 2
#define SHOW_TEMP 3
#define SET_HOUR 4
#define SET_MIN 5
#define SET_MONTH 6
#define SET_DAY 7
#define SET_YEAR 8
#define AUTO_TOGGLE 9
// Define Extra Auto Toggle States
#define SHOW_TEMP_F 3
#define SHOW_TEMP_C 4
// Define Clock and Date values
#define JAN 1
#define FEB 2
#define MAR 3
#define APR 4
#define MAY 5
#define JUN 6
#define JUL 7
#define AUG 8
#define SEP 9
#define OCT 10
#define NOV 11
#define DEC 12
#define CLK_PER_TEMP 512
#define CLK_PER_SEC 512
#define SEC_PER_MIN 60
#define MIN_PER_HR 60
#define MIN_YEAR 2000
#define MAX_YEAR 2100
#define TRUE 1
#define FALSE 0
// System Routines
void initialize(void); // initialize ports and variables
void clocktick(void); // run the system clock
void display(void); // display driver
void displaydigit(int); // digit display routine
void fillbuffer(void); // fill 4-digit buffer
// Global variables
unsigned int digcount, dig1, dig2, dig3, dig4; // digit buffer
unsigned int clock_count, sec, min, hour, ampm; // clock values
unsigned int month, day, year; // date values
unsigned int mainstate; // main state machine
unsigned int buttonpress, buttonpush; // button press signal
unsigned int toggle_count; // allow for faster clock update
unsigned int blink, timer; // control blinking functionality
unsigned int data, temp, temp_type, temp_count, temp_done; // temperature display
unsigned int togglestate; // auto toggle state machine
unsigned int toggletimer; // 2 second auto toggle timer
unsigned int awake; // sleep mode (FALSE = sleep, TRUE = awake)
unsigned int sleepcount; // counts 15 seconds until sleep
unsigned int autowakecount; // counts 20 minutes until auto wake up
// temperature table
unsigned int temp_array[28][2] = {{0, 320}, {14, 345}, {28, 370}, {42, 395},
{56, 420}, {69, 445}, {83, 470}, {97, 495},
{111, 520}, {125, 545}, {139, 570}, {153, 595},
{167, 620}, {181, 645}, {194, 670}, {208, 695},
{222, 720}, {236, 745}, {250, 770}, {264, 795},
{278, 820}, {292, 845}, {306, 870}, {319, 895},
{333, 920}, {347, 945}, {361, 970}, {375, 995}};
// Main Function
void main(void)
{
initialize(); // initialize ports, timerA and variables
for (;;) // main state machine - run continuously
{
switch(mainstate) {
case SHOW_TIME: // display time
if(buttonpress & (buttonpush == TOGGLE)) {
mainstate = SHOW_DATE;
buttonpress = 0;
}
else if(buttonpress && (buttonpush == MODE)) {
mainstate = SET_HOUR;
buttonpress = 0;
}
break;
case SHOW_DATE: // display date
if(buttonpress && (buttonpush == TOGGLE)) {
mainstate = SHOW_YEAR;
buttonpress = 0;
}
else if(buttonpress && (buttonpush == MODE)) {
mainstate = SET_MONTH;
buttonpress = 0;
}
break;
case SHOW_YEAR: // display year
if(buttonpress && (buttonpush == TOGGLE)) {
mainstate = SHOW_TEMP;
buttonpress = 0;
}
else if(buttonpress && (buttonpush == MODE)) {
mainstate = SET_YEAR;
buttonpress = 0;
}
break;
case SHOW_TEMP: // display temperature
if(buttonpress && (buttonpush == TOGGLE)) {
mainstate = SHOW_TIME;
buttonpress = 0;
}
else if(buttonpress && (buttonpush == MODE)) {
mainstate = SHOW_TEMP;
buttonpress = 0;
temp_type ^= 0x01;
}
break;
case SET_HOUR: // set the hour
if(buttonpress && (buttonpush == TOGGLE)) {
mainstate = SET_HOUR;
buttonpress = 0;
hour++;
if(hour == 12)
ampm ^= 0x01;
if(hour > 12)
hour = 1;
}
else if(buttonpress && (buttonpush == MODE)) {
mainstate = SET_MIN;
buttonpress = 0;
}
break;
case SET_MIN: // set the minute
if(buttonpress && (buttonpush == TOGGLE)) {
mainstate = SET_MIN;
buttonpress = 0;
min++;
if(min == MIN_PER_HR)
min = 0;
}
else if(buttonpress && (buttonpush == MODE)) {
mainstate = SHOW_TIME;
buttonpress = 0;
}
break;
case SET_MONTH: // set the month
if(buttonpress && (buttonpush == TOGGLE)) {
mainstate = SET_MONTH;
buttonpress = 0;
month++;
if(month > DEC)
month = JAN;
}
else if(buttonpress && (buttonpush == MODE)) {
mainstate = SET_DAY;
buttonpress = 0;
}
break;
case SET_DAY: // set the day
if(buttonpress && (buttonpush == TOGGLE)) {
mainstate = SET_DAY;
buttonpress = 0;
day++;
// February calculation
if((year % 4) == 0) { // leap year
if((month == FEB) && (day > 29))
day = 1;
}
else {
if((month == FEB) && (day > 28))
day = 1;
}
// 30 day months
if(((month == APR) || (month == JUN) || (month == SEP) || (month == NOV)) && (day > 30))
day = 1;
// 31 day months
if(day > 31)
day = 1;
}
else if(buttonpress && (buttonpush == MODE)) {
mainstate = SHOW_DATE;
buttonpress = 0;
}
break;
case SET_YEAR: // set the year
if(buttonpress && (buttonpush == TOGGLE)) {
mainstate = SET_YEAR;
buttonpress = 0;
year++;
if(year >= MAX_YEAR)
year = MIN_YEAR;
}
else if(buttonpress && (buttonpush == MODE)) {
mainstate = SHOW_YEAR;
buttonpress = 0;
}
break;
case AUTO_TOGGLE: // auto toggle state
if(buttonpress && (buttonpush == TOGGLE)) {
mainstate = togglestate;
if(mainstate == SET_HOUR) // Celcius exception case
mainstate = SHOW_TEMP;
buttonpress = 0;
}
else if(buttonpress && (buttonpush == MODE)) {
awake = 0; // system sleeps with MODE push
P1OUT = 0x00; // turn off analog system
P2OUT = 0x00;
P3OUT = blank;
CCR0 = 32767; // slow to 1 Hz interrupt speed
buttonpress = 0;
}
break;
}
if(awake) fillbuffer(); // fill the 4-digit buffer
LPM3;
}
}
// PORT1 Push Button interrupt service routine - run on button press
#if __VER__ < 200
interrupt[PORT1_VECTOR] void PORT_1 (void)
#else
#pragma vector=PORT1_VECTOR
__interrupt void PORT_1(void)
#endif
{
int i;
// Clear Interrupt Flag
P1IFG = 0x00;
// Software Debounce Delay
for(i=0;i<64;i++);
// Save button press
if(awake) {
if((P1IN & 0xC0) == 0x40) { // P1.7 = TOGGLE
buttonpush = TOGGLE;
toggle_count = 0;
sleepcount = 0;
buttonpress = 1;
}
else if((P1IN & 0xC0) == 0x80) { // P1.6 = MODE
buttonpush = MODE;
toggle_count = 0;
sleepcount = 0;
buttonpress = 1;
}
else {
buttonpush = NOPUSH;
buttonpress = 0;
}
}
else { // wake system up
if((P1IN & 0xC0) != 0xC0) {
toggle_count = 0;
sleepcount = 0;
awake = TRUE; // system wakes up - button press
P1OUT = 0x18; // turn on analog system
CCR0 = 63; // return to 512 Hz interrupt speed
}
}
}
// Timer A0 interrupt service routine - run at 512 Hz if awake, 1 Hz if asleep
#if __VER__ < 200
interrupt[TIMERA0_VECTOR] void Timer_A (void)
#else
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
#endif
{
// Clock Logic - run at 1 Hz
// always runs
if(awake) { // running at 512 Hz
clock_count++;
if(clock_count >= CLK_PER_SEC) {
clock_count = 0;
clocktick();
}
}
else clocktick(); // running at 1 Hz
// Temperature Controller - run at 1 Hz
if(awake) { // runs only when system is awake
if(temp_done) {
temp_count++;
if(temp_count >= CLK_PER_TEMP) {
temp_count = 0;
temp_done = 0;
}
}
}
// 2 second Auto Toggler - run at 0.5 Hz
if(awake) { // runs only when system is awake
if(mainstate == AUTO_TOGGLE) {
toggletimer++;
if(toggletimer >= 1024) { // 2 second auto toggle
togglestate++;
togglestate %= 5;
toggletimer = 0;
}
if(togglestate == SHOW_TEMP_F)
temp_type = 1;
if(togglestate == SHOW_TEMP_C)
temp_type = 0;
}
else toggletimer = 0;
}
// System Sleep Controller
if(awake) {
if((P1IN & 0xC0)== 0xC0) {
sleepcount++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -