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

📄 timedatetemp.c

📁 用msp4301F122通过led显示年、月、日
💻 C
📖 第 1 页 / 共 2 页
字号:
//*******************************************************************************
//  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 + -