This example shows the use of the 'Pins' (edge connector) and the DAL to make a logic gate simulator from a micro:bit - many of these can be wired together to create logic networks. This is a one-way translation of the microbit-samples repository on GitHub. Please don't try to push changes here, instead push them to the source repo at https://github.com/lancaster-university/microbit-samples

Dependencies:   microbit

Committer:
LancasterUniversity
Date:
Wed Jul 13 16:04:11 2016 +0100
Revision:
0:cc5dce044f55
Update to git: v2.0.0-rc4-5-g115d5a8

Who changed what in which revision?

UserRevisionLine numberNew contents of line
LancasterUniversity 0:cc5dce044f55 1 /*
LancasterUniversity 0:cc5dce044f55 2 The MIT License (MIT)
LancasterUniversity 0:cc5dce044f55 3
LancasterUniversity 0:cc5dce044f55 4 Copyright (c) 2016 British Broadcasting Corporation.
LancasterUniversity 0:cc5dce044f55 5 This software is provided by Lancaster University by arrangement with the BBC.
LancasterUniversity 0:cc5dce044f55 6
LancasterUniversity 0:cc5dce044f55 7 Permission is hereby granted, free of charge, to any person obtaining a
LancasterUniversity 0:cc5dce044f55 8 copy of this software and associated documentation files (the "Software"),
LancasterUniversity 0:cc5dce044f55 9 to deal in the Software without restriction, including without limitation
LancasterUniversity 0:cc5dce044f55 10 the rights to use, copy, modify, merge, publish, distribute, sublicense,
LancasterUniversity 0:cc5dce044f55 11 and/or sell copies of the Software, and to permit persons to whom the
LancasterUniversity 0:cc5dce044f55 12 Software is furnished to do so, subject to the following conditions:
LancasterUniversity 0:cc5dce044f55 13
LancasterUniversity 0:cc5dce044f55 14 The above copyright notice and this permission notice shall be included in
LancasterUniversity 0:cc5dce044f55 15 all copies or substantial portions of the Software.
LancasterUniversity 0:cc5dce044f55 16
LancasterUniversity 0:cc5dce044f55 17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
LancasterUniversity 0:cc5dce044f55 18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
LancasterUniversity 0:cc5dce044f55 19 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
LancasterUniversity 0:cc5dce044f55 20 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LancasterUniversity 0:cc5dce044f55 21 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
LancasterUniversity 0:cc5dce044f55 22 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
LancasterUniversity 0:cc5dce044f55 23 DEALINGS IN THE SOFTWARE.
LancasterUniversity 0:cc5dce044f55 24 */
LancasterUniversity 0:cc5dce044f55 25
LancasterUniversity 0:cc5dce044f55 26 #include "MicroBit.h"
LancasterUniversity 0:cc5dce044f55 27
LancasterUniversity 0:cc5dce044f55 28 #define LOGIC_MODE_NOT 1
LancasterUniversity 0:cc5dce044f55 29 #define LOGIC_MODE_AND 2
LancasterUniversity 0:cc5dce044f55 30 #define LOGIC_MODE_OR 3
LancasterUniversity 0:cc5dce044f55 31 #define LOGIC_MODE_OUTPUT 4
LancasterUniversity 0:cc5dce044f55 32
LancasterUniversity 0:cc5dce044f55 33 #define LOGIC_MODE_MIN 1
LancasterUniversity 0:cc5dce044f55 34 #define LOGIC_MODE_MAX 4
LancasterUniversity 0:cc5dce044f55 35
LancasterUniversity 0:cc5dce044f55 36 #define TOOL_SELECT_DELAY 1000
LancasterUniversity 0:cc5dce044f55 37
LancasterUniversity 0:cc5dce044f55 38 MicroBit uBit;
LancasterUniversity 0:cc5dce044f55 39
LancasterUniversity 0:cc5dce044f55 40 MicroBitImage NOT("\
LancasterUniversity 0:cc5dce044f55 41 0 0 1 0 0\n\
LancasterUniversity 0:cc5dce044f55 42 0 0 1 1 0\n\
LancasterUniversity 0:cc5dce044f55 43 1 1 1 1 1\n\
LancasterUniversity 0:cc5dce044f55 44 0 0 1 1 0\n\
LancasterUniversity 0:cc5dce044f55 45 0 0 1 0 0\n");
LancasterUniversity 0:cc5dce044f55 46
LancasterUniversity 0:cc5dce044f55 47 MicroBitImage AND("\
LancasterUniversity 0:cc5dce044f55 48 0 0 1 1 0\n\
LancasterUniversity 0:cc5dce044f55 49 1 1 1 1 1\n\
LancasterUniversity 0:cc5dce044f55 50 0 0 1 1 1\n\
LancasterUniversity 0:cc5dce044f55 51 1 1 1 1 1\n\
LancasterUniversity 0:cc5dce044f55 52 0 0 1 1 0\n");
LancasterUniversity 0:cc5dce044f55 53
LancasterUniversity 0:cc5dce044f55 54 MicroBitImage OR("\
LancasterUniversity 0:cc5dce044f55 55 0 0 0 1 0\n\
LancasterUniversity 0:cc5dce044f55 56 1 1 1 1 1\n\
LancasterUniversity 0:cc5dce044f55 57 0 0 0 1 1\n\
LancasterUniversity 0:cc5dce044f55 58 1 1 1 1 1\n\
LancasterUniversity 0:cc5dce044f55 59 0 0 0 1 0\n");
LancasterUniversity 0:cc5dce044f55 60
LancasterUniversity 0:cc5dce044f55 61 MicroBitImage OUTPUT_ON("\
LancasterUniversity 0:cc5dce044f55 62 0 1 1 1 0\n\
LancasterUniversity 0:cc5dce044f55 63 1 1 1 1 1\n\
LancasterUniversity 0:cc5dce044f55 64 1 1 1 1 1\n\
LancasterUniversity 0:cc5dce044f55 65 1 1 1 1 1\n\
LancasterUniversity 0:cc5dce044f55 66 0 1 1 1 0\n");
LancasterUniversity 0:cc5dce044f55 67
LancasterUniversity 0:cc5dce044f55 68 MicroBitImage OUTPUT_OFF("\
LancasterUniversity 0:cc5dce044f55 69 0 1 1 1 0\n\
LancasterUniversity 0:cc5dce044f55 70 1 0 0 0 1\n\
LancasterUniversity 0:cc5dce044f55 71 1 0 0 0 1\n\
LancasterUniversity 0:cc5dce044f55 72 1 0 0 0 1\n\
LancasterUniversity 0:cc5dce044f55 73 0 1 1 1 0\n");
LancasterUniversity 0:cc5dce044f55 74
LancasterUniversity 0:cc5dce044f55 75 int mode = LOGIC_MODE_NOT;
LancasterUniversity 0:cc5dce044f55 76
LancasterUniversity 0:cc5dce044f55 77 void onShake(MicroBitEvent)
LancasterUniversity 0:cc5dce044f55 78 {
LancasterUniversity 0:cc5dce044f55 79 // The micro:bit has been shaken, so move on to the next logic gate.
LancasterUniversity 0:cc5dce044f55 80 mode++;
LancasterUniversity 0:cc5dce044f55 81
LancasterUniversity 0:cc5dce044f55 82 // Wrap back to the start if necessary.
LancasterUniversity 0:cc5dce044f55 83 if (mode > LOGIC_MODE_MAX)
LancasterUniversity 0:cc5dce044f55 84 mode = LOGIC_MODE_MIN;
LancasterUniversity 0:cc5dce044f55 85
LancasterUniversity 0:cc5dce044f55 86 // Update the display to
LancasterUniversity 0:cc5dce044f55 87 switch (mode)
LancasterUniversity 0:cc5dce044f55 88 {
LancasterUniversity 0:cc5dce044f55 89 case LOGIC_MODE_NOT:
LancasterUniversity 0:cc5dce044f55 90 uBit.display.print(NOT);
LancasterUniversity 0:cc5dce044f55 91 break;
LancasterUniversity 0:cc5dce044f55 92
LancasterUniversity 0:cc5dce044f55 93 case LOGIC_MODE_AND:
LancasterUniversity 0:cc5dce044f55 94 uBit.display.print(AND);
LancasterUniversity 0:cc5dce044f55 95 break;
LancasterUniversity 0:cc5dce044f55 96
LancasterUniversity 0:cc5dce044f55 97 case LOGIC_MODE_OR:
LancasterUniversity 0:cc5dce044f55 98 uBit.display.print(OR);
LancasterUniversity 0:cc5dce044f55 99 break;
LancasterUniversity 0:cc5dce044f55 100
LancasterUniversity 0:cc5dce044f55 101 case LOGIC_MODE_OUTPUT:
LancasterUniversity 0:cc5dce044f55 102 uBit.display.print(OUTPUT_OFF);
LancasterUniversity 0:cc5dce044f55 103 break;
LancasterUniversity 0:cc5dce044f55 104 }
LancasterUniversity 0:cc5dce044f55 105 }
LancasterUniversity 0:cc5dce044f55 106
LancasterUniversity 0:cc5dce044f55 107 int main()
LancasterUniversity 0:cc5dce044f55 108 {
LancasterUniversity 0:cc5dce044f55 109 // Initialise the micro:bit runtime.
LancasterUniversity 0:cc5dce044f55 110 uBit.init();
LancasterUniversity 0:cc5dce044f55 111
LancasterUniversity 0:cc5dce044f55 112 // Register to receive events when the micro:bit is shaken.
LancasterUniversity 0:cc5dce044f55 113 uBit.messageBus.listen(MICROBIT_ID_GESTURE, MICROBIT_ACCELEROMETER_EVT_SHAKE, onShake);
LancasterUniversity 0:cc5dce044f55 114
LancasterUniversity 0:cc5dce044f55 115 //
LancasterUniversity 0:cc5dce044f55 116 // Create a simple logic gate simulator, using the P0, P1 and P2 pins.
LancasterUniversity 0:cc5dce044f55 117 // The micro:bit can then be configured as an NOT / AND / OR gate, by shaking the device.
LancasterUniversity 0:cc5dce044f55 118 //
LancasterUniversity 0:cc5dce044f55 119 int output = 0;
LancasterUniversity 0:cc5dce044f55 120
LancasterUniversity 0:cc5dce044f55 121 // Our icons are drawn left to right, so rotate the display so the outputs point at the pins on the edge connector. :-)
LancasterUniversity 0:cc5dce044f55 122 uBit.display.rotateTo(MICROBIT_DISPLAY_ROTATION_270);
LancasterUniversity 0:cc5dce044f55 123
LancasterUniversity 0:cc5dce044f55 124 while (1)
LancasterUniversity 0:cc5dce044f55 125 {
LancasterUniversity 0:cc5dce044f55 126 // Check inputs and update outputs accordingly.
LancasterUniversity 0:cc5dce044f55 127 switch (mode)
LancasterUniversity 0:cc5dce044f55 128 {
LancasterUniversity 0:cc5dce044f55 129 int o1;
LancasterUniversity 0:cc5dce044f55 130 int o2;
LancasterUniversity 0:cc5dce044f55 131
LancasterUniversity 0:cc5dce044f55 132 case LOGIC_MODE_NOT:
LancasterUniversity 0:cc5dce044f55 133 output = uBit.buttonA.isPressed() ? 0 : !uBit.io.P0.getDigitalValue();
LancasterUniversity 0:cc5dce044f55 134 uBit.display.print(NOT);
LancasterUniversity 0:cc5dce044f55 135 break;
LancasterUniversity 0:cc5dce044f55 136
LancasterUniversity 0:cc5dce044f55 137 case LOGIC_MODE_AND:
LancasterUniversity 0:cc5dce044f55 138 o1 = uBit.buttonA.isPressed() || uBit.io.P0.getDigitalValue();
LancasterUniversity 0:cc5dce044f55 139 o2 = uBit.buttonB.isPressed() || uBit.io.P1.getDigitalValue();
LancasterUniversity 0:cc5dce044f55 140 output = o1 && o2;
LancasterUniversity 0:cc5dce044f55 141 break;
LancasterUniversity 0:cc5dce044f55 142
LancasterUniversity 0:cc5dce044f55 143 case LOGIC_MODE_OR:
LancasterUniversity 0:cc5dce044f55 144 output = uBit.buttonA.isPressed() || uBit.io.P0.getDigitalValue() || uBit.buttonB.isPressed() || uBit.io.P1.getDigitalValue();
LancasterUniversity 0:cc5dce044f55 145 break;
LancasterUniversity 0:cc5dce044f55 146
LancasterUniversity 0:cc5dce044f55 147 case LOGIC_MODE_OUTPUT:
LancasterUniversity 0:cc5dce044f55 148 if (uBit.io.P0.getDigitalValue())
LancasterUniversity 0:cc5dce044f55 149 uBit.display.print(OUTPUT_ON);
LancasterUniversity 0:cc5dce044f55 150 else
LancasterUniversity 0:cc5dce044f55 151 uBit.display.print(OUTPUT_OFF);
LancasterUniversity 0:cc5dce044f55 152
LancasterUniversity 0:cc5dce044f55 153 output = 0;
LancasterUniversity 0:cc5dce044f55 154 break;
LancasterUniversity 0:cc5dce044f55 155 }
LancasterUniversity 0:cc5dce044f55 156
LancasterUniversity 0:cc5dce044f55 157 // Update output pin value
LancasterUniversity 0:cc5dce044f55 158 uBit.io.P2.setDigitalValue(output);
LancasterUniversity 0:cc5dce044f55 159
LancasterUniversity 0:cc5dce044f55 160 // Perform a power efficient sleep for a little while. No need to run too quickly!
LancasterUniversity 0:cc5dce044f55 161 uBit.sleep(1000);
LancasterUniversity 0:cc5dce044f55 162 }
LancasterUniversity 0:cc5dce044f55 163 }
LancasterUniversity 0:cc5dce044f55 164