Skip to content

Instantly share code, notes, and snippets.

@TareObjects
Last active August 29, 2015 14:14
Show Gist options
  • Select an option

  • Save TareObjects/cc4f2de76a0669dbb38c to your computer and use it in GitHub Desktop.

Select an option

Save TareObjects/cc4f2de76a0669dbb38c to your computer and use it in GitHub Desktop.
MSP430G2553+Large 7SegLED Digital Clock with RTC(internal oscillator)
// 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
};
@TareObjects
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment