Yoshitaka Kuwata / spi7Seg

Dependents:   spi7seg_test

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Spi7Seg.cpp Source File

Spi7Seg.cpp

00001 /*
00002   Spi7Seg.h - mbed library for Serial seven segment LED driver.
00003   This library is for Serial-in pararel-out shift register (HC595) and 7 Segiemnt LED module 
00004   Copyright 20154 by morecat_lab
00005   
00006   This library is distributed in the hope that it will be useful,
00007   but WITHOUT ANY WARRANTY; without even the implied warranty of
00008   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
00009 */
00010 
00011 #include <Timer.h>
00012 #include "Spi7Seg.h"
00013 
00014 const int Spi7Seg::numConv[] = {
00015     NUM_PAT_0, NUM_PAT_1, NUM_PAT_2, NUM_PAT_3,
00016     NUM_PAT_4, NUM_PAT_5, NUM_PAT_6, NUM_PAT_7,
00017     NUM_PAT_8, NUM_PAT_9, NUM_PAT_A, NUM_PAT_B,
00018     NUM_PAT_C, NUM_PAT_D, NUM_PAT_E, NUM_PAT_F};
00019 
00020 // 8 digit
00021 Spi7Seg::Spi7Seg(PinName data,PinName clock, PinName latch) :
00022     _dataPin(data), _clockPin(clock), _latchPin(latch) {
00023     _numOfDigs = 8;
00024     _dataPin = 0;
00025     _clockPin = 1;
00026     _latchPin = 1;
00027     _zeroSupress = 1;
00028 }
00029 
00030 void Spi7Seg::begin(void) {
00031     clear();
00032 }
00033 
00034 char Spi7Seg::segCh(char i) {
00035     return Spi7Seg::numConv[i];
00036 }
00037 
00038 void Spi7Seg::setDot(int d) {
00039     _buffer[d] &= 0x7f;   // P <- 0
00040 }
00041 
00042 void Spi7Seg::clearDot(int d) {
00043     _buffer[d] |= 0x80;  // P <- 1
00044 }
00045 
00046 void Spi7Seg::writeNum(long n) {
00047     _buffer[0] = segCh((n % 100000000) / 10000000);
00048     _buffer[1] = segCh((n % 10000000) / 1000000);
00049     _buffer[2] = segCh((n % 1000000) / 100000);
00050     _buffer[3] = segCh((n % 100000) / 10000);
00051     _buffer[4] = segCh((n % 10000) / 1000);
00052     _buffer[5] = segCh((n % 1000) / 100);
00053     _buffer[6] = segCh((n % 100) / 10);
00054     _buffer[7] = segCh(n % 10);
00055     Spi7Seg::supressZero();
00056 }
00057 
00058 void Spi7Seg::writeNum(char d1, char d2, char d3, char d4,
00059                     char d5, char d6, char d7, char d8)
00060 {
00061     _buffer[0] = segCh(d1);
00062     _buffer[1] = segCh(d2);
00063     _buffer[2] = segCh(d3);
00064     _buffer[3] = segCh(d4);
00065     _buffer[4] = segCh(d5);
00066     _buffer[5] = segCh(d6);
00067     _buffer[6] = segCh(d7);
00068     _buffer[7] = segCh(d8);
00069     Spi7Seg::supressZero();
00070 }
00071 
00072 void Spi7Seg::writeHex(long n) {
00073     _buffer[0] = segCh((n >> 28) & 0xf);
00074     _buffer[1] = segCh((n >> 24) & 0xf);
00075     _buffer[2] = segCh((n >> 20) & 0xf);
00076     _buffer[3] = segCh((n >> 16) & 0xf);
00077     _buffer[4] = segCh((n >> 12) & 0xf);
00078     _buffer[5] = segCh((n >> 8) & 0xf);
00079     _buffer[6] = segCh((n >> 4) & 0xf);
00080     _buffer[7] = segCh(n & 0xf);
00081     Spi7Seg::supressZero();
00082 }
00083 
00084 void Spi7Seg::setZeroSupress(bool t) {
00085     _zeroSupress = t;
00086 }
00087 
00088 void Spi7Seg::supressZero() {
00089     if (_zeroSupress ) {
00090         for (int i = 0 ; i < (_numOfDigs-1) ; i++) {
00091             if (_buffer[i] == segCh(0)) {
00092                 _buffer[i] |= 0x7f; // blank except dot
00093             } else {
00094                 break;
00095             }
00096         }
00097     }
00098 }
00099 
00100 
00101 void Spi7Seg::writeRawData(char d1, char d2, char d3, char d4,
00102                         char d5, char d6, char d7, char d8) {
00103     _buffer[0] = d1;
00104     _buffer[1] = d2;
00105     _buffer[2] = d3;
00106     _buffer[3] = d4;
00107     _buffer[4] = d5;
00108     _buffer[5] = d6;
00109     _buffer[6] = d7;
00110     _buffer[7] = d8;
00111 }
00112 
00113 void Spi7Seg::write(uint8_t d, uint8_t value) {
00114     _buffer[d] = value;
00115 }
00116 
00117 void Spi7Seg::clear(void) {
00118     for (int i = 0; i < 8; i++){
00119         _buffer[i] = 0;
00120     }
00121 }
00122 
00123 
00124 void Spi7Seg::update(void) {
00125     _latchPin = 0;
00126     for (int col = _numOfDigs ; col >= 0 ; col--) {  // reverse order
00127         for (int i = 7; i >= 0; i--) {
00128             _clockPin = 0;
00129             if(_buffer[col] & (1 << i)){
00130                 _dataPin = 1;
00131             } else {
00132                 _dataPin = 0;
00133             }
00134             _clockPin = 1;
00135             _dataPin = 0;
00136         }
00137     }
00138     _latchPin = 1;
00139 }
00140 
00141 void Spi7Seg::updateWithDelay(int ms) {
00142     timer.reset();  // to avoid overflow 32bit counter  (~=30min)
00143     int start = timer.read_ms();
00144     update();
00145     do {
00146         ;
00147     } while((timer.read_ms() - start) < ms);
00148 }
00149 
00150 // EOF