Last active
August 29, 2015 14:14
-
-
Save TareObjects/cc4f2de76a0669dbb38c to your computer and use it in GitHub Desktop.
MSP430G2553+Large 7SegLED Digital Clock with RTC(internal oscillator)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Digital Clock : by Akizuki's Large LED and Energia/MSP430G2553 | |
| // 秋月巨大液晶利用のデジタル時計/温度計 | |
| // | |
| // 2015-01-27 : リリース | |
| // 2015-01-31 : コロンの明るさをPWMで調整 | |
| #include <sRTC.h> | |
| #include <legacymsp430.h> | |
| RealTimeClock myRTC; | |
| //秋月巨大LEDピン | |
| //Anode(+) Common | |
| //1桁 - 4 : P1_1 | |
| //2桁 - 2 : P1_0 | |
| //3桁 - 1 : P1_3 | |
| //4桁 - 5 : P1_4 | |
| // | |
| //a 17 : P1_5 | |
| //b 18 : P2_0 | |
| //c 12 : P2_1 | |
| //d 14 : P2_2 | |
| //e 13 : P2_3 | |
| //f 16 : P2_4 | |
| //g 15 : P2_5 | |
| // | |
| //dp <NC> | |
| //col 20 : P1_2(4, TXD) | |
| // | |
| //Tempe : TEMPSENSOR | |
| //SDA : SDA 15 = P1_6 | |
| //SCL : SCL 14 = P1_7 | |
| //XIN / XOUT | |
| // LEDのポート | |
| int segA = P1_5; | |
| int segB = P2_0; | |
| int segC = P2_1; | |
| int segD = P2_2; | |
| int segE = P2_3; | |
| int segF = P2_4; | |
| int segG = P2_5; | |
| int segCol = P1_2; | |
| int digits[] = {P1_1, P1_0, P1_3, P1_4}; | |
| #define ALL_OFF 10 | |
| // LED PWM | |
| int brightness; | |
| // sprintf用バッファ | |
| char spfBuf[10]; | |
| void setup() | |
| { | |
| // rtc init | |
| myRTC.begin(); | |
| // 温度計ポートの基準電圧は1.5V | |
| analogReference(INTERNAL1V5); | |
| // led | |
| pinMode(segA, OUTPUT); | |
| digitalWrite(segA, HIGH); | |
| pinMode(segB, OUTPUT); | |
| digitalWrite(segB, HIGH); | |
| pinMode(segC, OUTPUT); | |
| digitalWrite(segC, HIGH); | |
| pinMode(segD, OUTPUT); | |
| digitalWrite(segD, HIGH); | |
| pinMode(segE, OUTPUT); | |
| digitalWrite(segE, HIGH); | |
| pinMode(segF, OUTPUT); | |
| digitalWrite(segF, HIGH); | |
| pinMode(segG, OUTPUT); | |
| digitalWrite(segG, HIGH); | |
| analogWrite(segCol, 0); | |
| for (int i = 0; i < 4; i++) { | |
| pinMode(digits[i], OUTPUT); | |
| digitalWrite(digits[i], LOW); | |
| } | |
| setDigit(0); | |
| for (int i = 0; i < 8; i++) { | |
| spfBuf[i] = i + '0'; | |
| } | |
| spfBuf[8] = 0; | |
| myRTC.RTC_hr = 05; | |
| myRTC.RTC_min = 17; | |
| myRTC.RTC_sec = 50; | |
| } | |
| void setDigit(int d) { | |
| for (int i = 0; i < 4; i++) { | |
| if (d == i) | |
| digitalWrite(digits[i], HIGH); | |
| else | |
| digitalWrite(digits[i], LOW); | |
| } | |
| } | |
| int digit = 0; | |
| int loopCount = 0; | |
| int prevSec = 99; | |
| void loop() | |
| { | |
| // まず全セグメント、全桁をoff | |
| // out(ALL_OFF, HIGH); // これがなくても残像でなかった | |
| setDigit(-1); | |
| // 1秒ごとに時刻&温度文字列バッファを更新 | |
| loopCount++; | |
| if (prevSec != myRTC.RTC_sec) { | |
| loopCount = 0; | |
| prevSec = myRTC.RTC_sec; | |
| createTimeAndTempString(); | |
| } | |
| // 表示処理 | |
| // 2:1秒ごとに時計と温度を切り替える | |
| boolean isClock = (myRTC.RTC_sec % 3) != 0; | |
| int offset = isClock ? 0 : 4; | |
| // 対象となる桁の値を0-9か空白に変換しセグメントビットに出力 | |
| int num = spfBuf[digit+offset]; | |
| num = (num != ' ') ? num - '0' : ALL_OFF; | |
| out(num, isClock ? HIGH : LOW); | |
| // 桁ビットを出力(点灯=high) | |
| setDigit(digit); | |
| // 少し維持 | |
| delayMicroseconds(4000); | |
| //次の桁へ | |
| digit++; | |
| if (digit >= 4) digit = 0; | |
| } | |
| // 時計と温度文字列を作る | |
| void createTimeAndTempString(){ | |
| char b1[10], b2[10]; | |
| // 時計 | |
| int hhmm = 10000 + myRTC.RTC_hr*100 + myRTC.RTC_min; | |
| sprintf((char *)b1, "%d", hhmm); | |
| // 温度計 | |
| float f = analogRead(TEMPSENSOR); | |
| int t = (5.0 / 9.0) * (f/10.0 - 32.0) * 10; | |
| int tttt = t < 0 ? 19999 : t + 10000; | |
| sprintf((char *)b2, "%d", tttt); | |
| for (int i = 1; i < 4 && b2[i] == '0'; i++) { | |
| b2[i] = ' '; | |
| } | |
| // 一つの文字列に | |
| sprintf(spfBuf, "%s%s", b1+1, b2+1); | |
| } | |
| int patA[] = { | |
| HIGH, LOW, HIGH, HIGH, LOW, HIGH, HIGH, HIGH, HIGH, HIGH, LOW}; | |
| int patB[] = { | |
| HIGH, HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH, HIGH, HIGH, LOW}; | |
| int patC[] = { | |
| HIGH, HIGH, LOW, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW}; | |
| int patD[] = { | |
| HIGH, LOW, HIGH, HIGH, LOW, HIGH, HIGH, LOW, HIGH, HIGH, LOW}; | |
| int patE[] = { | |
| HIGH, LOW, HIGH, LOW, LOW, LOW, HIGH, LOW, HIGH, LOW, LOW}; | |
| int patF[] = { | |
| HIGH, LOW, LOW, LOW, HIGH, HIGH, HIGH, LOW, HIGH, HIGH, LOW}; | |
| int patG[] = { | |
| LOW, LOW, HIGH, HIGH, HIGH, HIGH, HIGH, LOW, HIGH, HIGH, LOW}; | |
| int sevenPort[] = { | |
| segA, segB, segC, segD, segE, segF, segG}; | |
| int *sevenSeg[] = { | |
| patA, patB, patC, patD, patE, patF, patG}; | |
| void out(int num, int DP) { | |
| for (int i = 0; i < 7; i++) { | |
| digitalWrite(sevenPort[i], sevenSeg[i][num] == HIGH ? LOW : HIGH); | |
| } | |
| analogWrite(segCol, DP == LOW ? 0 : 24); | |
| } | |
| interrupt(TIMER1_A0_VECTOR) Tic_Tac(void) { | |
| myRTC++; // Update secondes | |
| }; |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
詳細はこちら:
http://jiwashin.blogspot.com/2015/01/msp430energiartcled.html