7-segment LED driver [OSL10564-74HC595-x]

Dependents:   Check_7segLED_driver

Committer:
kenjiArai
Date:
Mon Jan 22 10:23:24 2018 +0000
Revision:
0:3373357a49f4
7 segment LED drive

Who changed what in which revision?

UserRevisionLine numberNew 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 }