Guest User

Untitled

a guest
Jun 23rd, 2024
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.02 KB | None | 0 0
  1. #include <OLED_I2C.h>
  2.  
  3. #define WIDTH 32 // 64 по умолчанию
  4. #define HEIGHT 22 // 22 по умолчанию
  5.  
  6. #define CELL_STACK_SIZE (int)ceil( (WIDTH*HEIGHT)/8 ) // Количество байт для хранения всех рисуемых ячеек
  7.  
  8. #define DOWN_SHIFT 19 // Сдвиг вниз первой ячейки на пиксели
  9.  
  10. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  11.  
  12. OLED myOLED(A4, A5, A4);
  13.  
  14. uint8_t cell_stack[CELL_STACK_SIZE] = {0}; // Состояние стака из 8 ячеек (вкл/выкл)
  15. byte cell_point[WIDTH*HEIGHT] = {0}; // Количество очков у каждой ячейки
  16.  
  17. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  18.  
  19. bool bit_check(int i) { // Проверка указанного бита по номеру
  20. return cell_stack[ (int)floor(i / 8) ] & 128 >> (i % 8) ;
  21. }
  22.  
  23. void bit_on(int i) { // Поменять бит на 1 по номеру
  24. cell_stack[ (int)floor(i / 8) ] = cell_stack[ (int)floor(i / 8) ] | ( 128 >> (i % 8) );
  25. }
  26.  
  27. void bit_off(int i) { // Поменять бит на 0 по номеру
  28. cell_stack[ (int)floor(i / 8) ] = cell_stack[ (int)floor(i / 8) ] ^ ( 128 >> (i % 8) );
  29. }
  30.  
  31. void bit_on_cr(int x, int y) { // Поменять бит на 1 по координатам
  32. int i = x + (WIDTH*y);
  33. bit_on(i);
  34. }
  35.  
  36. void bit_off_cr(int x, int y) { // Поменять бит на 0 по координатам
  37. int i = x + (WIDTH*y);
  38. bit_off(i);
  39. }
  40.  
  41. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  42.  
  43. void setup() {
  44.  
  45. myOLED.begin();
  46.  
  47.  
  48. }
  49.  
  50. void loop() {
  51.  
  52. myOLED.clrScr();
  53. myOLED.drawBitmap(0,DOWN_SHIFT,cell_stack,WIDTH,HEIGHT);
  54. myOLED.update();
  55.  
  56. for (int i = 0; i < CELL_STACK_SIZE*8; i++) {
  57.  
  58. cell_point[i] = 0; // Обнуление поинтов каждой ячейки в начале каждого шага
  59.  
  60. /////////////////////////////////////////////// Ячейки снизу
  61. if ( (int)floor(i/WIDTH) != HEIGHT - 1 && bit_check(i+WIDTH) ) {
  62. cell_point[i]++ ;
  63. }
  64. /////////////////////////////////////////////// Ячейки сверху
  65. if ( (int)floor(i/WIDTH) != 0 && bit_check(i-WIDTH) ) {
  66. cell_point[i]++ ;
  67. }
  68. /////////////////////////////////////////////// Ячейки по середине
  69. if ( i % WIDTH != WIDTH - 1 && bit_check(i+1) ) {
  70. cell_point[i]++ ;
  71. }
  72. if ( i % WIDTH != 0 && bit_check(i-1) ) {
  73. cell_point[i]++ ;
  74. }
  75.  
  76. }
  77.  
  78. for (int i = 0; i < CELL_STACK_SIZE*8; i++) {
  79. // Правило рождения
  80. if (cell_point[i] == 3) {
  81. bit_on(i);
  82. }
  83. // Правило смерти
  84. if ( bit_check(i) ) {
  85. if ( (cell_point[i] == 0) || (cell_point[i] == 4) ) {
  86. bit_off(i);
  87. }
  88. }
  89.  
  90. }
  91.  
  92. delay(1000);
  93.  
  94. }
Advertisement
Add Comment
Please, Sign In to add comment