Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:e095b8164c7a, 2012-02-09 (annotated)
- Committer:
- kentasaito
- Date:
- Thu Feb 09 13:47:56 2012 +0000
- Revision:
- 0:e095b8164c7a
First Revision
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| kentasaito | 0:e095b8164c7a | 1 | #include <mbed.h> |
| kentasaito | 0:e095b8164c7a | 2 | |
| kentasaito | 0:e095b8164c7a | 3 | extern "C" void mbed_reset(); |
| kentasaito | 0:e095b8164c7a | 4 | |
| kentasaito | 0:e095b8164c7a | 5 | // Debug |
| kentasaito | 0:e095b8164c7a | 6 | BusOut leds(LED1, LED2, LED3, LED4); |
| kentasaito | 0:e095b8164c7a | 7 | |
| kentasaito | 0:e095b8164c7a | 8 | // Analog Input |
| kentasaito | 0:e095b8164c7a | 9 | AnalogIn analogIn0(p20); |
| kentasaito | 0:e095b8164c7a | 10 | AnalogIn analogIn1(p19); |
| kentasaito | 0:e095b8164c7a | 11 | AnalogIn analogIn2(p17); |
| kentasaito | 0:e095b8164c7a | 12 | |
| kentasaito | 0:e095b8164c7a | 13 | // Input |
| kentasaito | 0:e095b8164c7a | 14 | DigitalIn kb_dat(p9); |
| kentasaito | 0:e095b8164c7a | 15 | DigitalIn kb_clk(p10); |
| kentasaito | 0:e095b8164c7a | 16 | Ticker ps2_ticker; |
| kentasaito | 0:e095b8164c7a | 17 | int wdt = 0; |
| kentasaito | 0:e095b8164c7a | 18 | int bit = 0; |
| kentasaito | 0:e095b8164c7a | 19 | int val = 0; |
| kentasaito | 0:e095b8164c7a | 20 | int ignore = 0; |
| kentasaito | 0:e095b8164c7a | 21 | unsigned ks[256]; |
| kentasaito | 0:e095b8164c7a | 22 | |
| kentasaito | 0:e095b8164c7a | 23 | // Output |
| kentasaito | 0:e095b8164c7a | 24 | SPI spi(p11, p12, p13); |
| kentasaito | 0:e095b8164c7a | 25 | DigitalOut lrck(p14); |
| kentasaito | 0:e095b8164c7a | 26 | Ticker ticker; |
| kentasaito | 0:e095b8164c7a | 27 | unsigned *freqs = (unsigned *)calloc(127, sizeof(unsigned)); // Frequencies Of Each Keys |
| kentasaito | 0:e095b8164c7a | 28 | int amp = 0x00; |
| kentasaito | 0:e095b8164c7a | 29 | int da = 1; |
| kentasaito | 0:e095b8164c7a | 30 | int sweep = 0; |
| kentasaito | 0:e095b8164c7a | 31 | int fs; |
| kentasaito | 0:e095b8164c7a | 32 | int f; |
| kentasaito | 0:e095b8164c7a | 33 | int count = 0; |
| kentasaito | 0:e095b8164c7a | 34 | |
| kentasaito | 0:e095b8164c7a | 35 | void sampling() { |
| kentasaito | 0:e095b8164c7a | 36 | int outa = amp >> 3; |
| kentasaito | 0:e095b8164c7a | 37 | lrck = 1; |
| kentasaito | 0:e095b8164c7a | 38 | spi.write(outa); |
| kentasaito | 0:e095b8164c7a | 39 | lrck = 0; |
| kentasaito | 0:e095b8164c7a | 40 | spi.write(outa); |
| kentasaito | 0:e095b8164c7a | 41 | amp = -amp; |
| kentasaito | 0:e095b8164c7a | 42 | count++; |
| kentasaito | 0:e095b8164c7a | 43 | if (sweep && count % 4 == 0) { |
| kentasaito | 0:e095b8164c7a | 44 | f -= sweep; |
| kentasaito | 0:e095b8164c7a | 45 | if (f >= 16) ticker.attach_us(&sampling, 327273 / f); |
| kentasaito | 0:e095b8164c7a | 46 | } |
| kentasaito | 0:e095b8164c7a | 47 | } |
| kentasaito | 0:e095b8164c7a | 48 | |
| kentasaito | 0:e095b8164c7a | 49 | void onTicker() { |
| kentasaito | 0:e095b8164c7a | 50 | if (bit) { |
| kentasaito | 0:e095b8164c7a | 51 | if (++wdt >= 10) { |
| kentasaito | 0:e095b8164c7a | 52 | if (val == 0xF0) { |
| kentasaito | 0:e095b8164c7a | 53 | ignore = 1; |
| kentasaito | 0:e095b8164c7a | 54 | } else { |
| kentasaito | 0:e095b8164c7a | 55 | if (!ignore) { |
| kentasaito | 0:e095b8164c7a | 56 | if (freqs[ks[val]]) { |
| kentasaito | 0:e095b8164c7a | 57 | f = freqs[ks[val]]; |
| kentasaito | 0:e095b8164c7a | 58 | amp = analogIn0.read_u16(); |
| kentasaito | 0:e095b8164c7a | 59 | da = (0xFFFF - analogIn1.read_u16()) >> 11; |
| kentasaito | 0:e095b8164c7a | 60 | sweep = analogIn2.read_u16() >> 12; |
| kentasaito | 0:e095b8164c7a | 61 | ticker.attach_us(&sampling, 327273 / f); |
| kentasaito | 0:e095b8164c7a | 62 | leds = ks[val]; |
| kentasaito | 0:e095b8164c7a | 63 | leds = sweep; |
| kentasaito | 0:e095b8164c7a | 64 | } else { |
| kentasaito | 0:e095b8164c7a | 65 | //mbed_reset(); |
| kentasaito | 0:e095b8164c7a | 66 | } |
| kentasaito | 0:e095b8164c7a | 67 | } |
| kentasaito | 0:e095b8164c7a | 68 | ignore = 0; |
| kentasaito | 0:e095b8164c7a | 69 | } |
| kentasaito | 0:e095b8164c7a | 70 | wdt = 0; |
| kentasaito | 0:e095b8164c7a | 71 | bit = 0; |
| kentasaito | 0:e095b8164c7a | 72 | val = 0; |
| kentasaito | 0:e095b8164c7a | 73 | } |
| kentasaito | 0:e095b8164c7a | 74 | } |
| kentasaito | 0:e095b8164c7a | 75 | if (amp > 0) { |
| kentasaito | 0:e095b8164c7a | 76 | amp -= da; |
| kentasaito | 0:e095b8164c7a | 77 | if (amp < 0) amp = 0; |
| kentasaito | 0:e095b8164c7a | 78 | } |
| kentasaito | 0:e095b8164c7a | 79 | } |
| kentasaito | 0:e095b8164c7a | 80 | |
| kentasaito | 0:e095b8164c7a | 81 | void onKbClkFall() { |
| kentasaito | 0:e095b8164c7a | 82 | wdt = 0; |
| kentasaito | 0:e095b8164c7a | 83 | if (bit >= 1 && bit < 9) val += (int)kb_dat << (bit - 1); |
| kentasaito | 0:e095b8164c7a | 84 | bit++; |
| kentasaito | 0:e095b8164c7a | 85 | } |
| kentasaito | 0:e095b8164c7a | 86 | |
| kentasaito | 0:e095b8164c7a | 87 | int main() { |
| kentasaito | 0:e095b8164c7a | 88 | // Output |
| kentasaito | 0:e095b8164c7a | 89 | char *k = "-0987654321[poiuytrewq';lkjhgfdsa /.,mnbvcxz"; // Keyboard Layout |
| kentasaito | 0:e095b8164c7a | 90 | unsigned f0 = 64; // Frequency Of Fundamental Tone |
| kentasaito | 0:e095b8164c7a | 91 | for (int m = 1; m <= 4; m++) { |
| kentasaito | 0:e095b8164c7a | 92 | for (int n = 1; n <= 11; n++) freqs[*k++] = f0 * n; |
| kentasaito | 0:e095b8164c7a | 93 | f0 = f0 * 3 / 4; |
| kentasaito | 0:e095b8164c7a | 94 | } |
| kentasaito | 0:e095b8164c7a | 95 | spi.format(16, 0); |
| kentasaito | 0:e095b8164c7a | 96 | spi.frequency(1600 * 1000); |
| kentasaito | 0:e095b8164c7a | 97 | |
| kentasaito | 0:e095b8164c7a | 98 | // Input |
| kentasaito | 0:e095b8164c7a | 99 | ks[0x4E] = '-'; ks[0x45] = '0'; ks[0x46] = '9'; ks[0x3E] = '8'; ks[0x3D] = '7'; ks[0x36] = '6'; ks[0x2E] = '5'; ks[0x25] = '4'; ks[0x26] = '3'; ks[0x1E] = '2'; ks[0x16] = '1'; |
| kentasaito | 0:e095b8164c7a | 100 | ks[0x54] = '['; ks[0x4D] = 'p'; ks[0x44] = 'o'; ks[0x43] = 'i'; ks[0x3C] = 'u'; ks[0x35] = 'y'; ks[0x2C] = 't'; ks[0x2D] = 'r'; ks[0x24] = 'e'; ks[0x1D] = 'w'; ks[0x15] = 'q'; |
| kentasaito | 0:e095b8164c7a | 101 | ks[0x52] = '\''; ks[0x4C] = ';'; ks[0x4B] = 'l'; ks[0x42] = 'k'; ks[0x3B] = 'j'; ks[0x33] = 'h'; ks[0x34] = 'g'; ks[0x2B] = 'f'; ks[0x23] = 'd'; ks[0x1B] = 's'; ks[0x1C] = 'a'; |
| kentasaito | 0:e095b8164c7a | 102 | ks[0x29] = ' '; ks[0x4A] = '/'; ks[0x49] = '.'; ks[0x41] = ','; ks[0x3A] = 'm'; ks[0x31] = 'n'; ks[0x32] = 'b'; ks[0x2A] = 'v'; ks[0x21] = 'c'; ks[0x22] = 'x'; ks[0x1A] = 'z'; |
| kentasaito | 0:e095b8164c7a | 103 | ps2_ticker.attach_us(&onTicker, 100); |
| kentasaito | 0:e095b8164c7a | 104 | while (1) { |
| kentasaito | 0:e095b8164c7a | 105 | while (kb_clk) ; |
| kentasaito | 0:e095b8164c7a | 106 | onKbClkFall(); |
| kentasaito | 0:e095b8164c7a | 107 | while (!kb_clk) ; |
| kentasaito | 0:e095b8164c7a | 108 | } |
| kentasaito | 0:e095b8164c7a | 109 | } |