Dynamic Lighting Lib. of 7Seg-LED (add DP) x4. Features: - Unified Anode/Cathode and NPN/PNP sw. - Non-use wait(); Useing Interrupt Timer. - Modulates Brightness with PWM. - Display Hex. - Using BusOut(s) of Digits(4) and Segments(8). - Sinmple Interface of Class.

Committer:
AkinoriHashimoto
Date:
Wed Apr 18 09:18:11 2018 +0000
Revision:
1:e89aae394d29
Parent:
0:51d1da4a6b6a
change seg '9'.; d-seg added. (0x67 -> 0x6F)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AkinoriHashimoto 0:51d1da4a6b6a 1 /**
AkinoriHashimoto 0:51d1da4a6b6a 2 * Dynamic Lighting Lib. of 7Seg-LED (add DP) x4.
AkinoriHashimoto 0:51d1da4a6b6a 3 *
AkinoriHashimoto 0:51d1da4a6b6a 4 * Features:
AkinoriHashimoto 0:51d1da4a6b6a 5 * - Unified Anode/Cathode common 7Segs, and NPN/PNP switchings.
AkinoriHashimoto 0:51d1da4a6b6a 6 * - Using BusOut(s) of Digits(0-3) and Segments(A-G,DP).
AkinoriHashimoto 1:e89aae394d29 7 * - Simple Interface of Class.
AkinoriHashimoto 0:51d1da4a6b6a 8 * - Non-use wait(); Useing Interrupt Timer: Ticker and Timeut.
AkinoriHashimoto 0:51d1da4a6b6a 9 * - Modulates Brightness; You Can Control of Periodic-Time and Duty.
AkinoriHashimoto 0:51d1da4a6b6a 10 * - Display Hex(0-9,A-F) of 4 Digit; Using char[4].
AkinoriHashimoto 0:51d1da4a6b6a 11 */
AkinoriHashimoto 0:51d1da4a6b6a 12
AkinoriHashimoto 0:51d1da4a6b6a 13 /** @code
AkinoriHashimoto 0:51d1da4a6b6a 14 #include "mbed.h"
AkinoriHashimoto 0:51d1da4a6b6a 15
AkinoriHashimoto 0:51d1da4a6b6a 16 #include "LED7segX4.h"
AkinoriHashimoto 0:51d1da4a6b6a 17
AkinoriHashimoto 0:51d1da4a6b6a 18 // port make.
AkinoriHashimoto 0:51d1da4a6b6a 19 BusOut pDgit(p21, p22, p23, p24); // D1, D2, D3, D4
AkinoriHashimoto 0:51d1da4a6b6a 20 BusOut pSeg(p11, p12, p13, p14, p15, p16, p17, p18); // A, B, C, D, E, F, G, DP
AkinoriHashimoto 0:51d1da4a6b6a 21
AkinoriHashimoto 0:51d1da4a6b6a 22 // Make instance of 7Seg-class.
AkinoriHashimoto 0:51d1da4a6b6a 23 LED7segX4 led7seg(pDgit, pSeg);
AkinoriHashimoto 0:51d1da4a6b6a 24
AkinoriHashimoto 0:51d1da4a6b6a 25 // for Operation check.
AkinoriHashimoto 0:51d1da4a6b6a 26 DigitalOut myled(LED1);
AkinoriHashimoto 0:51d1da4a6b6a 27
AkinoriHashimoto 0:51d1da4a6b6a 28 int main() {
AkinoriHashimoto 0:51d1da4a6b6a 29
AkinoriHashimoto 0:51d1da4a6b6a 30 char val[4];
AkinoriHashimoto 0:51d1da4a6b6a 31 char dp;
AkinoriHashimoto 0:51d1da4a6b6a 32 int duty;
AkinoriHashimoto 0:51d1da4a6b6a 33
AkinoriHashimoto 0:51d1da4a6b6a 34 // In this case: Anode Common, PNP swiching for Dig-common,
AkinoriHashimoto 0:51d1da4a6b6a 35 // and sink port(BusOut) for seg.
AkinoriHashimoto 0:51d1da4a6b6a 36 led7seg.init(true, true, 1000, 40);
AkinoriHashimoto 0:51d1da4a6b6a 37
AkinoriHashimoto 0:51d1da4a6b6a 38 val[0]= 0;
AkinoriHashimoto 0:51d1da4a6b6a 39 val[1]= 0;
AkinoriHashimoto 0:51d1da4a6b6a 40 val[2]= 0;
AkinoriHashimoto 0:51d1da4a6b6a 41 val[3]= 0;
AkinoriHashimoto 0:51d1da4a6b6a 42
AkinoriHashimoto 0:51d1da4a6b6a 43 led7seg.set7seg(val);
AkinoriHashimoto 0:51d1da4a6b6a 44 led7seg.setDP(0b0001);
AkinoriHashimoto 0:51d1da4a6b6a 45
AkinoriHashimoto 0:51d1da4a6b6a 46 while(true) {
AkinoriHashimoto 0:51d1da4a6b6a 47 myled = !myled;
AkinoriHashimoto 0:51d1da4a6b6a 48 wait_ms(30);
AkinoriHashimoto 0:51d1da4a6b6a 49
AkinoriHashimoto 0:51d1da4a6b6a 50 if(++duty > 100)
AkinoriHashimoto 0:51d1da4a6b6a 51 duty= 30;
AkinoriHashimoto 0:51d1da4a6b6a 52
AkinoriHashimoto 0:51d1da4a6b6a 53 val[3] += 1;
AkinoriHashimoto 0:51d1da4a6b6a 54 for(int i= 0; i < 3; i++){
AkinoriHashimoto 0:51d1da4a6b6a 55 if(val[3-i] > 15){
AkinoriHashimoto 0:51d1da4a6b6a 56 if(i < 3){
AkinoriHashimoto 0:51d1da4a6b6a 57 val[3-i]= 0;
AkinoriHashimoto 0:51d1da4a6b6a 58 val[2-i] += 1;
AkinoriHashimoto 0:51d1da4a6b6a 59 }
AkinoriHashimoto 0:51d1da4a6b6a 60 dp += 1;
AkinoriHashimoto 0:51d1da4a6b6a 61 }
AkinoriHashimoto 0:51d1da4a6b6a 62 }
AkinoriHashimoto 0:51d1da4a6b6a 63 if(val[0]==15 && val[1]==15 && val[2]==15 && val[3]==15){
AkinoriHashimoto 0:51d1da4a6b6a 64 // = FFFF
AkinoriHashimoto 0:51d1da4a6b6a 65 val[0]= 0;
AkinoriHashimoto 0:51d1da4a6b6a 66 val[1]= 0;
AkinoriHashimoto 0:51d1da4a6b6a 67 val[2]= 0;
AkinoriHashimoto 0:51d1da4a6b6a 68 val[3]= 0;
AkinoriHashimoto 0:51d1da4a6b6a 69 }
AkinoriHashimoto 0:51d1da4a6b6a 70 if(dp > 0b1111)
AkinoriHashimoto 0:51d1da4a6b6a 71 dp= 0;
AkinoriHashimoto 0:51d1da4a6b6a 72
AkinoriHashimoto 0:51d1da4a6b6a 73 led7seg.set7seg(val);
AkinoriHashimoto 0:51d1da4a6b6a 74 led7seg.setDP(dp);
AkinoriHashimoto 0:51d1da4a6b6a 75 led7seg.setPWM(1000, duty);
AkinoriHashimoto 0:51d1da4a6b6a 76
AkinoriHashimoto 0:51d1da4a6b6a 77 }
AkinoriHashimoto 0:51d1da4a6b6a 78
AkinoriHashimoto 0:51d1da4a6b6a 79 return 0;
AkinoriHashimoto 0:51d1da4a6b6a 80 }
AkinoriHashimoto 0:51d1da4a6b6a 81 * @endcode
AkinoriHashimoto 0:51d1da4a6b6a 82 */
AkinoriHashimoto 0:51d1da4a6b6a 83
AkinoriHashimoto 0:51d1da4a6b6a 84 #pragma once
AkinoriHashimoto 0:51d1da4a6b6a 85
AkinoriHashimoto 0:51d1da4a6b6a 86 #include "mbed.h"
AkinoriHashimoto 0:51d1da4a6b6a 87
AkinoriHashimoto 0:51d1da4a6b6a 88 class LED7segX4{
AkinoriHashimoto 0:51d1da4a6b6a 89 public:
AkinoriHashimoto 0:51d1da4a6b6a 90
AkinoriHashimoto 0:51d1da4a6b6a 91 /** Constructor
AkinoriHashimoto 0:51d1da4a6b6a 92 * @param BusOut; _portDig: Bus4 of Digit(3~0)
AkinoriHashimoto 0:51d1da4a6b6a 93 * @param BusOut; _portSeg: Bus8 of Segment(a~g+dp)
AkinoriHashimoto 0:51d1da4a6b6a 94 */
AkinoriHashimoto 0:51d1da4a6b6a 95 LED7segX4(BusOut &portDig, BusOut &portSeg);
AkinoriHashimoto 0:51d1da4a6b6a 96
AkinoriHashimoto 0:51d1da4a6b6a 97 ~LED7segX4();
AkinoriHashimoto 0:51d1da4a6b6a 98
AkinoriHashimoto 0:51d1da4a6b6a 99
AkinoriHashimoto 0:51d1da4a6b6a 100 /** Initialize
AkinoriHashimoto 0:51d1da4a6b6a 101 * @param bool; dig: Reverce(H/L) Digit(3~0)
AkinoriHashimoto 0:51d1da4a6b6a 102 * @param bool; seg: Reverce(H/L) Segment(a~g+dp)
AkinoriHashimoto 0:51d1da4a6b6a 103 * @param int; timePeriod[us]: time of priend in PWM.
AkinoriHashimoto 0:51d1da4a6b6a 104 * @param int; duty[%]: duty of PWM.
AkinoriHashimoto 0:51d1da4a6b6a 105 */
AkinoriHashimoto 0:51d1da4a6b6a 106 void init(bool revDig= false, bool revSeg= false, int timePeriod= 1000, int duty= 80);
AkinoriHashimoto 0:51d1da4a6b6a 107
AkinoriHashimoto 0:51d1da4a6b6a 108
AkinoriHashimoto 0:51d1da4a6b6a 109 /** set seg TYPE;
AkinoriHashimoto 0:51d1da4a6b6a 110 * @param bool; dig: Digit(3~0)
AkinoriHashimoto 0:51d1da4a6b6a 111 * @param bool; seg: Segment(a~g+dp)
AkinoriHashimoto 0:51d1da4a6b6a 112 */
AkinoriHashimoto 0:51d1da4a6b6a 113 void setReverse(bool dig, bool seg);
AkinoriHashimoto 0:51d1da4a6b6a 114
AkinoriHashimoto 0:51d1da4a6b6a 115 /** Set 7seg.
AkinoriHashimoto 0:51d1da4a6b6a 116 * @param chr[4]; D3~D1, 0x00(0)~0x15(F) and 0x16(OFF/NULL).
AkinoriHashimoto 0:51d1da4a6b6a 117 */
AkinoriHashimoto 0:51d1da4a6b6a 118 void set7seg(char chr[]);
AkinoriHashimoto 0:51d1da4a6b6a 119
AkinoriHashimoto 0:51d1da4a6b6a 120 /** Set DotPoint.
AkinoriHashimoto 0:51d1da4a6b6a 121 * @param chr; 0b0000~0b1111, bit0~3; TRUE=1.
AkinoriHashimoto 0:51d1da4a6b6a 122 */
AkinoriHashimoto 0:51d1da4a6b6a 123 void setDP(char chr);
AkinoriHashimoto 0:51d1da4a6b6a 124
AkinoriHashimoto 0:51d1da4a6b6a 125 /** Set PWM (Britness).
AkinoriHashimoto 0:51d1da4a6b6a 126 * @param int; periodic time [us]. "for Each Digit."
AkinoriHashimoto 0:51d1da4a6b6a 127 * @param int; duty ratio;1~100[%] in timePeriod.
AkinoriHashimoto 0:51d1da4a6b6a 128 * ex) In case of 1,000us and 60%,
AkinoriHashimoto 0:51d1da4a6b6a 129 */
AkinoriHashimoto 0:51d1da4a6b6a 130 void setPWM(int timePeriod, int duty);
AkinoriHashimoto 0:51d1da4a6b6a 131
AkinoriHashimoto 0:51d1da4a6b6a 132
AkinoriHashimoto 0:51d1da4a6b6a 133
AkinoriHashimoto 0:51d1da4a6b6a 134 private:
AkinoriHashimoto 0:51d1da4a6b6a 135
AkinoriHashimoto 0:51d1da4a6b6a 136 // ********************** Variable ******************************
AkinoriHashimoto 0:51d1da4a6b6a 137
AkinoriHashimoto 0:51d1da4a6b6a 138 // pin/port set
AkinoriHashimoto 0:51d1da4a6b6a 139 BusOut &_portDig;
AkinoriHashimoto 0:51d1da4a6b6a 140 BusOut &_portSeg;
AkinoriHashimoto 0:51d1da4a6b6a 141
AkinoriHashimoto 0:51d1da4a6b6a 142 // TimerIRQ 4 PWM
AkinoriHashimoto 0:51d1da4a6b6a 143 Ticker ticker; // Duty : Bright
AkinoriHashimoto 0:51d1da4a6b6a 144 Timeout timeout; // Duty : OFF
AkinoriHashimoto 0:51d1da4a6b6a 145 float _dutySec; // Duty(Bright) Time-width [s], in 1 period.
AkinoriHashimoto 0:51d1da4a6b6a 146
AkinoriHashimoto 0:51d1da4a6b6a 147 // Define
AkinoriHashimoto 0:51d1da4a6b6a 148 char _def7seg[17]; // Define Segment; 0~f + 16:OFF(Null)
AkinoriHashimoto 0:51d1da4a6b6a 149
AkinoriHashimoto 0:51d1da4a6b6a 150
AkinoriHashimoto 0:51d1da4a6b6a 151 // Local Hold Val
AkinoriHashimoto 0:51d1da4a6b6a 152 char _seg7[5]; // 4+Null ex) 2.3E5 -> 2, 3, 14, 5
AkinoriHashimoto 0:51d1da4a6b6a 153 char _dp; // 0b0000~0b1111; ex) 12.3E. -> 0b0101
AkinoriHashimoto 0:51d1da4a6b6a 154 bool _revDig; // REVERSE H/L 4 Transistor swDigit
AkinoriHashimoto 0:51d1da4a6b6a 155 bool _revSeg; // AND swSeg
AkinoriHashimoto 0:51d1da4a6b6a 156 int _currentDigit; // current digit-Num (0~3). This shifts in timeperiod of PWM.
AkinoriHashimoto 0:51d1da4a6b6a 157
AkinoriHashimoto 0:51d1da4a6b6a 158
AkinoriHashimoto 0:51d1da4a6b6a 159 // ********************** Internal Function *********************
AkinoriHashimoto 0:51d1da4a6b6a 160 void init_def7seg(); // Set/Define of seg pattern.
AkinoriHashimoto 0:51d1da4a6b6a 161
AkinoriHashimoto 0:51d1da4a6b6a 162 // For DUTY of PWM. ON(Shift) and OFF.
AkinoriHashimoto 0:51d1da4a6b6a 163 void OnSet();
AkinoriHashimoto 0:51d1da4a6b6a 164 void OffSet();
AkinoriHashimoto 0:51d1da4a6b6a 165
AkinoriHashimoto 0:51d1da4a6b6a 166 };
AkinoriHashimoto 0:51d1da4a6b6a 167
AkinoriHashimoto 0:51d1da4a6b6a 168 // EOF