Some Dude
/
Shift_brite
A simple program to cycle a chain of shiftbrites through RGB,MCY,W using mbed.
main.cpp@1:8e28c267ff1a, 2011-03-20 (annotated)
- Committer:
- bh27
- Date:
- Sun Mar 20 11:50:18 2011 +0000
- Revision:
- 1:8e28c267ff1a
- Parent:
- 0:0992b23a3b05
- Child:
- 2:62be298c6ab8
v1.1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bh27 | 1:8e28c267ff1a | 1 | // A simple program to cycle a chain of shiftbrites through RGB,MCY,W using mbed. |
bh27 | 1:8e28c267ff1a | 2 | |
bh27 | 1:8e28c267ff1a | 3 | // Shift register code from: http://mbed.org/users/ChriX/notebook/shift-register-function/ |
bh27 | 1:8e28c267ff1a | 4 | // Shiftbrite Arduino code from: http://macetech.com/blog/node/54 |
bh27 | 1:8e28c267ff1a | 5 | |
bh27 | 1:8e28c267ff1a | 6 | // Revision: |
bh27 | 1:8e28c267ff1a | 7 | // v1.0 - 17/03/2011: |
bh27 | 1:8e28c267ff1a | 8 | // v1.1 - 20/03/2011: Separated Current Control from Color Data. |
bh27 | 1:8e28c267ff1a | 9 | // Current_Control() is now a function on it's own which can be put after each color change. |
bh27 | 1:8e28c267ff1a | 10 | // Added Global variable Cur which sets the current control register without having to hunt through the program. |
bh27 | 1:8e28c267ff1a | 11 | |
bh27 | 1:8e28c267ff1a | 12 | #include "mbed.h" |
bh27 | 1:8e28c267ff1a | 13 | |
bh27 | 1:8e28c267ff1a | 14 | DigitalOut datapin(p30); |
bh27 | 1:8e28c267ff1a | 15 | DigitalOut latchpin(p29); |
bh27 | 1:8e28c267ff1a | 16 | DigitalOut enablepin(p28); |
bh27 | 1:8e28c267ff1a | 17 | DigitalOut clockpin(p27); |
bh27 | 1:8e28c267ff1a | 18 | |
bh27 | 1:8e28c267ff1a | 19 | unsigned long SB_CommandPacket; |
bh27 | 1:8e28c267ff1a | 20 | int SB_CommandMode; |
bh27 | 1:8e28c267ff1a | 21 | int SB_BlueCommand; |
bh27 | 1:8e28c267ff1a | 22 | int SB_RedCommand; |
bh27 | 1:8e28c267ff1a | 23 | int SB_GreenCommand; |
bh27 | 1:8e28c267ff1a | 24 | int No_of_shiftbrites = 4; |
bh27 | 1:8e28c267ff1a | 25 | |
bh27 | 1:8e28c267ff1a | 26 | // Set between 0 and 127 |
bh27 | 1:8e28c267ff1a | 27 | int Cur = 31; |
bh27 | 1:8e28c267ff1a | 28 | |
bh27 | 1:8e28c267ff1a | 29 | void shiftOut(DigitalOut data, DigitalOut clk, int sodata) { |
bh27 | 1:8e28c267ff1a | 30 | |
bh27 | 1:8e28c267ff1a | 31 | int i; |
bh27 | 1:8e28c267ff1a | 32 | |
bh27 | 1:8e28c267ff1a | 33 | for (i = 7; i >= 0; i--) { |
bh27 | 1:8e28c267ff1a | 34 | |
bh27 | 1:8e28c267ff1a | 35 | clk = 0; |
bh27 | 1:8e28c267ff1a | 36 | |
bh27 | 1:8e28c267ff1a | 37 | if(sodata & (1 << i)){ |
bh27 | 1:8e28c267ff1a | 38 | data = 1; |
bh27 | 1:8e28c267ff1a | 39 | } else { |
bh27 | 1:8e28c267ff1a | 40 | data = 0; |
bh27 | 1:8e28c267ff1a | 41 | } |
bh27 | 1:8e28c267ff1a | 42 | |
bh27 | 1:8e28c267ff1a | 43 | clk = 1; |
bh27 | 1:8e28c267ff1a | 44 | data = 0; |
bh27 | 1:8e28c267ff1a | 45 | } |
bh27 | 1:8e28c267ff1a | 46 | |
bh27 | 1:8e28c267ff1a | 47 | return; |
bh27 | 1:8e28c267ff1a | 48 | |
bh27 | 1:8e28c267ff1a | 49 | } |
bh27 | 1:8e28c267ff1a | 50 | |
bh27 | 1:8e28c267ff1a | 51 | |
bh27 | 1:8e28c267ff1a | 52 | void SB_SendPacket() { |
bh27 | 1:8e28c267ff1a | 53 | |
bh27 | 1:8e28c267ff1a | 54 | for (int y = No_of_shiftbrites-1; y >= 0; y--) { |
bh27 | 1:8e28c267ff1a | 55 | SB_CommandPacket = SB_CommandMode & 0xB11; |
bh27 | 1:8e28c267ff1a | 56 | SB_CommandPacket = (SB_CommandPacket << 10) | (SB_BlueCommand & 1023); |
bh27 | 1:8e28c267ff1a | 57 | SB_CommandPacket = (SB_CommandPacket << 10) | (SB_RedCommand & 1023); |
bh27 | 1:8e28c267ff1a | 58 | SB_CommandPacket = (SB_CommandPacket << 10) | (SB_GreenCommand & 1023); |
bh27 | 1:8e28c267ff1a | 59 | |
bh27 | 1:8e28c267ff1a | 60 | shiftOut(datapin, clockpin, SB_CommandPacket >> 24); |
bh27 | 1:8e28c267ff1a | 61 | shiftOut(datapin, clockpin, SB_CommandPacket >> 16); |
bh27 | 1:8e28c267ff1a | 62 | shiftOut(datapin, clockpin, SB_CommandPacket >> 8); |
bh27 | 1:8e28c267ff1a | 63 | shiftOut(datapin, clockpin, SB_CommandPacket); |
bh27 | 1:8e28c267ff1a | 64 | |
bh27 | 1:8e28c267ff1a | 65 | |
bh27 | 1:8e28c267ff1a | 66 | wait_ms(1); |
bh27 | 1:8e28c267ff1a | 67 | latchpin = 1; |
bh27 | 1:8e28c267ff1a | 68 | wait_ms(1); |
bh27 | 1:8e28c267ff1a | 69 | latchpin = 0; |
bh27 | 1:8e28c267ff1a | 70 | } |
bh27 | 1:8e28c267ff1a | 71 | |
bh27 | 1:8e28c267ff1a | 72 | return; |
bh27 | 1:8e28c267ff1a | 73 | |
bh27 | 1:8e28c267ff1a | 74 | } |
bh27 | 1:8e28c267ff1a | 75 | |
bh27 | 1:8e28c267ff1a | 76 | void Current_Control() { |
bh27 | 1:8e28c267ff1a | 77 | |
bh27 | 1:8e28c267ff1a | 78 | int Comm = 0xB01; |
bh27 | 1:8e28c267ff1a | 79 | int Cont1 = Cur; |
bh27 | 1:8e28c267ff1a | 80 | int Cont2 = Cur; |
bh27 | 1:8e28c267ff1a | 81 | int Cont3 = Cur; |
bh27 | 1:8e28c267ff1a | 82 | unsigned long CommandPacket; |
bh27 | 1:8e28c267ff1a | 83 | |
bh27 | 1:8e28c267ff1a | 84 | for (int y = No_of_shiftbrites-1; y >= 0; y--) { |
bh27 | 1:8e28c267ff1a | 85 | CommandPacket = Comm & 0xB11; |
bh27 | 1:8e28c267ff1a | 86 | CommandPacket = (CommandPacket << 10) | (Cont1 & 1023); |
bh27 | 1:8e28c267ff1a | 87 | CommandPacket = (CommandPacket << 10) | (Cont2 & 1023); |
bh27 | 1:8e28c267ff1a | 88 | CommandPacket = (CommandPacket << 10) | (Cont3 & 1023); |
bh27 | 1:8e28c267ff1a | 89 | |
bh27 | 1:8e28c267ff1a | 90 | shiftOut(datapin, clockpin, CommandPacket >> 24); |
bh27 | 1:8e28c267ff1a | 91 | shiftOut(datapin, clockpin, CommandPacket >> 16); |
bh27 | 1:8e28c267ff1a | 92 | shiftOut(datapin, clockpin, CommandPacket >> 8); |
bh27 | 1:8e28c267ff1a | 93 | shiftOut(datapin, clockpin, CommandPacket); |
bh27 | 1:8e28c267ff1a | 94 | |
bh27 | 1:8e28c267ff1a | 95 | |
bh27 | 1:8e28c267ff1a | 96 | wait_ms(1); |
bh27 | 1:8e28c267ff1a | 97 | latchpin = 1; |
bh27 | 1:8e28c267ff1a | 98 | wait_ms(1); |
bh27 | 1:8e28c267ff1a | 99 | latchpin = 0; |
bh27 | 1:8e28c267ff1a | 100 | } |
bh27 | 1:8e28c267ff1a | 101 | |
bh27 | 1:8e28c267ff1a | 102 | return; |
bh27 | 1:8e28c267ff1a | 103 | |
bh27 | 1:8e28c267ff1a | 104 | } |
bh27 | 1:8e28c267ff1a | 105 | |
bh27 | 1:8e28c267ff1a | 106 | int main() { |
bh27 | 1:8e28c267ff1a | 107 | while(1) { |
bh27 | 1:8e28c267ff1a | 108 | Current_Control(); |
bh27 | 1:8e28c267ff1a | 109 | |
bh27 | 1:8e28c267ff1a | 110 | // Red |
bh27 | 1:8e28c267ff1a | 111 | SB_CommandMode = 0xB00; |
bh27 | 1:8e28c267ff1a | 112 | SB_RedCommand = 1023; // max = 1023 |
bh27 | 1:8e28c267ff1a | 113 | SB_GreenCommand = 0; |
bh27 | 1:8e28c267ff1a | 114 | SB_BlueCommand = 0; |
bh27 | 1:8e28c267ff1a | 115 | SB_SendPacket(); |
bh27 | 1:8e28c267ff1a | 116 | |
bh27 | 1:8e28c267ff1a | 117 | wait(3); |
bh27 | 1:8e28c267ff1a | 118 | |
bh27 | 1:8e28c267ff1a | 119 | Current_Control(); |
bh27 | 1:8e28c267ff1a | 120 | |
bh27 | 1:8e28c267ff1a | 121 | // Green |
bh27 | 1:8e28c267ff1a | 122 | SB_CommandMode = 0xB00; |
bh27 | 1:8e28c267ff1a | 123 | SB_RedCommand = 0; |
bh27 | 1:8e28c267ff1a | 124 | SB_GreenCommand = 1023; |
bh27 | 1:8e28c267ff1a | 125 | SB_BlueCommand = 0; |
bh27 | 1:8e28c267ff1a | 126 | SB_SendPacket(); |
bh27 | 1:8e28c267ff1a | 127 | |
bh27 | 1:8e28c267ff1a | 128 | wait(3); |
bh27 | 1:8e28c267ff1a | 129 | |
bh27 | 1:8e28c267ff1a | 130 | Current_Control(); |
bh27 | 1:8e28c267ff1a | 131 | |
bh27 | 1:8e28c267ff1a | 132 | // Blue |
bh27 | 1:8e28c267ff1a | 133 | SB_CommandMode = 0xB00; |
bh27 | 1:8e28c267ff1a | 134 | SB_RedCommand = 0; |
bh27 | 1:8e28c267ff1a | 135 | SB_GreenCommand = 0; |
bh27 | 1:8e28c267ff1a | 136 | SB_BlueCommand = 1023; |
bh27 | 1:8e28c267ff1a | 137 | SB_SendPacket(); |
bh27 | 1:8e28c267ff1a | 138 | |
bh27 | 1:8e28c267ff1a | 139 | wait(3); |
bh27 | 1:8e28c267ff1a | 140 | |
bh27 | 1:8e28c267ff1a | 141 | Current_Control(); |
bh27 | 1:8e28c267ff1a | 142 | |
bh27 | 1:8e28c267ff1a | 143 | // Magenta |
bh27 | 1:8e28c267ff1a | 144 | SB_CommandMode = 0xB00; |
bh27 | 1:8e28c267ff1a | 145 | SB_RedCommand = 1023; |
bh27 | 1:8e28c267ff1a | 146 | SB_GreenCommand = 0; |
bh27 | 1:8e28c267ff1a | 147 | SB_BlueCommand = 1023; |
bh27 | 1:8e28c267ff1a | 148 | SB_SendPacket(); |
bh27 | 1:8e28c267ff1a | 149 | |
bh27 | 1:8e28c267ff1a | 150 | wait(3); |
bh27 | 1:8e28c267ff1a | 151 | |
bh27 | 1:8e28c267ff1a | 152 | Current_Control(); |
bh27 | 1:8e28c267ff1a | 153 | |
bh27 | 1:8e28c267ff1a | 154 | // Cyan |
bh27 | 1:8e28c267ff1a | 155 | SB_CommandMode = 0xB00; |
bh27 | 1:8e28c267ff1a | 156 | SB_RedCommand = 0; |
bh27 | 1:8e28c267ff1a | 157 | SB_GreenCommand = 1023; |
bh27 | 1:8e28c267ff1a | 158 | SB_BlueCommand = 1023; |
bh27 | 1:8e28c267ff1a | 159 | SB_SendPacket(); |
bh27 | 1:8e28c267ff1a | 160 | |
bh27 | 1:8e28c267ff1a | 161 | wait(3); |
bh27 | 1:8e28c267ff1a | 162 | |
bh27 | 1:8e28c267ff1a | 163 | Current_Control(); |
bh27 | 1:8e28c267ff1a | 164 | |
bh27 | 1:8e28c267ff1a | 165 | // Yellow |
bh27 | 1:8e28c267ff1a | 166 | SB_CommandMode = 0xB00; |
bh27 | 1:8e28c267ff1a | 167 | SB_RedCommand = 1023; |
bh27 | 1:8e28c267ff1a | 168 | SB_GreenCommand = 1023; |
bh27 | 1:8e28c267ff1a | 169 | SB_BlueCommand = 0; |
bh27 | 1:8e28c267ff1a | 170 | SB_SendPacket(); |
bh27 | 1:8e28c267ff1a | 171 | |
bh27 | 1:8e28c267ff1a | 172 | wait(3); |
bh27 | 1:8e28c267ff1a | 173 | |
bh27 | 1:8e28c267ff1a | 174 | Current_Control(); |
bh27 | 1:8e28c267ff1a | 175 | |
bh27 | 1:8e28c267ff1a | 176 | // White |
bh27 | 1:8e28c267ff1a | 177 | SB_CommandMode = 0xB00; |
bh27 | 1:8e28c267ff1a | 178 | SB_RedCommand = 1023; |
bh27 | 1:8e28c267ff1a | 179 | SB_GreenCommand = 1023; |
bh27 | 1:8e28c267ff1a | 180 | SB_BlueCommand = 1023; |
bh27 | 1:8e28c267ff1a | 181 | SB_SendPacket(); |
bh27 | 1:8e28c267ff1a | 182 | |
bh27 | 1:8e28c267ff1a | 183 | wait(3); |
bh27 | 1:8e28c267ff1a | 184 | } |
bh27 | 1:8e28c267ff1a | 185 | } |