这是我基于MSP430F449设计的电子钟和湿温度计
单片机源程序如下:
- #include <time.h>
- #include "io430.h"
- #include "display.h"
- #include "rtc.h"
- #include "sht10.h"
- #include "key.h"
- void KeyProcess(void);
- void AdjustDateTime(void);
- enum __dis_state{DATETIME, TEMPERATURE, HUMIDITY, VOLTAGE};
- enum __bl_state{OFF, ON};
- enum __adj_state{ADJ_YEAR, ADJ_MON, ADJ_DAY, ADJ_HOUR, ADJ_MIN, ADJ_SEC};
- struct tm datetime;
- float temp, humi;
- int display_state = DATETIME;
- void ReverseBacklight(void)
- {
- static int backlight_state = OFF;
- //P3.7, output HIGH --> ON, LOW --> OFF
- P3SEL &= ~BIT7;
- P3DIR |= BIT7;
- if (backlight_state == OFF)
- {
- backlight_state = ON;
- P3OUT &= ~BIT7;
- }
- else
- {
- backlight_state = OFF;
- P3OUT |= BIT7;
- }
- }
- void InitClock(void)
- {
- FLL_CTL0 &= 0x0F;
- FLL_CTL1 = XT2OFF;
- SCFI0 = FN_2;
- SCFQCTL = 121; //DOC ~ 4M
- }
- void lpm_delay(unsigned char second)
- {
- int i;
- for(i=0; i<second; i++)
- {
- if (KeyIsPress())
- return;
- WDTCTL = WDT_ADLY_1000;
- LPM3;
- }
- WDTCTL = WDTPW + WDTHOLD;
- }
- int GetVoltage(void)
- {
- int volt;
- int i, sample=0;
- //Enable Internal Voltage Reference
- ADC12CTL0 = SHT1_8 + REF2_5V + REFON + ADC12ON;
- ADC12CTL1 = SHP;
- ADC12MCTL0 = 0x1B;
- ADC12CTL0 |= ENC;
- __delay_cycles(100); //wait for Vref stable;
- for(i=0; i<8; i++)
- {
- ADC12CTL0 |= ADC12SC;
- while(!(ADC12IFG & BIT0));
- sample += ADC12MEM0;
- }
- ADC12CTL0 = 0;
- sample >>= 3;
- volt = (int)(sample * 1.221); //*1.221
- return volt;
- }
- void InitUnusedPin(void)
- {
- //P6.0 ~ P6.7
- //P1.0 ~ P1.6
- //P2.4 ~ P2.5
- //P3.2 ~ P3.6
- //P4.0 ~ P4.7 except P4.3
- P6DIR |= 0xFF;
- P1DIR |= 0x7F;
- P2DIR |= BIT4+BIT5;
- P3DIR |= BIT2+BIT3+BIT4+BIT5+BIT6;
- P4DIR |= 0xF7;
- P6OUT &= 0;
- P1OUT &= 0x80;
- P2OUT &= ~(BIT4+BIT5);
- P3OUT &= 0x83;
- P4OUT &= 0x08;
- }
- int main( void )
- {
- // Stop watchdog timer to prevent time out reset
- WDTCTL = WDTPW + WDTHOLD;
- InitUnusedPin();
- IE1 |= WDTIE;
-
- InitClock();
- InitRTC();
- InitKey();
- //LCD Init
- LCDCTL = LCDON + LCD4MUX + LCDSG0_5; // LCD on, 4-Mux, segments S0-S27
- BTCTL = BT_fLCD_DIV128; // LCD clock freq is ACLK/256
- P5SEL |= 0xFF;
-
- ResetMem();
-
- __enable_interrupt();
- while(1)
- {
- switch (display_state)
- {
- case DATETIME:
- RTCGetDateTime(&datetime);
- DisplayDate(datetime.tm_year, datetime.tm_mon, datetime.tm_mday);
- DisplayTime(datetime.tm_hour, datetime.tm_min, datetime.tm_sec);
- lpm_delay(1);
- break;
- case TEMPERATURE:
- if (GetTemperature(&temp))
- {
- DisplayTemperature(temp);
- lpm_delay(3);
- }
- break;
- case HUMIDITY:
- if (GetTempAndHumi(&temp, &humi))
- {
- DisplayHumidity(humi);
- lpm_delay(3);
- }
- break;
- case VOLTAGE:
- DisplayVoltage(GetVoltage());
- lpm_delay(2);
- break;
- default:
- display_state = DATETIME;
- break;
- }
-
- KeyProcess();
- }
- }
- //
- void KeyProcess(void)
- {
- unsigned char key;
- long i;
- key = GetKey();
- switch(display_state)
- {
- case DATETIME:
- if (key & UP) display_state = VOLTAGE;
- else if (key & DOWN) display_state = TEMPERATURE;
- else if (key & OK) {
- for(i=0; i<500000; i++) if (P2IN & BIT3) break; //release.
- if (i == 500000)
- { //Long Press
- AdjustDateTime();
- }
- else
- {
- ReverseBacklight();
- }
- }
- break;
- case TEMPERATURE:
- if (key & UP) display_state = DATETIME;
- else if (key & DOWN) display_state = HUMIDITY;
- else if (key & OK) { //SWITCH BACKLIGHT
- ReverseBacklight();
- }
- break;
- case HUMIDITY:
- if (key & UP) display_state = TEMPERATURE;
- else if (key & DOWN) display_state = VOLTAGE;
- else if (key & OK) { //switch backlight
- ReverseBacklight();
- }
- break;
- case VOLTAGE:
- if (key & UP) display_state = HUMIDITY;
- else if (key & DOWN) display_state = DATETIME;
- else if (key & OK) ReverseBacklight();
- break;
- default: display_state = DATETIME; break;
- }
- }
- void AdjustDateTime(void)
- {
- int state = ADJ_YEAR, exit_code = 1;
- unsigned char key;
- struct tm dt;
- RTCGetDateTime(&dt);
- dt.tm_year += 2000;
- while(exit_code)
- {
- switch (state)
- {
- case ADJ_YEAR:
- do{
- DisplayNum(dt.tm_year);
- key = GetKey();
- if (key & UP)
- dt.tm_year ++;
- else if (key&DOWN)
- dt.tm_year --;
- else if (key & RIGHT)
- {
- state = ADJ_MON;
- break;
- }
- if (dt.tm_year == 2100) dt.tm_year = 2000;
- if (dt.tm_year == 1999) dt.tm_year = 2099;
- }while(1);
- break;
- case ADJ_MON:
- do{
- DisplayNum(dt.tm_mon);
- key = GetKey();
- if (key & UP)
- dt.tm_mon++;
- else if (key & DOWN)
- dt.tm_mon--;
- else if (key & LEFT)
- {
- state = ADJ_YEAR;
- break;
- }
- else if (key & RIGHT)
- {
- state = ADJ_DAY;
- break;
- }
- if (dt.tm_mon == 13) dt.tm_mon = 1;
- if (dt.tm_mon == 0) dt.tm_mon = 12;
- }while(1);
- break;
- case ADJ_DAY:
- do{
- DisplayNum(dt.tm_mday);
- key = GetKey();
- if (key & UP)
- dt.tm_mday++;
- else if (key & DOWN)
- dt.tm_mday--;
- else if (key & LEFT)
- {
- state = ADJ_MON;
- break;
- }
- else if (key & RIGHT)
- {
- state = ADJ_HOUR;
- break;
- }
- //
- }while(1);
- break;
- case ADJ_HOUR:
- do{
- DisplayNum(dt.tm_hour);
- key = GetKey();
- if (key & UP)
- dt.tm_hour++;
- else if (key & DOWN)
- dt.tm_hour--;
- else if (key & LEFT)
- {
- state = ADJ_DAY;
- break;
- }
- else if (key & RIGHT)
- {
- state = ADJ_MIN;
- break;
- }
- if (dt.tm_hour == 24) dt.tm_hour = 0;
- if (dt.tm_hour == -1) dt.tm_hour = 23;
- }while(1);
- break;
- case ADJ_MIN:
- do{
- DisplayNum(dt.tm_min);
- key = GetKey();
- if (key & UP)
- dt.tm_min++;
- else if (key & DOWN)
- dt.tm_min--;
- else if (key & LEFT)
- {
- state = ADJ_HOUR; break;
- }
- else if (key & RIGHT)
- {
- state = ADJ_SEC;
- break;
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
449_clock.rar
(18.63 KB, 下载次数: 27)
|