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.
Fork of OSL10564_74HC595 by
7segLed_HC595.cpp
00001 00002 00003 #include "7segLed_HC595.h" 00004 00005 SevenSegLed::SevenSegLed 00006 ( PinName sdo, PinName sclk, PinName latch, PinName bright, 00007 uint8_t num_of_digit 00008 ) 00009 : spi_(sdo, NC, sclk), latch_(latch), pwm_(bright) 00010 { 00011 num = num_of_digit; 00012 dot_inf = 0; 00013 zerosuppress = false; 00014 spi_.frequency(1000000); 00015 spi_.format(8,0); 00016 latch_ = 0; 00017 pwm_.period_ms(2); 00018 bright_data = 1.0f; 00019 pwm_.pulsewidth_us(bright_data); 00020 } 00021 00022 void SevenSegLed::put_num(int32_t dt) 00023 { 00024 wrk = dt; 00025 for(uint32_t i = 0; i < num; i++) { 00026 buf[i] = wrk % 10; // set each digit value 00027 wrk /= 10; // next digit 00028 } 00029 num_mode = true; // set number display mode 00030 seven_seg_n_digt(); // convert to seven segment element and send SPI 00031 } 00032 00033 void SevenSegLed::put_ascii(const char *data) 00034 { 00035 char dt; 00036 00037 dot_inf = 0; // clear all dot 00038 for (uint32_t i = 0; i < BUFFER_SIZE; i++) { 00039 buf[i] = 0; 00040 } 00041 int32_t po = num - 1; 00042 for(uint32_t pi = 0; ; pi++) { 00043 dt = *(data + pi); 00044 //pc.putc(dt); 00045 if (dt == 0) { 00046 break; // end of strings 00047 } 00048 if (dt == '.') { // check dot 00049 if (pi == 0) { 00050 buf[po] = 0; 00051 po--; 00052 dot_inf |= 1U << num - 1; // set dot 00053 } else { 00054 dot_inf |= 1U << (po + 1); // set dot 00055 } 00056 pi++; 00057 dt = *(data + pi); 00058 } 00059 buf[po] = dt - '0';// convert ASCII number to value 00060 po--; 00061 if (po == -1) { 00062 break; 00063 } 00064 } 00065 num_mode = false; // set none number display mode 00066 seven_seg_n_digt(); // convert to seven segment element and send SPI 00067 } 00068 00069 void SevenSegLed::put_raw(uint8_t *data) 00070 { 00071 for(uint32_t i = 0; i < num; i++) { 00072 uint8_t dt = *(data + i); 00073 if (dt == 0) { 00074 break; 00075 } 00076 seg[i] = dt; 00077 } 00078 spi_out(); 00079 } 00080 00081 void SevenSegLed::put_dot(uint16_t position) 00082 { 00083 dot_inf = position; 00084 } 00085 00086 void SevenSegLed::clear_all_dot() 00087 { 00088 dot_inf = 0; 00089 } 00090 00091 void SevenSegLed::zero_suppress(bool mode) 00092 { 00093 zerosuppress = mode; 00094 } 00095 00096 void SevenSegLed::brightness(float bright) 00097 { 00098 bright_data = bright; 00099 pwm_.pulsewidth_us((int)(2000 * (1.0f - bright))); 00100 } 00101 00102 void SevenSegLed::frequency(int32_t freq) 00103 { 00104 spi_.frequency((int)freq); 00105 } 00106 00107 void SevenSegLed::seven_seg_n_digt() 00108 { 00109 uint8_t const seg_bit[10] = 00110 {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x27, 0x7f, 0x67}; 00111 // 0 1 2 3 4 5 6 7 8 9 00112 00113 for(uint32_t i = 0; i < num; i++) { 00114 seg[i] = seg_bit[buf[i]]; // convert number to segment data 00115 } 00116 if ((num_mode == true) && (zerosuppress == true)) { // zero suppress 00117 for(uint32_t i = 0; i < num; i++) { 00118 if (seg[num -1 - i] == 0x3f) { // if zero then zero suppress 00119 if ((num -1 - i) == 0) { 00120 break; 00121 } 00122 seg[num -1 - i] = 0; 00123 } else { 00124 break; 00125 } 00126 } 00127 } 00128 set_dot(); 00129 spi_out(); 00130 } 00131 00132 void SevenSegLed::set_dot() 00133 { 00134 for(uint8_t i = 0; i < num; i++) { 00135 if ((dot_inf >> i) & 0x0001) { // check dot request 00136 seg[i] |= 0x80; // add dot 00137 } 00138 } 00139 for(uint8_t i = 0; i < num; i++) { 00140 if (seg[num -1 - i] & 0x80) { // check dot is on or off 00141 if (seg[num -1 - i] == 0x80) { // did zero suppress condition 00142 seg[num -1 - i] = 0xbf; // set zero+dot 00143 for(i++; i < num; i++) { 00144 if (seg[num -1 - i] == 0) { // check zero suppress 00145 seg[num -1 - i] = 0x3f; // set zero 00146 } 00147 } 00148 break; 00149 } 00150 } 00151 } 00152 } 00153 00154 void SevenSegLed::spi_out() 00155 { 00156 pwm_.pulsewidth_us(0); 00157 for(uint32_t i = 0; i < num; i++) { 00158 spi_.write(seg[i]); // send SPI line 00159 } 00160 latch_ = 1; // set latch pulse 00161 wait_us(2); 00162 latch_ = 0; 00163 pwm_.pulsewidth_us((int)(2000 * (1.0f - bright_data))); 00164 } 00165 00166 //------------------------------------------------------------------------------ 00167 // Alphabet on 7segment 00168 // refernce 00169 // WentWayUp: WebLog 00170 // http://wentwayup.tamaliver.jp/e400000.html 00171 //------------------------------------------------------------------------------ 00172 00173 #define OFFSET 0x20 00174 00175 char const alphabet_7seg[] = { 00176 // space 00177 0x00, 00178 // ! " # $ % & ' ( ) * 00179 0x0a, 0x22, 0x7e, 0x2d, 0x24, 0x3c, 0x20, 0x61, 0x43, 0x63, 00180 // + , - . / 00181 0x44, 0x0c, 0x40, 0x10, 0x52, 00182 // 0 1 2 3 4 5 6 7 8 9 00183 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 00184 // : ; < = > ? 00185 0x09, 0x51, 0x59, 0x48, 0x4d, 0x4b, 00186 // @ 00187 0x5f, 00188 // A B C D E F G H I J (another C=0x39) 00189 0x77, 0x7c, 0x58, 0x5e, 0x79, 0x71, 0x3d, 0x74, 0x04, 0x1e, 00190 // K L M N O P Q R S T 00191 0x75, 0x38, 0x55, 0x54, 0x5c, 0x73, 0x6b, 0x50, 0x6c, 0x78, 00192 // U V W X Y Z (another W=0x7e) 00193 0x1c, 0x1d, 0x2a, 0x49, 0x6e, 0x1b, 00194 // [ \ ] ^ _ 00195 0x39, 0x64, 0x0f, 0x23, 0x08, 00196 // ` 00197 0x02, 00198 // a b c d e f g h i j 00199 0x77, 0x7c, 0x58, 0x5e, 0x79, 0x71, 0x3d, 0x74, 0x04, 0x1e, 00200 // k l m n o p q r s t 00201 0x75, 0x38, 0x55, 0x54, 0x5c, 0x73, 0x6b, 0x50, 0x6c, 0x78, 00202 // u v w x y z 00203 0x1c, 0x1d, 0x2a, 0x49, 0x6e, 0x1b, 00204 // { | } ~ 00205 0x46, 0x30, 0x70, 0x01 00206 }; 00207 00208 void SevenSegLed::put_strings(const char *data) 00209 { 00210 for(uint32_t i = 0; i < num; i++) { 00211 char c = *(data + i); 00212 if (c <= OFFSET) { // control charcters 00213 seg[num -1 - i] = 0; 00214 } else if ( c > '~') { // over '~' characters 00215 seg[num -1 - i] = 0; 00216 } else { // serach table 00217 seg[num -1 - i] = alphabet_7seg[c - OFFSET]; 00218 } 00219 } 00220 spi_out(); 00221 }
Generated on Fri Jul 15 2022 08:51:20 by
1.7.2
