Advertisement
Guest User

Untitled

a guest
Sep 17th, 2019
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.54 KB | None | 0 0
  1. #include <Arduino.h>
  2.  
  3. #define C 0
  4. #define D 1
  5. #define E 2
  6. #define Db 3
  7. #define Eb 4
  8.  
  9. // Mux control pins
  10. const int MUX0_S0 = 0;
  11. const int MUX0_S1 = 1;
  12. const int MUX0_S2 = 2;
  13. const int MUX0_S3 = 3;
  14.  
  15. const int MUX_CHN[16][4] = {
  16.     {0, 0, 0, 0}, // channel 0
  17.     {1, 0, 0, 0}, // channel 1
  18.     {0, 1, 0, 0}, // channel 2
  19.     {1, 1, 0, 0}, // channel 3
  20.     {0, 0, 1, 0}, // channel 4
  21.     {1, 0, 1, 0}, // channel 5
  22.     {0, 1, 1, 0}, // channel 6
  23.     {1, 1, 1, 0}, // channel 7
  24.     {0, 0, 0, 1}, // channel 8
  25.     {1, 0, 0, 1}, // channel 9
  26.     {0, 1, 0, 1}, // channel 10
  27.     {1, 1, 0, 1}, // channel 11
  28.     {0, 0, 1, 1}, // channel 12
  29.     {1, 0, 1, 1}, // channel 13
  30.     {0, 1, 1, 1}, // channel 14
  31.     {1, 1, 1, 1}  // channel 15
  32. };
  33.  
  34. // Keyboard
  35. const int KEY_R0 = 15;
  36. const int KEY_R1 = 16;
  37.  
  38. // key #, pressed?
  39. int keys[5][2] = {{C, 0}, {D, 0}, {E, 0}, {Db, 0}, {Eb, 0}};
  40.  
  41. String keyNames[5] = {
  42.     "C",
  43.     "D",
  44.     "E",
  45.     "Db",
  46.     "Eb"
  47. };
  48.  
  49. void setup() {
  50.   pinMode(MUX0_S0, OUTPUT);
  51.   pinMode(MUX0_S1, OUTPUT);
  52.   pinMode(MUX0_S2, OUTPUT);
  53.   pinMode(MUX0_S3, OUTPUT);
  54.  
  55.   digitalWrite(MUX0_S0, LOW);
  56.   digitalWrite(MUX0_S1, LOW);
  57.   digitalWrite(MUX0_S2, LOW);
  58.   digitalWrite(MUX0_S3, LOW);
  59.  
  60.   pinMode(KEY_R0, INPUT_PULLDOWN);
  61.   pinMode(KEY_R1, INPUT_PULLDOWN);
  62.  
  63.   Serial.begin(115200);
  64. }
  65.  
  66. // in the future, Mux should be turned into a class,
  67. // where, say, Mux1.readMux() would call this method
  68. void setMux(int channel) {
  69.   int controlPin[] = {MUX0_S0, MUX0_S1, MUX0_S2, MUX0_S3};
  70.   // loop through the 4 sig
  71.   for (int i = 0; i < 4; i++) {
  72.     digitalWrite(controlPin[i], MUX_CHN[channel][i]);
  73.   }
  74. }
  75.  
  76. void toggleKey(int key, int state) {
  77.   if (keys[key][1] != state) {
  78.     keys[key][1] = state;
  79.     if (state == 1) {
  80.       Serial.print("Key ");
  81.       Serial.print(keyNames[key]);
  82.       Serial.println(" pressed.");
  83.     } else {
  84.       Serial.print("Key ");
  85.       Serial.print(keyNames[key]);
  86.       Serial.println(" released.");
  87.     }
  88.   }
  89. }
  90.  
  91. void loop() {
  92.  
  93.     // select each mux line so far connected
  94.   for (int i = 0; i < 3; i++) {
  95.     delay(10);
  96.     setMux(i); // set the current line (col), 0-2
  97.  
  98.         // read pins connected to uC
  99.     int row0 = digitalRead(KEY_R0); // read row_0
  100.     int row1 = digitalRead(KEY_R1); // read row_1
  101.  
  102.         // picture the first five-note cluster of a keyboard.
  103.     if (i == 0) {
  104.       toggleKey(E, row1);
  105.     } else if (i == 1) {
  106.       toggleKey(Eb, row0);
  107.       toggleKey(D, row1);
  108.     } else if (i == 2) {
  109.       toggleKey(Db, row0);
  110.       toggleKey(C, row1);
  111.     }
  112.   }
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement