/********************************************************************* This is an example for the adafruit Monochrome OLEDs used on the FPGA_VGA Board Written by John Monahan (S100Computers.com). Modifications by Terry Fox *********************************************************************/ /******************************************************** DONT FORGET TO CHANGE THE PORT WHEN CHANGING BOARDS * Tools/Port ********************************************************/ #define SSD1306 //#define SH110X #define OLEDTEST #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 #define WAVESHARE //#define TINYS3 //#define KYBDI2C 1 //#define ARDSER 1 //#define SH110X_NO_SPLASH 1 //#define SSD1306_NO_SPLASH #include #include #ifdef SSD1306 #include #endif #ifdef SH110X //#include #include #endif /* Uncomment the initialize the I2C address , uncomment only one, If you get a totally blank screen try the other*/ #define i2c_Address 0x3c //initialize with the I2C addr 0x3C Typically eBay OLED's //#define i2c_Address 0x3d //initialize with the I2C addr 0x3D Typically Adafruit OLED's //#include #ifdef WAVESHARE #define parBit0 1 #define parBit1 2 #define parBit2 3 #define parBit3 4 #define parBit4 5 #define parBit5 6 #define parBit6 7 #define parBit7 8 #define Status 9 #define serParSW 14 #define charAck 11 #define I2CSDA 12 #define I2CSCL 13 #define serRxd 44 #define serTxd 43 #define FLASHLED 21 #define ledPwr 15 //#define oledEN 10 #define startFlag 10 // temp to test input 16 #endif #ifdef TINYS3 #define parBit0 2 #define parBit1 3 #define parBit2 4 #define parBit3 5 #define parBit4 21 #define parBit5 0 #define parBit6 6 #define parBit7 7 #define Status 36 #define charAck 34 #define serParSW 37 // #define I2CSDA 8 #define I2CSCL 9 #define serRxd 44 #define serTxd 43 #define FLASHLED 18 #define ledPwr 17 #define startFlag 1 //#define tinyRST #endif #define ch_x 7; #define ch_y 10; #ifdef SSD1306 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); #endif #ifdef SH110X Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); #endif void setup() { pinMode(parBit0, INPUT_PULLDOWN); // Parallel Data D0 INPUT pinMode(parBit1, INPUT_PULLDOWN); // Parallel Data D1 INPUT pinMode(parBit2, INPUT_PULLDOWN); // Parallel Data D2 INPUT pinMode(parBit3, INPUT_PULLDOWN); // Parallel Data D3 INPUT pinMode(parBit4, INPUT_PULLDOWN); // Parallel Data D4 INPUT pinMode(parBit5, INPUT_PULLDOWN); // Parallel Data D5 INPUT pinMode(parBit6, INPUT_PULLDOWN); // Parallel Data D6 INPUT pinMode(parBit6, INPUT_PULLDOWN); // Parallel Data D7 INPUT pinMode(charAck, OUTPUT); // TF ADDED, Character ACK pinMode(startFlag, INPUT_PULLDOWN); // OLED ENABLE INPUT (start_flag) pinMode(Status, INPUT_PULLDOWN); // TF ADDED BACK IN, status (Char READY) delay(10); digitalWrite(charAck, LOW); // Clear status bit upon startup delay(20); digitalWrite(charAck, HIGH); // character ACK OUTPUT //Serial.begin(9600); Wire.begin(I2CSDA,I2CSCL); // enable & set I2C pins delay(5); // by default, we'll generate the high voltage from the 3.3v line internally! (neat!) //display.begin(i2c_Address, true); // Address 0x3C default #ifdef SSD1306 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x64) #endif #ifdef SH110X display.begin(0x3c); #endif //delay(1000); //display.display(); delay(2000); display.clearDisplay(); display.display(); // This gets rid of the Adafruit splash screen display.setTextSize(1); //actually 128x64 pixels display.setTextColor(WHITE); display.setCursor(0, 0); // digitalWrite(charAck, HIGH); // character ACK OUTPUT // Show image buffer on the display hardware. // Since the buffer is intialized with an Adafruit splashscreen // internally, this will display the splashscreen. display.display(); delay(1000); #ifdef OLEDTEST display.println("Hello display"); // verify OLED display is functional #endif display.display(); // and update the display (required) digitalWrite(charAck, LOW); // Clear status bit (charACK) delay(10); digitalWrite(charAck, HIGH); // character ACK OUTPUT back high } // END OF SETUP byte Char; int status; int start_flag; int screen_X = 0; int screen_Y = 0; void loop() { digitalWrite(charAck, HIGH); // character ACK OUTPUT //while ((start_flag = digitalRead(startFlag)) == 0); // Hold display on power-up until FPGA is ready. (GP1 goes low to high) //while (digitalRead(startFlag) == 0) ; // ; // Hold display on power-up until FPGA is ready. (GP1 goes low to high) status = digitalRead(Status); // Read the status bit to see if a character is ready if (status == HIGH) { Char = digitalRead(parBit0) + (digitalRead(parBit1) << 1) + (digitalRead(parBit2) << 2) + (digitalRead(parBit3) << 3) + (digitalRead(parBit4) << 4) + (digitalRead(parBit5) << 5) + (digitalRead(parBit6) << 6) + (digitalRead(parBit7) << 7); switch (Char) { case 0x0d: // CARRIAGE RETURN screen_X = 0; // move back to beginning of the line break; case 0x0a: // LINEFEED screen_Y += 10; // move down one line break; case 0x08: // BACKSPACE screen_X -= 7; // move char back one width display.setCursor(screen_X, screen_Y); display.display(); display.print(" "); // send a space to clear char display.display(); // update the display break; case 0x0c: // FORMFEED display.clearDisplay(); // clear OLED display screen_X = 0; screen_Y = 0; display.setCursor(screen_X, screen_Y); // home display cursor to top left display.display(); break; default: display.setCursor(screen_X, screen_Y); display.print((char)Char); display.display(); if (screen_X >= 128) // Update the cursor { screen_X = 0; screen_Y += 10; } else screen_X += 7; } digitalWrite(charAck, LOW); // Clear status bit (charACK) delay(10); digitalWrite(charAck, HIGH); // character ACK OUTPUT back high } }