OSL10564_74HC595

Fork of OSL10564_74HC595 by Kenji Arai

Committer:
shivanandgowdakr
Date:
Tue Aug 14 12:25:15 2018 +0000
Revision:
1:a3755014b7f1
Parent:
0:3373357a49f4
7 Segment Display driving Using HC595 ;

Who changed what in which revision?

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