Kansai Electric Power usage meter (Denki-yohou) for GainSpan Wi-Fi http://mbed.org/users/okini3939/notebook/denki-yohou/

Dependencies:   mbed GSwifi (old)

Revision:
0:d8a2cab7091c
Child:
1:beff52210994
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/7seg.cpp	Tue Jul 10 05:28:10 2012 +0000
@@ -0,0 +1,74 @@
+#include "mbed.h"
+#include "7seg.h"
+
+static DigitalOut led_k[8] = {p34, p36, p26, p24, p23, p35, p30, p25};
+static DigitalOut led_a[4] = {p16, p17, p18, p19};
+static Ticker tick;
+
+static int ledbuf[4] = {-1, -1, -1, -1};
+const int digits[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
+
+void leddisp () {
+    static int n = 0;
+    int i, bit;
+    
+    for (i = 0; i < 8; i ++) {
+        led_k[i] = 1;
+    }
+    led_a[n] = 1;
+
+    n ++;
+    if (n >= 4) n = 0;
+
+    if (ledbuf[n] >= 0) {
+        bit = 1;
+        for (i = 0; i < 7; i ++) {
+            led_k[i] = digits[ledbuf[n] & 0x7f] & bit ? 0 : 1;
+            bit = bit << 1;
+        }
+        led_k[7] = ledbuf[n] & 0x80 ? 0 : 1;
+    }
+    led_a[n] = 0;
+}
+
+void writeled (int num, int dot, int place) {
+    if (num >= 1000 && place & 0x08) {
+        ledbuf[0] = num / 1000;
+    } else {
+        ledbuf[0] = -1;
+    }
+    if (num >= 100 && place & 0x04) {
+        ledbuf[1] = (num / 100) % 10;
+    } else {
+        ledbuf[1] = -1;
+    }
+    if (num >= 10 && place & 0x02) {
+        ledbuf[2] = (num / 10) % 10;
+    } else {
+        ledbuf[2] = -1;
+    }
+    if (place & 0x01) {
+        ledbuf[3] = num % 10;
+    } else {
+        ledbuf[3] = -1;
+    }
+
+    if (dot >= 1 && dot <= 4) {
+        ledbuf[dot - 1] |= 0x80;
+    }
+}
+
+void initled () {
+    int i;
+    
+    for (i = 0; i < 4; i ++) {
+        led_a[i] = 1;
+    }
+    for (i = 0; i < 8; i ++) {
+        led_k[i] = 1;
+    }
+}
+
+void startled () {
+    tick.attach_us(&leddisp, 2500); // 400Hz
+}