simple button-only gamepad project where a Pro Mini is built into the gamepad case and sends keys over UART

main.c 1.7KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include <avr/io.h> // register definitions
  2. #include <avr/pgmspace.h> // storing data in program memory
  3. #include <avr/interrupt.h> // interrupt vectors
  4. #include <util/delay.h> // delay functions
  5. #include <stdint.h>
  6. #include <stdbool.h>
  7. // Include stuff from the library
  8. #include "lib/iopins.h"
  9. #include "lib/usart.h"
  10. #include "lib/debounce.h"
  11. /* uppercase key names */
  12. static const char names[] = {
  13. 'L', // 2
  14. 'U', // 3
  15. 'R', // 4
  16. 'D', // 5
  17. 'I', // 6
  18. 'J', // 7
  19. 'K', // 8
  20. 'X', // 9
  21. 'B', // 10
  22. 'A', // 11
  23. 'Y', // 12
  24. };
  25. /* nr of keys down */
  26. uint8_t down = 0;
  27. static void pin_change_handler(uint8_t n, bool state)
  28. {
  29. char c = names[n];
  30. if (!state) {
  31. c += 32; // lowecase
  32. }
  33. if (state) {
  34. down++;
  35. } else {
  36. down--;
  37. }
  38. pin_set(9, (bool)(down > 0));
  39. usart_tx((uint8_t) c);
  40. }
  41. static void hw_init(void)
  42. {
  43. usart_init(BAUD_115200);
  44. as_input_pu(2);
  45. as_input_pu(3);
  46. as_input_pu(4);
  47. as_input_pu(5);
  48. as_input_pu(6);
  49. as_input_pu(7);
  50. as_input_pu(8);
  51. // 9 - LED
  52. as_output(9); // front LED
  53. as_output(13); // LED on pro mini
  54. as_input_pu(10);
  55. as_input_pu(11);
  56. as_input_pu(12);
  57. as_input_pu(14);
  58. // cant use loop because macros
  59. debo_add(2, true, pin_change_handler);
  60. debo_add(3, true, pin_change_handler);
  61. debo_add(4, true, pin_change_handler);
  62. debo_add(5, true, pin_change_handler);
  63. debo_add(6, true, pin_change_handler);
  64. debo_add(7, true, pin_change_handler);
  65. debo_add(8, true, pin_change_handler);
  66. debo_add(14, true, pin_change_handler);
  67. debo_add(10, true, pin_change_handler);
  68. debo_add(11, true, pin_change_handler);
  69. debo_add(12, true, pin_change_handler);
  70. }
  71. void main(void)
  72. {
  73. hw_init();
  74. int cnt = 0;
  75. while (1) {
  76. _delay_ms(1);
  77. debo_tick();
  78. }
  79. }