Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
Generated on Tue Jul 12 2022 22:47:11 by
1.7.2