mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-31 13:22:31 +01:00 
			
		
		
		
	 73883425a5
			
		
	
	
		73883425a5
		
	
	
	
	
		
			
			* Initial move of 40percent.club boards to common parent folder. * Refactor readme files to be consistent * Refactor readme files to be consistent - fix make command examples. * Refactor readme files to be consistent - align readme filenames. * Refactor readme files to be consistent - fix repo url. * Disable Community keymap builds as they are currently failing due to missing functionality * Move more of 40percent.club boards to common parent folder. * Refactor readme files to be consistent - align readme filenames. * Refactor readme files to be consistent - fix make command examples.
		
			
				
	
	
		
			421 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			421 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <FastGPIO.h>
 | |
| #include <TimerOne.h>
 | |
| 
 | |
| int iByte;
 | |
| byte col = 0;
 | |
| byte leds[12][4];
 | |
| byte pass = 1;
 | |
| int fadecount = 1;
 | |
| const int fadelimit = 3000;
 | |
| const int fadelimitshort = 1000;
 | |
| byte mode = 4;
 | |
| byte brightness = 2;
 | |
| boolean changemode = 0;
 | |
| int rain = 0;
 | |
| const int rainlimit = 5000;
 | |
| const int rainfade = 5000;
 | |
| byte rx = 0;
 | |
| byte ry = 0;
 | |
| 
 | |
| // pin[xx] on led matrix connected to nn on Arduino (-1 is dummy to make array start at pos 1)
 | |
| int pins[17] = {
 | |
|   -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 16, 14, 15, 18, 19, 20, 21
 | |
| };
 | |
| 
 | |
| // col[xx] of leds = pin yy on led matrix
 | |
| int cols[12] = {
 | |
|   pins[8], pins[7], pins[6], pins[5], pins[9], pins[10], pins[11], pins[12], pins[13], pins[14], pins[15], pins[16]
 | |
| };
 | |
| 
 | |
| // row[xx] of leds = pin yy on led matrix
 | |
| int rows[4] = {
 | |
|   pins[1], pins[2], pins[3], pins[4]
 | |
| };
 | |
| 
 | |
| 
 | |
| #define DELAY 0
 | |
| extern byte leds[12][4];
 | |
| 
 | |
| void setup() {
 | |
|   Serial1.begin(9600);
 | |
|   setupLeds();
 | |
|   for (int s = 0; s < 5; s++) {
 | |
|     for ( int r = 1; r  < 9; r++)  {
 | |
|       delayMicroseconds(65000);
 | |
|       delayMicroseconds(65000);
 | |
|       for (int j = 0; j < 4; j++) {
 | |
|         for (int i = 0; i < 12; i++) {
 | |
|           leds[i][j] = 1;
 | |
|           for (int p = 0; p < 25; p++) {
 | |
|           }
 | |
|           leds[i][j] = r;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|     for ( int r = 9; r  > 0; r--)  {
 | |
|       delayMicroseconds(65000);
 | |
|       delayMicroseconds(65000);
 | |
|       delayMicroseconds(65000);
 | |
|       for (int j = 0; j < 4; j++) {
 | |
|         for (int i = 0; i < 12; i++) {
 | |
|           leds[i][j] = 1;
 | |
|           for (int p = 0; p < 25; p++) {
 | |
|           }
 | |
|           leds[i][j] = r;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| void loop() {
 | |
| 
 | |
|   switch (mode) {
 | |
|     case 0:
 | |
|       //Blacklight
 | |
|       for (int i = 0; i < 12; i++) {
 | |
|         for (int j = 0; j < 4; j++) {
 | |
|           leds[i][j] = brightness;
 | |
|         }
 | |
|       }
 | |
|       checkserial();
 | |
|       break;
 | |
|     case 1:
 | |
|       //Breathing
 | |
|       for ( int r = 1; r  < 9; r++)  {
 | |
|         checkserial();
 | |
|         if (changemode == 0) {
 | |
|           delayMicroseconds(65000);
 | |
|           delayMicroseconds(65000);
 | |
|           delayMicroseconds(65000);
 | |
|           for (int j = 0; j < 4; j++) {
 | |
|             for (int i = 0; i < 12; i++) {
 | |
|               leds[i][j] = 1;
 | |
|               for (int p = 0; p < 25; p++) {
 | |
|               }
 | |
|               leds[i][j] = r;
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|         else {
 | |
|           break;
 | |
|         }
 | |
|       }
 | |
|       for ( int r = 9; r  > 0; r--)  {
 | |
|         checkserial();
 | |
|         if (changemode == 0) {
 | |
|           delayMicroseconds(65000);
 | |
|           delayMicroseconds(65000);
 | |
|           delayMicroseconds(65000);
 | |
|           delayMicroseconds(65000);
 | |
|           for (int j = 0; j < 4; j++) {
 | |
|             for (int i = 0; i < 12; i++) {
 | |
|               leds[i][j] = 1;
 | |
|               for (int p = 0; p < 25; p++) {
 | |
|               }
 | |
|               leds[i][j] = r;
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|         else {
 | |
|           break;
 | |
|         }
 | |
|       }
 | |
|       for ( int r = 1; r  < 30; r++)  {
 | |
|         checkserial();
 | |
|         if (changemode == 0) {
 | |
|           delayMicroseconds(65000);
 | |
|           delayMicroseconds(65000);
 | |
|         }
 | |
|         else {
 | |
|           break;
 | |
|         }
 | |
|       }
 | |
|       break;
 | |
|     case 2:
 | |
|       //Random
 | |
|       leds[random(12)][random(4)] = random(8);
 | |
|       delayMicroseconds(10000);
 | |
|       checkserial();
 | |
|       break;
 | |
|     case 3:
 | |
|       //Rain
 | |
|       rain++;
 | |
|       if (rain > rainlimit) {
 | |
|         rain = 0;
 | |
|         rx = random(12);
 | |
|         ry = random(4);
 | |
|         if (leds[rx][ry] == 0) {
 | |
|           leds[rx][ry] = 18;
 | |
|         }
 | |
|       }
 | |
|       fadecount++;
 | |
|       if (fadecount > rainfade) {
 | |
|         fadecount = 1;
 | |
|         for (int i = 0; i < 12; i++) {
 | |
|           for (int j = 0; j < 4; j++) {
 | |
|             if (leds[i][j] > 0) {
 | |
|               leds[i][j] = leds[i][j] - 1;
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|       checkserial();
 | |
|       break;
 | |
|     case 4:
 | |
|       //Reactive
 | |
|       fadecount++;
 | |
|       if (fadecount > fadelimit) {
 | |
|         fadecount = 1;
 | |
|         for (int i = 0; i < 12; i++) {
 | |
|           for (int j = 0; j < 4; j++) {
 | |
|             if (leds[i][j] > 0) {
 | |
|               leds[i][j] = leds[i][j] - 1;
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|       checkserial();
 | |
|       break;
 | |
|     case 5:
 | |
|       //Reactive Target
 | |
|       fadecount++;
 | |
|       if (fadecount > fadelimitshort) {
 | |
|         fadecount = 1;
 | |
|         for (int i = 0; i < 12; i++) {
 | |
|           for (int j = 0; j < 4; j++) {
 | |
|             if (leds[i][j] > 0) {
 | |
|               leds[i][j] = leds[i][j] - 1;
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|       checkserial();
 | |
|       break;
 | |
|     default:
 | |
|       mode = 0;
 | |
|       break;
 | |
|   }
 | |
|   changemode = 0;
 | |
| }
 | |
| 
 | |
| void checkserial() {
 | |
|   if (Serial1.available() > 0) {
 | |
|     iByte = Serial1.read();
 | |
|     if (iByte == 100) {
 | |
|       brightness++;
 | |
|       if (brightness > 9) {
 | |
|         brightness = 1;
 | |
|       }
 | |
|     }
 | |
|     if (iByte == 101) {
 | |
|       mode++;
 | |
|     }
 | |
|     if (iByte < 100) {
 | |
|       if (mode == 4) {
 | |
|         byte row = iByte / 16;
 | |
|         byte col = iByte % 16;
 | |
|         leds[col][row] = 18;
 | |
|       }
 | |
|       if (mode == 5) {
 | |
|         byte row = iByte / 16;
 | |
|         byte col = iByte % 16;
 | |
|         for (byte i = 0; i < 12;  i++) {
 | |
|           leds[i][row] = 18;
 | |
|         }
 | |
|         for (byte p = 0; p < 4;  p++) {
 | |
|           leds[col][p] = 18;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| void setupLeds() {
 | |
|   // sets the pins as output
 | |
|   FastGPIO::Pin<2>::setOutputLow();
 | |
|   FastGPIO::Pin<3>::setOutputLow();
 | |
|   FastGPIO::Pin<4>::setOutputLow();
 | |
|   FastGPIO::Pin<5>::setOutputLow();
 | |
|   FastGPIO::Pin<6>::setOutputLow();
 | |
|   FastGPIO::Pin<7>::setOutputLow();
 | |
|   FastGPIO::Pin<8>::setOutputLow();
 | |
|   FastGPIO::Pin<9>::setOutputLow();
 | |
|   FastGPIO::Pin<10>::setOutputLow();
 | |
|   FastGPIO::Pin<16>::setOutputLow();
 | |
|   FastGPIO::Pin<14>::setOutputLow();
 | |
|   FastGPIO::Pin<15>::setOutputLow();
 | |
|   FastGPIO::Pin<18>::setOutputLow();
 | |
|   FastGPIO::Pin<19>::setOutputLow();
 | |
|   FastGPIO::Pin<20>::setOutputLow();
 | |
|   FastGPIO::Pin<21>::setOutputLow();
 | |
| 
 | |
|   // set up Cols
 | |
|   FastGPIO::Pin<6>::setOutputValueLow();
 | |
|   FastGPIO::Pin<7>::setOutputValueLow();
 | |
|   FastGPIO::Pin<8>::setOutputValueLow();
 | |
|   FastGPIO::Pin<9>::setOutputValueLow();
 | |
|   FastGPIO::Pin<10>::setOutputValueLow();
 | |
|   FastGPIO::Pin<16>::setOutputValueLow();
 | |
|   FastGPIO::Pin<14>::setOutputValueLow();
 | |
|   FastGPIO::Pin<15>::setOutputValueLow();
 | |
|   FastGPIO::Pin<18>::setOutputValueLow();
 | |
|   FastGPIO::Pin<19>::setOutputValueLow();
 | |
|   FastGPIO::Pin<20>::setOutputValueLow();
 | |
|   FastGPIO::Pin<21>::setOutputValueLow();
 | |
| 
 | |
|   // set up Rows
 | |
|   FastGPIO::Pin<2>::setOutputValueLow();
 | |
|   FastGPIO::Pin<3>::setOutputValueLow();
 | |
|   FastGPIO::Pin<4>::setOutputValueLow();
 | |
|   FastGPIO::Pin<5>::setOutputValueLow();
 | |
| 
 | |
|   clearLeds();
 | |
|   Timer1.initialize(25);
 | |
|   Timer1.attachInterrupt(display);
 | |
| 
 | |
| }
 | |
| 
 | |
| void clearLeds() {
 | |
|   // Clear display array
 | |
|   for (int i = 0; i < 12; i++) {
 | |
|     for (int j = 0; j < 4; j++) {
 | |
|       leds[i][j] = 0;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| void onLeds() {
 | |
|   // Clear display array
 | |
|   for (int i = 0; i < 12; i++) {
 | |
|     for (int j = 0; j < 4; j++) {
 | |
|       leds[i][j] = 7;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| // Interrupt routine
 | |
| void display() {
 | |
| 
 | |
|   switch (col) { // Turn whole previous column off
 | |
|     case 0:
 | |
|       FastGPIO::Pin<6>::setOutputValueLow();
 | |
|       break;
 | |
|     case 1:
 | |
|       FastGPIO::Pin<7>::setOutputValueLow();
 | |
|       break;
 | |
|     case 2:
 | |
|       FastGPIO::Pin<8>::setOutputValueLow();
 | |
|       break;
 | |
|     case 3:
 | |
|       FastGPIO::Pin<9>::setOutputValueLow();
 | |
|       break;
 | |
|     case 4:
 | |
|       FastGPIO::Pin<10>::setOutputValueLow();
 | |
|       break;
 | |
|     case 5:
 | |
|       FastGPIO::Pin<16>::setOutputValueLow();
 | |
|       break;
 | |
|     case 6:
 | |
|       FastGPIO::Pin<14>::setOutputValueLow();
 | |
|       break;
 | |
|     case 7:
 | |
|       FastGPIO::Pin<15>::setOutputValueLow();
 | |
|       break;
 | |
|     case 8:
 | |
|       FastGPIO::Pin<18>::setOutputValueLow();
 | |
|       break;
 | |
|     case 9:
 | |
|       FastGPIO::Pin<19>::setOutputValueLow();
 | |
|       break;
 | |
|     case 10:
 | |
|       FastGPIO::Pin<20>::setOutputValueLow();
 | |
|       break;
 | |
|     case 11:
 | |
|       FastGPIO::Pin<21>::setOutputValueLow();
 | |
|       break;
 | |
|   }
 | |
| 
 | |
|   col++;
 | |
|   if (col == 12) {
 | |
|     col = 0;
 | |
|     pass++;
 | |
|     if (pass > 8) {
 | |
|       pass = 1;
 | |
|     }
 | |
|   }
 | |
|   for (int row = 0; row < 4; row++) {
 | |
|     if (leds[col][row] > pass) {
 | |
|       switch (row) { // Turn on this led
 | |
|         case 0:
 | |
|           FastGPIO::Pin<2>::setOutputValueLow();
 | |
|           break;
 | |
|         case 1:
 | |
|           FastGPIO::Pin<3>::setOutputValueLow();
 | |
|           break;
 | |
|         case 2:
 | |
|           FastGPIO::Pin<4>::setOutputValueLow();
 | |
|           break;
 | |
|         case 3:
 | |
|           FastGPIO::Pin<5>::setOutputValueLow();
 | |
|           break;
 | |
|       }
 | |
|     }
 | |
|     else {
 | |
|       switch (row) { // Turn off this led
 | |
|         case 0:
 | |
|           FastGPIO::Pin<2>::setOutputValueHigh();
 | |
|           break;
 | |
|         case 1:
 | |
|           FastGPIO::Pin<3>::setOutputValueHigh();
 | |
|           break;
 | |
|         case 2:
 | |
|           FastGPIO::Pin<4>::setOutputValueHigh();
 | |
|           break;
 | |
|         case 3:
 | |
|           FastGPIO::Pin<5>::setOutputValueHigh();
 | |
|           break;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   switch (col) { // Turn column on
 | |
|     case 0:
 | |
|       FastGPIO::Pin<6>::setOutputValueHigh();
 | |
|       break;
 | |
|     case 1:
 | |
|       FastGPIO::Pin<7>::setOutputValueHigh();
 | |
|       break;
 | |
|     case 2:
 | |
|       FastGPIO::Pin<8>::setOutputValueHigh();
 | |
|       break;
 | |
|     case 3:
 | |
|       FastGPIO::Pin<9>::setOutputValueHigh();
 | |
|       break;
 | |
|     case 4:
 | |
|       FastGPIO::Pin<10>::setOutputValueHigh();
 | |
|       break;
 | |
|     case 5:
 | |
|       FastGPIO::Pin<16>::setOutputValueHigh();
 | |
|       break;
 | |
|     case 6:
 | |
|       FastGPIO::Pin<14>::setOutputValueHigh();
 | |
|       break;
 | |
|     case 7:
 | |
|       FastGPIO::Pin<15>::setOutputValueHigh();
 | |
|       break;
 | |
|     case 8:
 | |
|       FastGPIO::Pin<18>::setOutputValueHigh();
 | |
|       break;
 | |
|     case 9:
 | |
|       FastGPIO::Pin<19>::setOutputValueHigh();
 | |
|       break;
 | |
|     case 10:
 | |
|       FastGPIO::Pin<20>::setOutputValueHigh();
 | |
|       break;
 | |
|     case 11:
 | |
|       FastGPIO::Pin<21>::setOutputValueHigh();
 | |
|       break;
 | |
|   }
 | |
| 
 | |
| }
 |