Multiple Sevensegment Display Driving using rs485
Dependents: Multiple_7SegDisplays
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 Sat Jul 16 2022 00:04:24 by
1.7.2
