#include #include "font.h" #define OLED_ADDRESS 0x3C #define SPEAKER 13 char pin[] = {12, 11, 10, 9, 8, 7, 6}; char line1[] = {10, 9}; char line2[] = {10, 9, 8, 6}; char line5[] = {9, 6}; char name1[2][7] = {"UP ", "RIGHT "}; char name2[4][7] = {"DOWN ", "LEFT ", "S/P ", "ON/OFF"}; char name5[2][7] = {"MUSIC ", "ROTATE"}; char name6[7] = "RESET "; const unsigned int frequency[] = {262, 294, 330, 349, 392, 440, 494, 523}; int no = 0; unsigned long duration = 500; void setup() { pinMode(SPEAKER, OUTPUT); for(int i=0; i<7; i++) pinMode(pin[i], INPUT_PULLUP); Wire.begin(); initOLED(); clearScreen(); } void loop() { char p; // LINE1 for(int i=0; i<2; i++) { p = line1[i]; pinMode(p, OUTPUT); digitalWrite(p, LOW); if(digitalRead(pin[0]) == LOW) { oledPrint2(name1[i]); tone(SPEAKER, frequency[no], duration); delay(duration); } pinMode(p, INPUT_PULLUP); delay(1); } // LINE2 for(int i=0; i<4; i++) { p = line2[i]; pinMode(p, OUTPUT); digitalWrite(p, LOW); if(digitalRead(pin[1]) == LOW) { oledPrint2(name2[i]); tone(SPEAKER, frequency[no], duration); delay(duration); } pinMode(p, INPUT_PULLUP); delay(1); } // LINE5 for(int i=0; i<2; i++) { p = line5[i]; pinMode(p, OUTPUT); digitalWrite(p, LOW); if(digitalRead(pin[4]) == LOW) { oledPrint2(name5[i]); tone(SPEAKER, frequency[no], duration); delay(duration); } pinMode(p, INPUT_PULLUP); delay(1); } // LINE6 p = pin[6]; pinMode(p, OUTPUT); digitalWrite(p, LOW); if(digitalRead(pin[5]) == LOW) { oledPrint2(name6); tone(SPEAKER, frequency[no], duration); delay(duration); } pinMode(p, INPUT_PULLUP); delay(1); if(++no > 7) no = 0; } void clearScreen() { Wire.beginTransmission(OLED_ADDRESS); Wire.write(0x00); // Co=0 D/C#=0 Wire.write(0x21); // Set Column Address Wire.write(0x00); Wire.write(0x7F); Wire.write(0x22); // Set Page Address Wire.write(0x00); Wire.write(0x03); Wire.endTransmission(); for(int j=0; j<64; j++) { Wire.beginTransmission(OLED_ADDRESS); Wire.write(0x40); // Co=0 D/C#=1 for(int i=0; i<8; i++) Wire.write(0); Wire.endTransmission(); } } void oledPrint2(char* str) { char* c; byte f2[2][12]; byte b, f; int p; c = str; p = 0; while(*c != 0) { for(int i=0; i<6; i++) { b = font6[*c - 0x20][i]; f = 0; if((b & 1) != 0) f = 3; if((b & 2) != 0) f |= 0xc; if((b & 4) != 0) f |= 0x30; if((b & 8) != 0) f |= 0xc0; f2[0][i * 2] = f; f2[0][i * 2 + 1] = f; f = 0; if((b & 0x10) != 0) f = 3; if((b & 0x20) != 0) f |= 0xc; if((b & 0x40) != 0) f |= 0x30; if((b & 0x80) != 0) f |= 0xc0; f2[1][i * 2] = f; f2[1][i * 2 + 1] = f; } for(int y=0; y<2; y++) { Wire.beginTransmission(OLED_ADDRESS); Wire.write(0x00); Wire.write(0x22); // Set Page Address Wire.write(y + 1); Wire.write(y + 1); Wire.write(0x21); // set column addres Wire.write(p); Wire.write(p + 11); Wire.endTransmission(); Wire.beginTransmission(OLED_ADDRESS); Wire.write(0x40); for(int x=0; x<12; x++) Wire.write(f2[y][x]); Wire.endTransmission(); } ++c; p += 12; } } void initOLED() { Wire.beginTransmission(OLED_ADDRESS); Wire.write(0x00); // Co=0 D/C#=0 Wire.write(0xa8); // Set Multiplex Ratio Wire.write(0x1f); // [0x3F] Wire.write(0xD3); // Set Display Offset Wire.write(0x00); Wire.write(0x40); // Set Display Start Line Wire.write(0xA1); // Set Segment re-map [0xA0] Wire.write(0xC8); // Set COM Output Scan Direction [0xC0] Wire.write(0xDA); // Set COM Pins hardware configuration Wire.write(0x02); Wire.write(0x81); // Set Contrast Control Wire.write(0x7F); Wire.write(0xA4); // Entire Display ON Wire.write(0xA6); // Set Normal Display Wire.write(0xD5); // Set Display Clock Divide Ratio/Oscillator Frequency Wire.write(0x80); Wire.write(0x8D); // Set Pump Setting Wire.write(0x14); Wire.write(0x20); // Set Memory Addressing Mode Wire.write(0x00); // Horizontal addressing mode Wire.write(0xAF); // Set Display ON Wire.endTransmission(); }