suu pen さんのライブラリをフォークしました。 このライブラリは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: HumidifierController_LPC824
Fork of SevenSegLed by
Diff: SevenSegLed.cpp
- Revision:
- 0:5410d6e2bce7
- Child:
- 1:3429249e30f9
diff -r 000000000000 -r 5410d6e2bce7 SevenSegLed.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SevenSegLed.cpp Sun Nov 20 00:22:05 2011 +0000 @@ -0,0 +1,272 @@ +/********************************************************** + +* SevenSegLed.cpp +* dynamic control of seven segment led +* +**********************************************************/ +#define _SEVENSEGLED_C + +#include "types.h" +#include "mbed.h" +#include "SevenSegLed.h" + + + + +/** Create a seven segment led object connected to the specified DigtalOutput pin + */ +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): + _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), + _com_1(com_1), _com_2(com_2), _com_3(com_3), _com_4(com_4){ + + + timer.attach_us(this, &SevenSegLed::segmentGrayDataKosin, 10000); // led smooth control 10ms timer inttruupt + + // data table set of Brightness + // DT_pwmGray[] = i ^ 2 + for(uint32_t i = 0; i < Z_grayMax + 1; i++){ + DT_pwmGray[i] = (uint8_t)(((i * i) * Z_pwmGrayMax ) / (Z_grayMax * Z_grayMax)); + } + + // check connect com_x + D_comNull = Z_ketaSuu; + if(com_4 == NC){D_comNull--;} + if(com_3 == NC){D_comNull--;} + if(com_2 == NC){D_comNull--;} + if(com_1 == NC){D_comNull--;} + + // Those who will be reading the LED display + D_smooth = smooth; + + // common and segment pin display data set + if(commonPole == 0){ + // Anode common + D_commonOn = 1; + D_commonOff = 0; + D_segmentOn = 0; + D_segmentOff = 1; + } + else{ + // Cathod common + D_commonOn = 0; + D_commonOff = 1; + D_segmentOn = 1; + D_segmentOff = 0; + } + +} + + + +/************************************** +* 7segment no gray data kosin +* 100ms goto no syori +**************************************/ +void SevenSegLed::segmentGrayDataKosin(void){ + uint8_t keta; + uint8_t seg; + + uint8_t segMask; + uint8_t segData; + + + //********************************************************* + // 7segment no shuturyoku pattern + //********************************************************* + // seg: a b c d e f g p + // bit: 7 6 5 4 3 2 1 0 + // --------------------- + #define D_0 (0xfc) // 0 1 1 1 1 1 1 0 0 + #define D_1 (0x60) // 1 0 1 1 0 0 0 0 0 + #define D_2 (0xda) // 2 1 1 0 1 1 0 1 0 + #define D_3 (0xf2) // 3 1 1 1 1 0 0 1 0 + #define D_4 (0x66) // 4 0 1 1 0 0 1 1 0 + #define D_5 (0xb6) // 5 1 0 1 1 0 1 1 0 + #define D_6 (0xbe) // 6 1 0 1 1 1 1 1 0 + #define D_7 (0xe4) // 7 1 1 1 0 0 1 0 0 + #define D_8 (0xfe) // 8 1 1 1 1 1 1 1 0 + #define D_9 (0xf6) // 9 1 1 1 1 0 1 1 0 + #define D_A (0xee) // A 1 1 1 0 1 1 1 0 + #define D_b (0x3e) // b 0 0 1 1 1 1 1 0 + #define D_C (0x9c) // C 1 0 0 1 1 1 0 0 + #define D_d (0x7a) // d 0 1 1 1 1 0 1 0 + #define D_E (0x9e) // E 1 0 0 1 1 1 1 0 + #define D_F (0x8e) // F 1 0 0 0 1 1 1 0 + #define D_NULL (0x00) // NULL 0 0 0 0 0 0 0 0 + // (No indication) + + + 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}; + uint8_t work; + + for(keta = 0; keta < Z_ketaSuu; keta++){ + // number data set + work = D_7seg[keta]; + if(work > 0x10){work = 0x10;} // error data then NULL + segData = DT_segData[work]; + + // dot data set + if(D_dot[keta] != 0){segData |= 0x01;} + + // segment data set + segMask = 0x80; + + for(seg = 0; seg < Z_segSuu; seg++){ + if(D_smooth == Z_smooth){ + // LED display Smooth + if((segData & segMask) != 0){ + // segment tento + if(D_7segGray[keta][seg] < Z_grayMax){D_7segGray[keta][seg]++;} + } + else{ + // segment syoto + if(D_7segGray[keta][seg] > 0){D_7segGray[keta][seg]--;} + } + segMask = segMask >> 1; + } + else{ + // LED display Hard + if((segData & segMask) != 0){ + // segment tento + D_7segGray[keta][seg] = Z_pwmGrayMax; + } + else{ + // segment syoto + D_7segGray[keta][seg] = 0; + } + segMask = segMask >> 1; + } + } + } +} + + +/************************************** +* main +**************************************/ +void SevenSegLed::SevenSegLed_main(uint8_t* number, uint8_t* dot) { + + for(uint8_t i = 0; i < Z_ketaSuu; i++){ + D_7seg[i] = number[i]; + D_dot[i] = dot[i]; + } + + + // dynamic shuturyoku shori + output(); +} + + +/************************************** +* comAllClear +* +* common pin o subete OFF suru +**************************************/ +void SevenSegLed::comAllClear(void){ + + switch (D_comNull){ + case 4: // com_1 - com_4 is all connect + _com_4 = D_commonOff; + //break; + case 3: // com_4 Null + _com_3 = D_commonOff; + // break; + case 2: // com_3 Null + _com_2 = D_commonOff; + //break; + case 1: // com_2 Null + _com_1 = D_commonOff; + //break; + case 0: // com_1 Null + // nothing + break; + default: + // nothing + break; + } +} + +/************************************** +* segAllClear +* +* segment pin o subete OFF suru +**************************************/ +void SevenSegLed::segAllClear(void){ + _seg_a = D_segmentOff; + _seg_b = D_segmentOff; + _seg_c = D_segmentOff; + _seg_d = D_segmentOff; + _seg_e = D_segmentOff; + _seg_f = D_segmentOff; + _seg_p = D_segmentOff; +} + +/************************************** +* segDataSet +* +* segment pin ni shuturyoku data o settei +**************************************/ +void SevenSegLed::segDataSet(uint8_t keta){ + + for(uint8_t i = 0; i < Z_pwmGrayMax + 1; i++){ + if(DT_pwmGray[D_7segGray[keta][0]] <= i){_seg_a = D_segmentOff;}else{_seg_a = D_segmentOn;} + if(DT_pwmGray[D_7segGray[keta][1]] <= i){_seg_b = D_segmentOff;}else{_seg_b = D_segmentOn;} + if(DT_pwmGray[D_7segGray[keta][2]] <= i){_seg_c = D_segmentOff;}else{_seg_c = D_segmentOn;} + if(DT_pwmGray[D_7segGray[keta][3]] <= i){_seg_d = D_segmentOff;}else{_seg_d = D_segmentOn;} + if(DT_pwmGray[D_7segGray[keta][4]] <= i){_seg_e = D_segmentOff;}else{_seg_e = D_segmentOn;} + if(DT_pwmGray[D_7segGray[keta][5]] <= i){_seg_f = D_segmentOff;}else{_seg_f = D_segmentOn;} + if(DT_pwmGray[D_7segGray[keta][6]] <= i){_seg_g = D_segmentOff;}else{_seg_g = D_segmentOn;} + if(DT_pwmGray[D_7segGray[keta][7]] <= i){_seg_p = D_segmentOff;}else{_seg_p = D_segmentOn;} + + } +} + +/************************************** +* output +* +* dynamic dosa saseru. +* kono kansu wo jiikou suru tabi ni common pin o kirikaeru +**************************************/ +void SevenSegLed::output(void){ + static uint8_t M_seg = 0; + + if(M_seg >= D_comNull){M_seg = 0;} + + // com, seg syokika + comAllClear(); + segAllClear(); + + + + // common output + if(D_comNull != 0){ + // If the terminal output processing + switch(M_seg){ + case 0: + _com_1 = D_commonOn; + break; + case 1: + _com_2 = D_commonOn; + break; + case 2: + _com_3 = D_commonOn; + break; + case 3: + _com_4 = D_commonOn; + break; + default: + break; + } + } + + // segmant output + if(M_seg < Z_ketaSuu){ + segDataSet(M_seg); + } + + + // com, seg syokika + comAllClear(); + segAllClear(); + M_seg++; +}