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

Dependencies:   mbed GSwifi (old)

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers 7seg.cpp Source File

7seg.cpp

00001 #include "mbed.h"
00002 #include "7seg.h"
00003 
00004 static DigitalOut led_k[8] = {p34, p36, p26, p24, p23, p35, p30, p25};
00005 static DigitalOut led_a[4] = {p16, p17, p18, p19};
00006 static Ticker tick;
00007 
00008 static int ledbuf[4] = {-1, -1, -1, -1};
00009 const int digits[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
00010 
00011 void leddisp () {
00012     static int n = 0;
00013     int i, bit;
00014     
00015     // led off
00016     for (i = 0; i < 8; i ++) {
00017         led_k[i] = 1;
00018     }
00019     led_a[n] = 1; // common off
00020 
00021     n ++;
00022     if (n >= 4) n = 0;
00023 
00024     // led on
00025     if (ledbuf[n] >= 0) {
00026         bit = 1;
00027         for (i = 0; i < 7; i ++) {
00028             led_k[i] = digits[ledbuf[n] & 0x7f] & bit ? 0 : 1;
00029             bit = bit << 1;
00030         }
00031         led_k[7] = ledbuf[n] & 0x80 ? 0 : 1;
00032     }
00033     led_a[n] = 0; // common on
00034 }
00035 
00036 void writeled (int num, int dot, int mask, int zero) {
00037     if (((num >= 1000) || (zero & 0x08)) && (mask & 0x08)) {
00038         ledbuf[0] = num / 1000 % 10;
00039     } else {
00040         ledbuf[0] = -1;
00041     }
00042     if (((num >= 100) || (zero & 0x04)) && (mask & 0x04)) {
00043         ledbuf[1] = (num / 100) % 10;
00044     } else {
00045         ledbuf[1] = -1;
00046     }
00047     if (((num >= 10) || (zero & 0x02)) && (mask & 0x02)) {
00048         ledbuf[2] = (num / 10) % 10;
00049     } else {
00050         ledbuf[2] = -1;
00051     }
00052     if (mask & 0x01) {
00053         ledbuf[3] = num % 10;
00054     } else {
00055         ledbuf[3] = -1;
00056     }
00057 
00058     if (dot >= 1 && dot <= 4) {
00059         ledbuf[dot - 1] |= 0x80;
00060     }
00061 }
00062 
00063 void initled () {
00064     int i;
00065     
00066     for (i = 0; i < 4; i ++) {
00067         led_a[i] = 1;
00068     }
00069     for (i = 0; i < 8; i ++) {
00070         led_k[i] = 1;
00071     }
00072 }
00073 
00074 void startled () {
00075     tick.attach_us(&leddisp, 2500); // 400Hz
00076 }