Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <OLED_I2C.h>
- #define WIDTH 32 // 64 по умолчанию
- #define HEIGHT 22 // 22 по умолчанию
- #define CELL_STACK_SIZE (int)ceil( (WIDTH*HEIGHT)/8 ) // Количество байт для хранения всех рисуемых ячеек
- #define DOWN_SHIFT 19 // Сдвиг вниз первой ячейки на пиксели
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- OLED myOLED(A4, A5, A4);
- uint8_t cell_stack[CELL_STACK_SIZE] = {0}; // Состояние стака из 8 ячеек (вкл/выкл)
- byte cell_point[WIDTH*HEIGHT] = {0}; // Количество очков у каждой ячейки
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- bool bit_check(int i) { // Проверка указанного бита по номеру
- return cell_stack[ (int)floor(i / 8) ] & 128 >> (i % 8) ;
- }
- void bit_on(int i) { // Поменять бит на 1 по номеру
- cell_stack[ (int)floor(i / 8) ] = cell_stack[ (int)floor(i / 8) ] | ( 128 >> (i % 8) );
- }
- void bit_off(int i) { // Поменять бит на 0 по номеру
- cell_stack[ (int)floor(i / 8) ] = cell_stack[ (int)floor(i / 8) ] ^ ( 128 >> (i % 8) );
- }
- void bit_on_cr(int x, int y) { // Поменять бит на 1 по координатам
- int i = x + (WIDTH*y);
- bit_on(i);
- }
- void bit_off_cr(int x, int y) { // Поменять бит на 0 по координатам
- int i = x + (WIDTH*y);
- bit_off(i);
- }
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void setup() {
- myOLED.begin();
- }
- void loop() {
- myOLED.clrScr();
- myOLED.drawBitmap(0,DOWN_SHIFT,cell_stack,WIDTH,HEIGHT);
- myOLED.update();
- for (int i = 0; i < CELL_STACK_SIZE*8; i++) {
- cell_point[i] = 0; // Обнуление поинтов каждой ячейки в начале каждого шага
- /////////////////////////////////////////////// Ячейки снизу
- if ( (int)floor(i/WIDTH) != HEIGHT - 1 && bit_check(i+WIDTH) ) {
- cell_point[i]++ ;
- }
- /////////////////////////////////////////////// Ячейки сверху
- if ( (int)floor(i/WIDTH) != 0 && bit_check(i-WIDTH) ) {
- cell_point[i]++ ;
- }
- /////////////////////////////////////////////// Ячейки по середине
- if ( i % WIDTH != WIDTH - 1 && bit_check(i+1) ) {
- cell_point[i]++ ;
- }
- if ( i % WIDTH != 0 && bit_check(i-1) ) {
- cell_point[i]++ ;
- }
- }
- for (int i = 0; i < CELL_STACK_SIZE*8; i++) {
- // Правило рождения
- if (cell_point[i] == 3) {
- bit_on(i);
- }
- // Правило смерти
- if ( bit_check(i) ) {
- if ( (cell_point[i] == 0) || (cell_point[i] == 4) ) {
- bit_off(i);
- }
- }
- }
- delay(1000);
- }
Advertisement
Add Comment
Please, Sign In to add comment