このライブラリは1桁から8桁までのSeven segment Numeric LEDを制御します。 LEDはanode commonとcathode common を使用することができます。 LEDの表示は1秒で表示をスムースに切り替えるモードと、直ぐに切り替えるモードの2つのモードを選択することができます。 This library to control the Seven segment Numeric LED 8 digit of 1. You can use the LED cathode common and anode common. Switch mode LED display and a second displayed a smooth, you can choose two modes to switch modes quickly.
Dependents: kitchenTimer_Clock kitchenTimer LPC1114FN28_kitchenTimer_Clock SevenSegmentLedSample ... more
SevenSegLed.cpp@0:5410d6e2bce7, 2011-11-20 (annotated)
- Committer:
- suupen
- Date:
- Sun Nov 20 00:22:05 2011 +0000
- Revision:
- 0:5410d6e2bce7
- Child:
- 1:3429249e30f9
V1.1 2011/11/20 This has changed the name of the library
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
suupen | 0:5410d6e2bce7 | 1 | /********************************************************** |
suupen | 0:5410d6e2bce7 | 2 | |
suupen | 0:5410d6e2bce7 | 3 | * SevenSegLed.cpp |
suupen | 0:5410d6e2bce7 | 4 | * dynamic control of seven segment led |
suupen | 0:5410d6e2bce7 | 5 | * |
suupen | 0:5410d6e2bce7 | 6 | **********************************************************/ |
suupen | 0:5410d6e2bce7 | 7 | #define _SEVENSEGLED_C |
suupen | 0:5410d6e2bce7 | 8 | |
suupen | 0:5410d6e2bce7 | 9 | #include "types.h" |
suupen | 0:5410d6e2bce7 | 10 | #include "mbed.h" |
suupen | 0:5410d6e2bce7 | 11 | #include "SevenSegLed.h" |
suupen | 0:5410d6e2bce7 | 12 | |
suupen | 0:5410d6e2bce7 | 13 | |
suupen | 0:5410d6e2bce7 | 14 | |
suupen | 0:5410d6e2bce7 | 15 | |
suupen | 0:5410d6e2bce7 | 16 | /** Create a seven segment led object connected to the specified DigtalOutput pin |
suupen | 0:5410d6e2bce7 | 17 | */ |
suupen | 0:5410d6e2bce7 | 18 | SevenSegLed::SevenSegLed(uint8_t commonPole, uint8_t smooth, PinName seg_a, PinName seg_b, PinName seg_c, PinName seg_d, PinName seg_e, PinName seg_f, PinName seg_g, PinName seg_p, PinName com_1, PinName com_2, PinName com_3, PinName com_4): |
suupen | 0:5410d6e2bce7 | 19 | _seg_a(seg_a), _seg_b(seg_b), _seg_c(seg_c), _seg_d(seg_d), _seg_e(seg_e), _seg_f(seg_f), _seg_g(seg_g), _seg_p(seg_p), |
suupen | 0:5410d6e2bce7 | 20 | _com_1(com_1), _com_2(com_2), _com_3(com_3), _com_4(com_4){ |
suupen | 0:5410d6e2bce7 | 21 | |
suupen | 0:5410d6e2bce7 | 22 | |
suupen | 0:5410d6e2bce7 | 23 | timer.attach_us(this, &SevenSegLed::segmentGrayDataKosin, 10000); // led smooth control 10ms timer inttruupt |
suupen | 0:5410d6e2bce7 | 24 | |
suupen | 0:5410d6e2bce7 | 25 | // data table set of Brightness |
suupen | 0:5410d6e2bce7 | 26 | // DT_pwmGray[] = i ^ 2 |
suupen | 0:5410d6e2bce7 | 27 | for(uint32_t i = 0; i < Z_grayMax + 1; i++){ |
suupen | 0:5410d6e2bce7 | 28 | DT_pwmGray[i] = (uint8_t)(((i * i) * Z_pwmGrayMax ) / (Z_grayMax * Z_grayMax)); |
suupen | 0:5410d6e2bce7 | 29 | } |
suupen | 0:5410d6e2bce7 | 30 | |
suupen | 0:5410d6e2bce7 | 31 | // check connect com_x |
suupen | 0:5410d6e2bce7 | 32 | D_comNull = Z_ketaSuu; |
suupen | 0:5410d6e2bce7 | 33 | if(com_4 == NC){D_comNull--;} |
suupen | 0:5410d6e2bce7 | 34 | if(com_3 == NC){D_comNull--;} |
suupen | 0:5410d6e2bce7 | 35 | if(com_2 == NC){D_comNull--;} |
suupen | 0:5410d6e2bce7 | 36 | if(com_1 == NC){D_comNull--;} |
suupen | 0:5410d6e2bce7 | 37 | |
suupen | 0:5410d6e2bce7 | 38 | // Those who will be reading the LED display |
suupen | 0:5410d6e2bce7 | 39 | D_smooth = smooth; |
suupen | 0:5410d6e2bce7 | 40 | |
suupen | 0:5410d6e2bce7 | 41 | // common and segment pin display data set |
suupen | 0:5410d6e2bce7 | 42 | if(commonPole == 0){ |
suupen | 0:5410d6e2bce7 | 43 | // Anode common |
suupen | 0:5410d6e2bce7 | 44 | D_commonOn = 1; |
suupen | 0:5410d6e2bce7 | 45 | D_commonOff = 0; |
suupen | 0:5410d6e2bce7 | 46 | D_segmentOn = 0; |
suupen | 0:5410d6e2bce7 | 47 | D_segmentOff = 1; |
suupen | 0:5410d6e2bce7 | 48 | } |
suupen | 0:5410d6e2bce7 | 49 | else{ |
suupen | 0:5410d6e2bce7 | 50 | // Cathod common |
suupen | 0:5410d6e2bce7 | 51 | D_commonOn = 0; |
suupen | 0:5410d6e2bce7 | 52 | D_commonOff = 1; |
suupen | 0:5410d6e2bce7 | 53 | D_segmentOn = 1; |
suupen | 0:5410d6e2bce7 | 54 | D_segmentOff = 0; |
suupen | 0:5410d6e2bce7 | 55 | } |
suupen | 0:5410d6e2bce7 | 56 | |
suupen | 0:5410d6e2bce7 | 57 | } |
suupen | 0:5410d6e2bce7 | 58 | |
suupen | 0:5410d6e2bce7 | 59 | |
suupen | 0:5410d6e2bce7 | 60 | |
suupen | 0:5410d6e2bce7 | 61 | /************************************** |
suupen | 0:5410d6e2bce7 | 62 | * 7segment no gray data kosin |
suupen | 0:5410d6e2bce7 | 63 | * 100ms goto no syori |
suupen | 0:5410d6e2bce7 | 64 | **************************************/ |
suupen | 0:5410d6e2bce7 | 65 | void SevenSegLed::segmentGrayDataKosin(void){ |
suupen | 0:5410d6e2bce7 | 66 | uint8_t keta; |
suupen | 0:5410d6e2bce7 | 67 | uint8_t seg; |
suupen | 0:5410d6e2bce7 | 68 | |
suupen | 0:5410d6e2bce7 | 69 | uint8_t segMask; |
suupen | 0:5410d6e2bce7 | 70 | uint8_t segData; |
suupen | 0:5410d6e2bce7 | 71 | |
suupen | 0:5410d6e2bce7 | 72 | |
suupen | 0:5410d6e2bce7 | 73 | //********************************************************* |
suupen | 0:5410d6e2bce7 | 74 | // 7segment no shuturyoku pattern |
suupen | 0:5410d6e2bce7 | 75 | //********************************************************* |
suupen | 0:5410d6e2bce7 | 76 | // seg: a b c d e f g p |
suupen | 0:5410d6e2bce7 | 77 | // bit: 7 6 5 4 3 2 1 0 |
suupen | 0:5410d6e2bce7 | 78 | // --------------------- |
suupen | 0:5410d6e2bce7 | 79 | #define D_0 (0xfc) // 0 1 1 1 1 1 1 0 0 |
suupen | 0:5410d6e2bce7 | 80 | #define D_1 (0x60) // 1 0 1 1 0 0 0 0 0 |
suupen | 0:5410d6e2bce7 | 81 | #define D_2 (0xda) // 2 1 1 0 1 1 0 1 0 |
suupen | 0:5410d6e2bce7 | 82 | #define D_3 (0xf2) // 3 1 1 1 1 0 0 1 0 |
suupen | 0:5410d6e2bce7 | 83 | #define D_4 (0x66) // 4 0 1 1 0 0 1 1 0 |
suupen | 0:5410d6e2bce7 | 84 | #define D_5 (0xb6) // 5 1 0 1 1 0 1 1 0 |
suupen | 0:5410d6e2bce7 | 85 | #define D_6 (0xbe) // 6 1 0 1 1 1 1 1 0 |
suupen | 0:5410d6e2bce7 | 86 | #define D_7 (0xe4) // 7 1 1 1 0 0 1 0 0 |
suupen | 0:5410d6e2bce7 | 87 | #define D_8 (0xfe) // 8 1 1 1 1 1 1 1 0 |
suupen | 0:5410d6e2bce7 | 88 | #define D_9 (0xf6) // 9 1 1 1 1 0 1 1 0 |
suupen | 0:5410d6e2bce7 | 89 | #define D_A (0xee) // A 1 1 1 0 1 1 1 0 |
suupen | 0:5410d6e2bce7 | 90 | #define D_b (0x3e) // b 0 0 1 1 1 1 1 0 |
suupen | 0:5410d6e2bce7 | 91 | #define D_C (0x9c) // C 1 0 0 1 1 1 0 0 |
suupen | 0:5410d6e2bce7 | 92 | #define D_d (0x7a) // d 0 1 1 1 1 0 1 0 |
suupen | 0:5410d6e2bce7 | 93 | #define D_E (0x9e) // E 1 0 0 1 1 1 1 0 |
suupen | 0:5410d6e2bce7 | 94 | #define D_F (0x8e) // F 1 0 0 0 1 1 1 0 |
suupen | 0:5410d6e2bce7 | 95 | #define D_NULL (0x00) // NULL 0 0 0 0 0 0 0 0 |
suupen | 0:5410d6e2bce7 | 96 | // (No indication) |
suupen | 0:5410d6e2bce7 | 97 | |
suupen | 0:5410d6e2bce7 | 98 | |
suupen | 0:5410d6e2bce7 | 99 | const unsigned char DT_segData[17] = {D_0, D_1, D_2, D_3, D_4, D_5, D_6, D_7, D_8, D_9, D_A, D_b, D_C, D_d, D_E, D_F, D_NULL}; |
suupen | 0:5410d6e2bce7 | 100 | uint8_t work; |
suupen | 0:5410d6e2bce7 | 101 | |
suupen | 0:5410d6e2bce7 | 102 | for(keta = 0; keta < Z_ketaSuu; keta++){ |
suupen | 0:5410d6e2bce7 | 103 | // number data set |
suupen | 0:5410d6e2bce7 | 104 | work = D_7seg[keta]; |
suupen | 0:5410d6e2bce7 | 105 | if(work > 0x10){work = 0x10;} // error data then NULL |
suupen | 0:5410d6e2bce7 | 106 | segData = DT_segData[work]; |
suupen | 0:5410d6e2bce7 | 107 | |
suupen | 0:5410d6e2bce7 | 108 | // dot data set |
suupen | 0:5410d6e2bce7 | 109 | if(D_dot[keta] != 0){segData |= 0x01;} |
suupen | 0:5410d6e2bce7 | 110 | |
suupen | 0:5410d6e2bce7 | 111 | // segment data set |
suupen | 0:5410d6e2bce7 | 112 | segMask = 0x80; |
suupen | 0:5410d6e2bce7 | 113 | |
suupen | 0:5410d6e2bce7 | 114 | for(seg = 0; seg < Z_segSuu; seg++){ |
suupen | 0:5410d6e2bce7 | 115 | if(D_smooth == Z_smooth){ |
suupen | 0:5410d6e2bce7 | 116 | // LED display Smooth |
suupen | 0:5410d6e2bce7 | 117 | if((segData & segMask) != 0){ |
suupen | 0:5410d6e2bce7 | 118 | // segment tento |
suupen | 0:5410d6e2bce7 | 119 | if(D_7segGray[keta][seg] < Z_grayMax){D_7segGray[keta][seg]++;} |
suupen | 0:5410d6e2bce7 | 120 | } |
suupen | 0:5410d6e2bce7 | 121 | else{ |
suupen | 0:5410d6e2bce7 | 122 | // segment syoto |
suupen | 0:5410d6e2bce7 | 123 | if(D_7segGray[keta][seg] > 0){D_7segGray[keta][seg]--;} |
suupen | 0:5410d6e2bce7 | 124 | } |
suupen | 0:5410d6e2bce7 | 125 | segMask = segMask >> 1; |
suupen | 0:5410d6e2bce7 | 126 | } |
suupen | 0:5410d6e2bce7 | 127 | else{ |
suupen | 0:5410d6e2bce7 | 128 | // LED display Hard |
suupen | 0:5410d6e2bce7 | 129 | if((segData & segMask) != 0){ |
suupen | 0:5410d6e2bce7 | 130 | // segment tento |
suupen | 0:5410d6e2bce7 | 131 | D_7segGray[keta][seg] = Z_pwmGrayMax; |
suupen | 0:5410d6e2bce7 | 132 | } |
suupen | 0:5410d6e2bce7 | 133 | else{ |
suupen | 0:5410d6e2bce7 | 134 | // segment syoto |
suupen | 0:5410d6e2bce7 | 135 | D_7segGray[keta][seg] = 0; |
suupen | 0:5410d6e2bce7 | 136 | } |
suupen | 0:5410d6e2bce7 | 137 | segMask = segMask >> 1; |
suupen | 0:5410d6e2bce7 | 138 | } |
suupen | 0:5410d6e2bce7 | 139 | } |
suupen | 0:5410d6e2bce7 | 140 | } |
suupen | 0:5410d6e2bce7 | 141 | } |
suupen | 0:5410d6e2bce7 | 142 | |
suupen | 0:5410d6e2bce7 | 143 | |
suupen | 0:5410d6e2bce7 | 144 | /************************************** |
suupen | 0:5410d6e2bce7 | 145 | * main |
suupen | 0:5410d6e2bce7 | 146 | **************************************/ |
suupen | 0:5410d6e2bce7 | 147 | void SevenSegLed::SevenSegLed_main(uint8_t* number, uint8_t* dot) { |
suupen | 0:5410d6e2bce7 | 148 | |
suupen | 0:5410d6e2bce7 | 149 | for(uint8_t i = 0; i < Z_ketaSuu; i++){ |
suupen | 0:5410d6e2bce7 | 150 | D_7seg[i] = number[i]; |
suupen | 0:5410d6e2bce7 | 151 | D_dot[i] = dot[i]; |
suupen | 0:5410d6e2bce7 | 152 | } |
suupen | 0:5410d6e2bce7 | 153 | |
suupen | 0:5410d6e2bce7 | 154 | |
suupen | 0:5410d6e2bce7 | 155 | // dynamic shuturyoku shori |
suupen | 0:5410d6e2bce7 | 156 | output(); |
suupen | 0:5410d6e2bce7 | 157 | } |
suupen | 0:5410d6e2bce7 | 158 | |
suupen | 0:5410d6e2bce7 | 159 | |
suupen | 0:5410d6e2bce7 | 160 | /************************************** |
suupen | 0:5410d6e2bce7 | 161 | * comAllClear |
suupen | 0:5410d6e2bce7 | 162 | * |
suupen | 0:5410d6e2bce7 | 163 | * common pin o subete OFF suru |
suupen | 0:5410d6e2bce7 | 164 | **************************************/ |
suupen | 0:5410d6e2bce7 | 165 | void SevenSegLed::comAllClear(void){ |
suupen | 0:5410d6e2bce7 | 166 | |
suupen | 0:5410d6e2bce7 | 167 | switch (D_comNull){ |
suupen | 0:5410d6e2bce7 | 168 | case 4: // com_1 - com_4 is all connect |
suupen | 0:5410d6e2bce7 | 169 | _com_4 = D_commonOff; |
suupen | 0:5410d6e2bce7 | 170 | //break; |
suupen | 0:5410d6e2bce7 | 171 | case 3: // com_4 Null |
suupen | 0:5410d6e2bce7 | 172 | _com_3 = D_commonOff; |
suupen | 0:5410d6e2bce7 | 173 | // break; |
suupen | 0:5410d6e2bce7 | 174 | case 2: // com_3 Null |
suupen | 0:5410d6e2bce7 | 175 | _com_2 = D_commonOff; |
suupen | 0:5410d6e2bce7 | 176 | //break; |
suupen | 0:5410d6e2bce7 | 177 | case 1: // com_2 Null |
suupen | 0:5410d6e2bce7 | 178 | _com_1 = D_commonOff; |
suupen | 0:5410d6e2bce7 | 179 | //break; |
suupen | 0:5410d6e2bce7 | 180 | case 0: // com_1 Null |
suupen | 0:5410d6e2bce7 | 181 | // nothing |
suupen | 0:5410d6e2bce7 | 182 | break; |
suupen | 0:5410d6e2bce7 | 183 | default: |
suupen | 0:5410d6e2bce7 | 184 | // nothing |
suupen | 0:5410d6e2bce7 | 185 | break; |
suupen | 0:5410d6e2bce7 | 186 | } |
suupen | 0:5410d6e2bce7 | 187 | } |
suupen | 0:5410d6e2bce7 | 188 | |
suupen | 0:5410d6e2bce7 | 189 | /************************************** |
suupen | 0:5410d6e2bce7 | 190 | * segAllClear |
suupen | 0:5410d6e2bce7 | 191 | * |
suupen | 0:5410d6e2bce7 | 192 | * segment pin o subete OFF suru |
suupen | 0:5410d6e2bce7 | 193 | **************************************/ |
suupen | 0:5410d6e2bce7 | 194 | void SevenSegLed::segAllClear(void){ |
suupen | 0:5410d6e2bce7 | 195 | _seg_a = D_segmentOff; |
suupen | 0:5410d6e2bce7 | 196 | _seg_b = D_segmentOff; |
suupen | 0:5410d6e2bce7 | 197 | _seg_c = D_segmentOff; |
suupen | 0:5410d6e2bce7 | 198 | _seg_d = D_segmentOff; |
suupen | 0:5410d6e2bce7 | 199 | _seg_e = D_segmentOff; |
suupen | 0:5410d6e2bce7 | 200 | _seg_f = D_segmentOff; |
suupen | 0:5410d6e2bce7 | 201 | _seg_p = D_segmentOff; |
suupen | 0:5410d6e2bce7 | 202 | } |
suupen | 0:5410d6e2bce7 | 203 | |
suupen | 0:5410d6e2bce7 | 204 | /************************************** |
suupen | 0:5410d6e2bce7 | 205 | * segDataSet |
suupen | 0:5410d6e2bce7 | 206 | * |
suupen | 0:5410d6e2bce7 | 207 | * segment pin ni shuturyoku data o settei |
suupen | 0:5410d6e2bce7 | 208 | **************************************/ |
suupen | 0:5410d6e2bce7 | 209 | void SevenSegLed::segDataSet(uint8_t keta){ |
suupen | 0:5410d6e2bce7 | 210 | |
suupen | 0:5410d6e2bce7 | 211 | for(uint8_t i = 0; i < Z_pwmGrayMax + 1; i++){ |
suupen | 0:5410d6e2bce7 | 212 | if(DT_pwmGray[D_7segGray[keta][0]] <= i){_seg_a = D_segmentOff;}else{_seg_a = D_segmentOn;} |
suupen | 0:5410d6e2bce7 | 213 | if(DT_pwmGray[D_7segGray[keta][1]] <= i){_seg_b = D_segmentOff;}else{_seg_b = D_segmentOn;} |
suupen | 0:5410d6e2bce7 | 214 | if(DT_pwmGray[D_7segGray[keta][2]] <= i){_seg_c = D_segmentOff;}else{_seg_c = D_segmentOn;} |
suupen | 0:5410d6e2bce7 | 215 | if(DT_pwmGray[D_7segGray[keta][3]] <= i){_seg_d = D_segmentOff;}else{_seg_d = D_segmentOn;} |
suupen | 0:5410d6e2bce7 | 216 | if(DT_pwmGray[D_7segGray[keta][4]] <= i){_seg_e = D_segmentOff;}else{_seg_e = D_segmentOn;} |
suupen | 0:5410d6e2bce7 | 217 | if(DT_pwmGray[D_7segGray[keta][5]] <= i){_seg_f = D_segmentOff;}else{_seg_f = D_segmentOn;} |
suupen | 0:5410d6e2bce7 | 218 | if(DT_pwmGray[D_7segGray[keta][6]] <= i){_seg_g = D_segmentOff;}else{_seg_g = D_segmentOn;} |
suupen | 0:5410d6e2bce7 | 219 | if(DT_pwmGray[D_7segGray[keta][7]] <= i){_seg_p = D_segmentOff;}else{_seg_p = D_segmentOn;} |
suupen | 0:5410d6e2bce7 | 220 | |
suupen | 0:5410d6e2bce7 | 221 | } |
suupen | 0:5410d6e2bce7 | 222 | } |
suupen | 0:5410d6e2bce7 | 223 | |
suupen | 0:5410d6e2bce7 | 224 | /************************************** |
suupen | 0:5410d6e2bce7 | 225 | * output |
suupen | 0:5410d6e2bce7 | 226 | * |
suupen | 0:5410d6e2bce7 | 227 | * dynamic dosa saseru. |
suupen | 0:5410d6e2bce7 | 228 | * kono kansu wo jiikou suru tabi ni common pin o kirikaeru |
suupen | 0:5410d6e2bce7 | 229 | **************************************/ |
suupen | 0:5410d6e2bce7 | 230 | void SevenSegLed::output(void){ |
suupen | 0:5410d6e2bce7 | 231 | static uint8_t M_seg = 0; |
suupen | 0:5410d6e2bce7 | 232 | |
suupen | 0:5410d6e2bce7 | 233 | if(M_seg >= D_comNull){M_seg = 0;} |
suupen | 0:5410d6e2bce7 | 234 | |
suupen | 0:5410d6e2bce7 | 235 | // com, seg syokika |
suupen | 0:5410d6e2bce7 | 236 | comAllClear(); |
suupen | 0:5410d6e2bce7 | 237 | segAllClear(); |
suupen | 0:5410d6e2bce7 | 238 | |
suupen | 0:5410d6e2bce7 | 239 | |
suupen | 0:5410d6e2bce7 | 240 | |
suupen | 0:5410d6e2bce7 | 241 | // common output |
suupen | 0:5410d6e2bce7 | 242 | if(D_comNull != 0){ |
suupen | 0:5410d6e2bce7 | 243 | // If the terminal output processing |
suupen | 0:5410d6e2bce7 | 244 | switch(M_seg){ |
suupen | 0:5410d6e2bce7 | 245 | case 0: |
suupen | 0:5410d6e2bce7 | 246 | _com_1 = D_commonOn; |
suupen | 0:5410d6e2bce7 | 247 | break; |
suupen | 0:5410d6e2bce7 | 248 | case 1: |
suupen | 0:5410d6e2bce7 | 249 | _com_2 = D_commonOn; |
suupen | 0:5410d6e2bce7 | 250 | break; |
suupen | 0:5410d6e2bce7 | 251 | case 2: |
suupen | 0:5410d6e2bce7 | 252 | _com_3 = D_commonOn; |
suupen | 0:5410d6e2bce7 | 253 | break; |
suupen | 0:5410d6e2bce7 | 254 | case 3: |
suupen | 0:5410d6e2bce7 | 255 | _com_4 = D_commonOn; |
suupen | 0:5410d6e2bce7 | 256 | break; |
suupen | 0:5410d6e2bce7 | 257 | default: |
suupen | 0:5410d6e2bce7 | 258 | break; |
suupen | 0:5410d6e2bce7 | 259 | } |
suupen | 0:5410d6e2bce7 | 260 | } |
suupen | 0:5410d6e2bce7 | 261 | |
suupen | 0:5410d6e2bce7 | 262 | // segmant output |
suupen | 0:5410d6e2bce7 | 263 | if(M_seg < Z_ketaSuu){ |
suupen | 0:5410d6e2bce7 | 264 | segDataSet(M_seg); |
suupen | 0:5410d6e2bce7 | 265 | } |
suupen | 0:5410d6e2bce7 | 266 | |
suupen | 0:5410d6e2bce7 | 267 | |
suupen | 0:5410d6e2bce7 | 268 | // com, seg syokika |
suupen | 0:5410d6e2bce7 | 269 | comAllClear(); |
suupen | 0:5410d6e2bce7 | 270 | segAllClear(); |
suupen | 0:5410d6e2bce7 | 271 | M_seg++; |
suupen | 0:5410d6e2bce7 | 272 | } |