A library to drive the Grove Circular LED by Seeed Studio: https://www.seeedstudio.com/Grove-Circular-LED-p-1353.html

Dependents:   Seeed_Grove_Circular_LED

Fork of LED_Bar by Seeed

Committer:
mochen
Date:
Fri Jun 16 16:09:25 2017 +0000
Revision:
1:30d1850db92a
Parent:
LED_Bar.cpp@0:edcb13b58b4f
Initial commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:edcb13b58b4f 1 /*
mochen 1:30d1850db92a 2 Circular LED library V1.0
screamer 0:edcb13b58b4f 3 2010 Copyright (c) Seeed Technology Inc. All right reserved.
screamer 0:edcb13b58b4f 4
screamer 0:edcb13b58b4f 5 Original Author: LG
screamer 0:edcb13b58b4f 6
screamer 0:edcb13b58b4f 7 Modify: Mihail Stoyanov (mihail.stoyanov@arm.com) for ARM mbed, 2014-07-30
mochen 1:30d1850db92a 8 Modify: Mo Chen (mo.chen@arm.com) for ARM mbed, 2017-06-16
screamer 0:edcb13b58b4f 9 User can choose which Io to be used.
screamer 0:edcb13b58b4f 10 This library is free software; you can redistribute it and/or
screamer 0:edcb13b58b4f 11 modify it under the terms of the GNU Lesser General Public
screamer 0:edcb13b58b4f 12 License as published by the Free Software Foundation; either
screamer 0:edcb13b58b4f 13 version 2.1 of the License, or (at your option) any later version.
screamer 0:edcb13b58b4f 14
screamer 0:edcb13b58b4f 15 This library is distributed in the hope that it will be useful,
screamer 0:edcb13b58b4f 16 but WITHOUT ANY WARRANTY; without even the implied warranty of
screamer 0:edcb13b58b4f 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
screamer 0:edcb13b58b4f 18 Lesser General Public License for more details.
screamer 0:edcb13b58b4f 19
screamer 0:edcb13b58b4f 20 You should have received a copy of the GNU Lesser General Public
screamer 0:edcb13b58b4f 21 License along with this library; if not, write to the Free Software
screamer 0:edcb13b58b4f 22 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
screamer 0:edcb13b58b4f 23 */
screamer 0:edcb13b58b4f 24
mochen 1:30d1850db92a 25 #include "Circular_LED.h"
screamer 0:edcb13b58b4f 26
mochen 1:30d1850db92a 27 Circular_LED::Circular_LED(PinName pinClk, PinName pinDta) : __pinClk(pinClk), __pinDta(pinDta)
screamer 0:edcb13b58b4f 28 {
screamer 0:edcb13b58b4f 29 __led_state = 0x00;
screamer 0:edcb13b58b4f 30 }
screamer 0:edcb13b58b4f 31
mochen 1:30d1850db92a 32 void Circular_LED::latchData()
screamer 0:edcb13b58b4f 33 {
screamer 0:edcb13b58b4f 34 __pinDta = 0;
screamer 0:edcb13b58b4f 35 wait_us(10);
screamer 0:edcb13b58b4f 36
mochen 1:30d1850db92a 37 for(int i = 0; i < 4; i++) {
screamer 0:edcb13b58b4f 38 __pinDta = 1;
screamer 0:edcb13b58b4f 39 __pinDta = 0;
screamer 0:edcb13b58b4f 40 }
screamer 0:edcb13b58b4f 41
screamer 0:edcb13b58b4f 42 }
screamer 0:edcb13b58b4f 43
mochen 1:30d1850db92a 44 void Circular_LED::send16bitData(uint16_t data)
screamer 0:edcb13b58b4f 45 {
mochen 1:30d1850db92a 46 for(int i = 0; i < 16; i++) {
screamer 0:edcb13b58b4f 47 unsigned int state = data & 0x8000 ? 1 : 0;
screamer 0:edcb13b58b4f 48 __pinDta = state;
screamer 0:edcb13b58b4f 49
mochen 1:30d1850db92a 50 __pinClk = !__pinClk;
mochen 1:30d1850db92a 51 // state = __pinClk ? 0 : 1;
mochen 1:30d1850db92a 52 // __pinClk = state;
screamer 0:edcb13b58b4f 53
screamer 0:edcb13b58b4f 54 data <<= 1;
screamer 0:edcb13b58b4f 55 }
screamer 0:edcb13b58b4f 56 }
screamer 0:edcb13b58b4f 57
mochen 1:30d1850db92a 58 void Circular_LED::setState(uint32_t state)
screamer 0:edcb13b58b4f 59 {
mochen 1:30d1850db92a 60 uint16_t st;
mochen 1:30d1850db92a 61
mochen 1:30d1850db92a 62 __led_state = state;
screamer 0:edcb13b58b4f 63 send16bitData(CMDMODE);
screamer 0:edcb13b58b4f 64
mochen 1:30d1850db92a 65 for (int i = 0; i < 12; i++) {
mochen 1:30d1850db92a 66 st = (state & 0x0001) ? ON : SHUT;
mochen 1:30d1850db92a 67 send16bitData(st);
mochen 1:30d1850db92a 68 state = state>>1;
mochen 1:30d1850db92a 69 }
mochen 1:30d1850db92a 70
mochen 1:30d1850db92a 71 send16bitData(CMDMODE);
mochen 1:30d1850db92a 72
mochen 1:30d1850db92a 73 for (int i = 12; i < 24; i++) {
mochen 1:30d1850db92a 74 st = (state & 0x0001) ? ON : SHUT;
mochen 1:30d1850db92a 75 send16bitData(st);
mochen 1:30d1850db92a 76 state = state >> 1;
screamer 0:edcb13b58b4f 77 }
screamer 0:edcb13b58b4f 78
screamer 0:edcb13b58b4f 79 latchData();
screamer 0:edcb13b58b4f 80 }
screamer 0:edcb13b58b4f 81
mochen 1:30d1850db92a 82 void Circular_LED::setLevel(uint8_t level)
screamer 0:edcb13b58b4f 83 {
screamer 0:edcb13b58b4f 84
mochen 1:30d1850db92a 85 if (level > 24) {
mochen 1:30d1850db92a 86 return;
mochen 1:30d1850db92a 87 }
mochen 1:30d1850db92a 88
mochen 1:30d1850db92a 89 for (int i = 0; i < 24; i++) {
mochen 1:30d1850db92a 90 // Set state bit for each LED
mochen 1:30d1850db92a 91 bool st = (i < level);
mochen 1:30d1850db92a 92 __led_state = st ? (__led_state | (0x01 << i)) : (__led_state & ~(0x01 << i));
screamer 0:edcb13b58b4f 93 }
screamer 0:edcb13b58b4f 94
mochen 1:30d1850db92a 95 setState(__led_state);
screamer 0:edcb13b58b4f 96 }
screamer 0:edcb13b58b4f 97
mochen 1:30d1850db92a 98 void Circular_LED::setSingleLed(uint8_t num, bool st)
screamer 0:edcb13b58b4f 99 {
mochen 1:30d1850db92a 100 if (num > 23) {
mochen 1:30d1850db92a 101 return;
mochen 1:30d1850db92a 102 }
mochen 1:30d1850db92a 103
screamer 0:edcb13b58b4f 104 __led_state = st ? (__led_state | (0x01<<num)) : (__led_state & ~(0x01<<num));
mochen 1:30d1850db92a 105 setState(__led_state);
screamer 0:edcb13b58b4f 106 }