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@0:3373357a49f4, 2018-01-22 (annotated)
- Committer:
- kenjiArai
- Date:
- Mon Jan 22 10:23:24 2018 +0000
- Revision:
- 0:3373357a49f4
- Child:
- 1:a3755014b7f1
7 segment LED drive
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 0:3373357a49f4 | 1 | /* |
kenjiArai | 0:3373357a49f4 | 2 | * Mbed Library / Akizuki 7-segment LED driver [OSL10564-74HC595-x] |
kenjiArai | 0:3373357a49f4 | 3 | * http://akizukidenshi.com/catalog/g/gM-12643/ |
kenjiArai | 0:3373357a49f4 | 4 | * |
kenjiArai | 0:3373357a49f4 | 5 | * Copyright (c) 2018 Kenji Arai / JH1PJL |
kenjiArai | 0:3373357a49f4 | 6 | * http://www.page.sannet.ne.jp/kenjia/index.html |
kenjiArai | 0:3373357a49f4 | 7 | * http://mbed.org/users/kenjiArai/ |
kenjiArai | 0:3373357a49f4 | 8 | * Created: January 7th, 2018 |
kenjiArai | 0:3373357a49f4 | 9 | * Revised: January 22nd, 2018 |
kenjiArai | 0:3373357a49f4 | 10 | */ |
kenjiArai | 0:3373357a49f4 | 11 | |
kenjiArai | 0:3373357a49f4 | 12 | #include "7segLed_HC595.h" |
kenjiArai | 0:3373357a49f4 | 13 | |
kenjiArai | 0:3373357a49f4 | 14 | SevenSegLed::SevenSegLed |
kenjiArai | 0:3373357a49f4 | 15 | ( PinName sdo, PinName sclk, PinName latch, PinName bright, |
kenjiArai | 0:3373357a49f4 | 16 | uint8_t num_of_digit |
kenjiArai | 0:3373357a49f4 | 17 | ) |
kenjiArai | 0:3373357a49f4 | 18 | : spi_(sdo, NC, sclk), latch_(latch), pwm_(bright) |
kenjiArai | 0:3373357a49f4 | 19 | { |
kenjiArai | 0:3373357a49f4 | 20 | num = num_of_digit; |
kenjiArai | 0:3373357a49f4 | 21 | dot_inf = 0; |
kenjiArai | 0:3373357a49f4 | 22 | zerosuppress = false; |
kenjiArai | 0:3373357a49f4 | 23 | spi_.frequency(1000000); |
kenjiArai | 0:3373357a49f4 | 24 | spi_.format(8,0); |
kenjiArai | 0:3373357a49f4 | 25 | latch_ = 0; |
kenjiArai | 0:3373357a49f4 | 26 | pwm_.period_ms(2); |
kenjiArai | 0:3373357a49f4 | 27 | bright_data = 1.0f; |
kenjiArai | 0:3373357a49f4 | 28 | pwm_.pulsewidth_us(bright_data); |
kenjiArai | 0:3373357a49f4 | 29 | } |
kenjiArai | 0:3373357a49f4 | 30 | |
kenjiArai | 0:3373357a49f4 | 31 | void SevenSegLed::put_num(int32_t dt) |
kenjiArai | 0:3373357a49f4 | 32 | { |
kenjiArai | 0:3373357a49f4 | 33 | wrk = dt; |
kenjiArai | 0:3373357a49f4 | 34 | for(uint32_t i = 0; i < num; i++) { |
kenjiArai | 0:3373357a49f4 | 35 | buf[i] = wrk % 10; // set each digit value |
kenjiArai | 0:3373357a49f4 | 36 | wrk /= 10; // next digit |
kenjiArai | 0:3373357a49f4 | 37 | } |
kenjiArai | 0:3373357a49f4 | 38 | num_mode = true; // set number display mode |
kenjiArai | 0:3373357a49f4 | 39 | seven_seg_n_digt(); // convert to seven segment element and send SPI |
kenjiArai | 0:3373357a49f4 | 40 | } |
kenjiArai | 0:3373357a49f4 | 41 | |
kenjiArai | 0:3373357a49f4 | 42 | void SevenSegLed::put_ascii(const char *data) |
kenjiArai | 0:3373357a49f4 | 43 | { |
kenjiArai | 0:3373357a49f4 | 44 | char dt; |
kenjiArai | 0:3373357a49f4 | 45 | |
kenjiArai | 0:3373357a49f4 | 46 | dot_inf = 0; // clear all dot |
kenjiArai | 0:3373357a49f4 | 47 | for (uint32_t i = 0; i < BUFFER_SIZE; i++) { |
kenjiArai | 0:3373357a49f4 | 48 | buf[i] = 0; |
kenjiArai | 0:3373357a49f4 | 49 | } |
kenjiArai | 0:3373357a49f4 | 50 | int32_t po = num - 1; |
kenjiArai | 0:3373357a49f4 | 51 | for(uint32_t pi = 0; ; pi++) { |
kenjiArai | 0:3373357a49f4 | 52 | dt = *(data + pi); |
kenjiArai | 0:3373357a49f4 | 53 | //pc.putc(dt); |
kenjiArai | 0:3373357a49f4 | 54 | if (dt == 0) { |
kenjiArai | 0:3373357a49f4 | 55 | break; // end of strings |
kenjiArai | 0:3373357a49f4 | 56 | } |
kenjiArai | 0:3373357a49f4 | 57 | if (dt == '.') { // check dot |
kenjiArai | 0:3373357a49f4 | 58 | if (pi == 0) { |
kenjiArai | 0:3373357a49f4 | 59 | buf[po] = 0; |
kenjiArai | 0:3373357a49f4 | 60 | po--; |
kenjiArai | 0:3373357a49f4 | 61 | dot_inf |= 1U << num - 1; // set dot |
kenjiArai | 0:3373357a49f4 | 62 | } else { |
kenjiArai | 0:3373357a49f4 | 63 | dot_inf |= 1U << (po + 1); // set dot |
kenjiArai | 0:3373357a49f4 | 64 | } |
kenjiArai | 0:3373357a49f4 | 65 | pi++; |
kenjiArai | 0:3373357a49f4 | 66 | dt = *(data + pi); |
kenjiArai | 0:3373357a49f4 | 67 | } |
kenjiArai | 0:3373357a49f4 | 68 | buf[po] = dt - '0';// convert ASCII number to value |
kenjiArai | 0:3373357a49f4 | 69 | po--; |
kenjiArai | 0:3373357a49f4 | 70 | if (po == -1) { |
kenjiArai | 0:3373357a49f4 | 71 | break; |
kenjiArai | 0:3373357a49f4 | 72 | } |
kenjiArai | 0:3373357a49f4 | 73 | } |
kenjiArai | 0:3373357a49f4 | 74 | num_mode = false; // set none number display mode |
kenjiArai | 0:3373357a49f4 | 75 | seven_seg_n_digt(); // convert to seven segment element and send SPI |
kenjiArai | 0:3373357a49f4 | 76 | } |
kenjiArai | 0:3373357a49f4 | 77 | |
kenjiArai | 0:3373357a49f4 | 78 | void SevenSegLed::put_raw(uint8_t *data) |
kenjiArai | 0:3373357a49f4 | 79 | { |
kenjiArai | 0:3373357a49f4 | 80 | for(uint32_t i = 0; i < num; i++) { |
kenjiArai | 0:3373357a49f4 | 81 | uint8_t dt = *(data + i); |
kenjiArai | 0:3373357a49f4 | 82 | if (dt == 0) { |
kenjiArai | 0:3373357a49f4 | 83 | break; |
kenjiArai | 0:3373357a49f4 | 84 | } |
kenjiArai | 0:3373357a49f4 | 85 | seg[i] = dt; |
kenjiArai | 0:3373357a49f4 | 86 | } |
kenjiArai | 0:3373357a49f4 | 87 | spi_out(); |
kenjiArai | 0:3373357a49f4 | 88 | } |
kenjiArai | 0:3373357a49f4 | 89 | |
kenjiArai | 0:3373357a49f4 | 90 | void SevenSegLed::put_dot(uint16_t position) |
kenjiArai | 0:3373357a49f4 | 91 | { |
kenjiArai | 0:3373357a49f4 | 92 | dot_inf = position; |
kenjiArai | 0:3373357a49f4 | 93 | } |
kenjiArai | 0:3373357a49f4 | 94 | |
kenjiArai | 0:3373357a49f4 | 95 | void SevenSegLed::clear_all_dot() |
kenjiArai | 0:3373357a49f4 | 96 | { |
kenjiArai | 0:3373357a49f4 | 97 | dot_inf = 0; |
kenjiArai | 0:3373357a49f4 | 98 | } |
kenjiArai | 0:3373357a49f4 | 99 | |
kenjiArai | 0:3373357a49f4 | 100 | void SevenSegLed::zero_suppress(bool mode) |
kenjiArai | 0:3373357a49f4 | 101 | { |
kenjiArai | 0:3373357a49f4 | 102 | zerosuppress = mode; |
kenjiArai | 0:3373357a49f4 | 103 | } |
kenjiArai | 0:3373357a49f4 | 104 | |
kenjiArai | 0:3373357a49f4 | 105 | void SevenSegLed::brightness(float bright) |
kenjiArai | 0:3373357a49f4 | 106 | { |
kenjiArai | 0:3373357a49f4 | 107 | bright_data = bright; |
kenjiArai | 0:3373357a49f4 | 108 | pwm_.pulsewidth_us((int)(2000 * (1.0f - bright))); |
kenjiArai | 0:3373357a49f4 | 109 | } |
kenjiArai | 0:3373357a49f4 | 110 | |
kenjiArai | 0:3373357a49f4 | 111 | void SevenSegLed::frequency(int32_t freq) |
kenjiArai | 0:3373357a49f4 | 112 | { |
kenjiArai | 0:3373357a49f4 | 113 | spi_.frequency((int)freq); |
kenjiArai | 0:3373357a49f4 | 114 | } |
kenjiArai | 0:3373357a49f4 | 115 | |
kenjiArai | 0:3373357a49f4 | 116 | void SevenSegLed::seven_seg_n_digt() |
kenjiArai | 0:3373357a49f4 | 117 | { |
kenjiArai | 0:3373357a49f4 | 118 | uint8_t const seg_bit[10] = |
kenjiArai | 0:3373357a49f4 | 119 | {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x27, 0x7f, 0x67}; |
kenjiArai | 0:3373357a49f4 | 120 | // 0 1 2 3 4 5 6 7 8 9 |
kenjiArai | 0:3373357a49f4 | 121 | |
kenjiArai | 0:3373357a49f4 | 122 | for(uint32_t i = 0; i < num; i++) { |
kenjiArai | 0:3373357a49f4 | 123 | seg[i] = seg_bit[buf[i]]; // convert number to segment data |
kenjiArai | 0:3373357a49f4 | 124 | } |
kenjiArai | 0:3373357a49f4 | 125 | if ((num_mode == true) && (zerosuppress == true)) { // zero suppress |
kenjiArai | 0:3373357a49f4 | 126 | for(uint32_t i = 0; i < num; i++) { |
kenjiArai | 0:3373357a49f4 | 127 | if (seg[num -1 - i] == 0x3f) { // if zero then zero suppress |
kenjiArai | 0:3373357a49f4 | 128 | if ((num -1 - i) == 0) { |
kenjiArai | 0:3373357a49f4 | 129 | break; |
kenjiArai | 0:3373357a49f4 | 130 | } |
kenjiArai | 0:3373357a49f4 | 131 | seg[num -1 - i] = 0; |
kenjiArai | 0:3373357a49f4 | 132 | } else { |
kenjiArai | 0:3373357a49f4 | 133 | break; |
kenjiArai | 0:3373357a49f4 | 134 | } |
kenjiArai | 0:3373357a49f4 | 135 | } |
kenjiArai | 0:3373357a49f4 | 136 | } |
kenjiArai | 0:3373357a49f4 | 137 | set_dot(); |
kenjiArai | 0:3373357a49f4 | 138 | spi_out(); |
kenjiArai | 0:3373357a49f4 | 139 | } |
kenjiArai | 0:3373357a49f4 | 140 | |
kenjiArai | 0:3373357a49f4 | 141 | void SevenSegLed::set_dot() |
kenjiArai | 0:3373357a49f4 | 142 | { |
kenjiArai | 0:3373357a49f4 | 143 | for(uint8_t i = 0; i < num; i++) { |
kenjiArai | 0:3373357a49f4 | 144 | if ((dot_inf >> i) & 0x0001) { // check dot request |
kenjiArai | 0:3373357a49f4 | 145 | seg[i] |= 0x80; // add dot |
kenjiArai | 0:3373357a49f4 | 146 | } |
kenjiArai | 0:3373357a49f4 | 147 | } |
kenjiArai | 0:3373357a49f4 | 148 | for(uint8_t i = 0; i < num; i++) { |
kenjiArai | 0:3373357a49f4 | 149 | if (seg[num -1 - i] & 0x80) { // check dot is on or off |
kenjiArai | 0:3373357a49f4 | 150 | if (seg[num -1 - i] == 0x80) { // did zero suppress condition |
kenjiArai | 0:3373357a49f4 | 151 | seg[num -1 - i] = 0xbf; // set zero+dot |
kenjiArai | 0:3373357a49f4 | 152 | for(i++; i < num; i++) { |
kenjiArai | 0:3373357a49f4 | 153 | if (seg[num -1 - i] == 0) { // check zero suppress |
kenjiArai | 0:3373357a49f4 | 154 | seg[num -1 - i] = 0x3f; // set zero |
kenjiArai | 0:3373357a49f4 | 155 | } |
kenjiArai | 0:3373357a49f4 | 156 | } |
kenjiArai | 0:3373357a49f4 | 157 | break; |
kenjiArai | 0:3373357a49f4 | 158 | } |
kenjiArai | 0:3373357a49f4 | 159 | } |
kenjiArai | 0:3373357a49f4 | 160 | } |
kenjiArai | 0:3373357a49f4 | 161 | } |
kenjiArai | 0:3373357a49f4 | 162 | |
kenjiArai | 0:3373357a49f4 | 163 | void SevenSegLed::spi_out() |
kenjiArai | 0:3373357a49f4 | 164 | { |
kenjiArai | 0:3373357a49f4 | 165 | pwm_.pulsewidth_us(0); |
kenjiArai | 0:3373357a49f4 | 166 | for(uint32_t i = 0; i < num; i++) { |
kenjiArai | 0:3373357a49f4 | 167 | spi_.write(seg[i]); // send SPI line |
kenjiArai | 0:3373357a49f4 | 168 | } |
kenjiArai | 0:3373357a49f4 | 169 | latch_ = 1; // set latch pulse |
kenjiArai | 0:3373357a49f4 | 170 | wait_us(2); |
kenjiArai | 0:3373357a49f4 | 171 | latch_ = 0; |
kenjiArai | 0:3373357a49f4 | 172 | pwm_.pulsewidth_us((int)(2000 * (1.0f - bright_data))); |
kenjiArai | 0:3373357a49f4 | 173 | } |
kenjiArai | 0:3373357a49f4 | 174 | |
kenjiArai | 0:3373357a49f4 | 175 | //------------------------------------------------------------------------------ |
kenjiArai | 0:3373357a49f4 | 176 | // Alphabet on 7segment |
kenjiArai | 0:3373357a49f4 | 177 | // refernce |
kenjiArai | 0:3373357a49f4 | 178 | // WentWayUp: WebLog |
kenjiArai | 0:3373357a49f4 | 179 | // http://wentwayup.tamaliver.jp/e400000.html |
kenjiArai | 0:3373357a49f4 | 180 | //------------------------------------------------------------------------------ |
kenjiArai | 0:3373357a49f4 | 181 | |
kenjiArai | 0:3373357a49f4 | 182 | #define OFFSET 0x20 |
kenjiArai | 0:3373357a49f4 | 183 | |
kenjiArai | 0:3373357a49f4 | 184 | char const alphabet_7seg[] = { |
kenjiArai | 0:3373357a49f4 | 185 | // space |
kenjiArai | 0:3373357a49f4 | 186 | 0x00, |
kenjiArai | 0:3373357a49f4 | 187 | // ! " # $ % & ' ( ) * |
kenjiArai | 0:3373357a49f4 | 188 | 0x0a, 0x22, 0x7e, 0x2d, 0x24, 0x3c, 0x20, 0x61, 0x43, 0x63, |
kenjiArai | 0:3373357a49f4 | 189 | // + , - . / |
kenjiArai | 0:3373357a49f4 | 190 | 0x44, 0x0c, 0x40, 0x10, 0x52, |
kenjiArai | 0:3373357a49f4 | 191 | // 0 1 2 3 4 5 6 7 8 9 |
kenjiArai | 0:3373357a49f4 | 192 | 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, |
kenjiArai | 0:3373357a49f4 | 193 | // : ; < = > ? |
kenjiArai | 0:3373357a49f4 | 194 | 0x09, 0x51, 0x59, 0x48, 0x4d, 0x4b, |
kenjiArai | 0:3373357a49f4 | 195 | // @ |
kenjiArai | 0:3373357a49f4 | 196 | 0x5f, |
kenjiArai | 0:3373357a49f4 | 197 | // A B C D E F G H I J (another C=0x39) |
kenjiArai | 0:3373357a49f4 | 198 | 0x77, 0x7c, 0x58, 0x5e, 0x79, 0x71, 0x3d, 0x74, 0x04, 0x1e, |
kenjiArai | 0:3373357a49f4 | 199 | // K L M N O P Q R S T |
kenjiArai | 0:3373357a49f4 | 200 | 0x75, 0x38, 0x55, 0x54, 0x5c, 0x73, 0x6b, 0x50, 0x6c, 0x78, |
kenjiArai | 0:3373357a49f4 | 201 | // U V W X Y Z (another W=0x7e) |
kenjiArai | 0:3373357a49f4 | 202 | 0x1c, 0x1d, 0x2a, 0x49, 0x6e, 0x1b, |
kenjiArai | 0:3373357a49f4 | 203 | // [ \ ] ^ _ |
kenjiArai | 0:3373357a49f4 | 204 | 0x39, 0x64, 0x0f, 0x23, 0x08, |
kenjiArai | 0:3373357a49f4 | 205 | // ` |
kenjiArai | 0:3373357a49f4 | 206 | 0x02, |
kenjiArai | 0:3373357a49f4 | 207 | // a b c d e f g h i j |
kenjiArai | 0:3373357a49f4 | 208 | 0x77, 0x7c, 0x58, 0x5e, 0x79, 0x71, 0x3d, 0x74, 0x04, 0x1e, |
kenjiArai | 0:3373357a49f4 | 209 | // k l m n o p q r s t |
kenjiArai | 0:3373357a49f4 | 210 | 0x75, 0x38, 0x55, 0x54, 0x5c, 0x73, 0x6b, 0x50, 0x6c, 0x78, |
kenjiArai | 0:3373357a49f4 | 211 | // u v w x y z |
kenjiArai | 0:3373357a49f4 | 212 | 0x1c, 0x1d, 0x2a, 0x49, 0x6e, 0x1b, |
kenjiArai | 0:3373357a49f4 | 213 | // { | } ~ |
kenjiArai | 0:3373357a49f4 | 214 | 0x46, 0x30, 0x70, 0x01 |
kenjiArai | 0:3373357a49f4 | 215 | }; |
kenjiArai | 0:3373357a49f4 | 216 | |
kenjiArai | 0:3373357a49f4 | 217 | void SevenSegLed::put_strings(const char *data) |
kenjiArai | 0:3373357a49f4 | 218 | { |
kenjiArai | 0:3373357a49f4 | 219 | for(uint32_t i = 0; i < num; i++) { |
kenjiArai | 0:3373357a49f4 | 220 | char c = *(data + i); |
kenjiArai | 0:3373357a49f4 | 221 | if (c <= OFFSET) { // control charcters |
kenjiArai | 0:3373357a49f4 | 222 | seg[num -1 - i] = 0; |
kenjiArai | 0:3373357a49f4 | 223 | } else if ( c > '~') { // over '~' characters |
kenjiArai | 0:3373357a49f4 | 224 | seg[num -1 - i] = 0; |
kenjiArai | 0:3373357a49f4 | 225 | } else { // serach table |
kenjiArai | 0:3373357a49f4 | 226 | seg[num -1 - i] = alphabet_7seg[c - OFFSET]; |
kenjiArai | 0:3373357a49f4 | 227 | } |
kenjiArai | 0:3373357a49f4 | 228 | } |
kenjiArai | 0:3373357a49f4 | 229 | spi_out(); |
kenjiArai | 0:3373357a49f4 | 230 | } |