#include <Wire.h>
#include <U8g2lib.h>
//-----------------------------------------------------------------
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
//-----------------------------------------------------------------
const long UNIT_TIME = 75; // dit duration in milliseconds
int LED_PIN = 12;
int BEE_PIN = 11;
int BTN_PIN = 13;
int SDA_PIN = 4;
int SCL_PIN = 5;
unsigned char LstBtn = 1;
unsigned long PshBtnTick = 0;
unsigned long RlsBtnTick = 1;
unsigned long NowTime;
const int ALPHABET_SIZE = 54;
const char* letters[] = {
".-", "A",
"-...", "B",
"-.-.", "C",
"-..", "D",
".", "E",
"..-.", "F",
"--.", "G",
"....", "H",
"..", "I",
".---", "J",
"-.-", "K",
".-..", "L",
"--", "M",
"-.", "N",
"---", "O",
".--.", "P",
"--.-", "Q",
".-.", "R",
"...", "S",
"-", "T",
"..-", "U",
"...-", "V",
".--", "W",
"-..-", "X",
"-.--", "Y",
"--..", "Z",
".----", "1",
"..---", "2",
"...--", "3",
"....-", "4",
".....", "5",
"-....", "6",
"--...", "7",
"---..", "8",
"----.", "9",
"-----", "0",
".-.-.-", ".",
"--..--", ",",
"..--..", "?",
"-.-.--", "!",
".----.", "'",
".-..-.", "\"",
"-.--.", "(",
"-.--.-", ")",
".-...", "&",
"---...", ":",
"-.-.-.", ";",
"-..-.", "/",
"..--.-", "_",
"-...-", "=",
".-.-.", "+",
"-....-", "-",
"...-..-", "$",
".--.-.-", "@",
"........","e",
};
TwoWire myI2C(i2c0, SDA_PIN, SCL_PIN);
U8G2_SSD1309_128X64_NONAME0_F_HW_I2C displayX(U8G2_R0,U8X8_PIN_NONE);
//U8G2_SSD1306_128X64_NONAME_F_HW_I2C displayX(U8G2_R0,U8X8_PIN_NONE);
//-----------------------------------------------------------------
const unsigned char BMP_T_and_R[128] = { /* 0X20,0X01,0X20,0X00,0X20,0X00, */
0X00,0X00,0X00,0X00,0X00,0X00,0X0E,0X00,0X00,0X00,0X0F,0X00,0X00,0X80,0X07,0X00,
0X00,0XC0,0X03,0X00,0X00,0XE0,0X01,0X00,0X00,0XF0,0X00,0X00,0X00,0X78,0X00,0X00,
0X02,0X3E,0X00,0X00,0XFE,0X1F,0X08,0X00,0XFC,0X09,0X08,0X00,0X00,0X0C,0X18,0X00,
0X00,0X0C,0X10,0X00,0X00,0X06,0X30,0X00,0X00,0X06,0X30,0X00,0X00,0X06,0X30,0X00,
0X00,0X06,0X30,0X00,0X00,0X06,0X30,0X00,0X00,0X06,0X30,0X00,0X00,0X04,0X18,0X00,
0X00,0X0C,0X18,0X00,0X00,0X08,0XCC,0X1F,0X00,0X08,0XFC,0X3F,0X00,0X00,0X3E,0X20,
0X00,0X00,0X0F,0X00,0X00,0X80,0X07,0X00,0X00,0XC0,0X03,0X00,0X00,0XE0,0X01,0X00,
0X00,0XF0,0X00,0X00,0X00,0X78,0X00,0X00,0X00,0X38,0X00,0X00,0X00,0X00,0X00,0X00,
};
void InidisplayX()
{
displayX.clearBuffer();
displayX.setDrawColor(1);
displayX.drawXBMP(0,20,32,32,BMP_T_and_R);
displayX.setFont(u8g2_font_t0_11_tf); // 設定起始座標
displayX.drawStr(40,32,"CW Trainer"); // 要顯示的字串
displayX.drawStr(40,42,"2023.11.03"); // 要顯示的字串
displayX.sendBuffer();
}
//-----------------------------------------------------------------
void setup() {
pinMode(BTN_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
pinMode(BEE_PIN, OUTPUT);
//---------------------------------------------------
// Start I2C communication
myI2C.begin();
displayX.begin();
InidisplayX();
//---------------------------------------------------
displayX.setFont(u8g2_font_t0_22_tf); // 設定起始座標
}
const int DITSLEN = 10;
char dits[DITSLEN];
int fontH = 13;
int lineH = 16;
int lineM = SCREEN_HEIGHT/lineH;
int dnum = 0;
int lidx = lineM;
void emitLetter()
{
bool NeedClr = (lidx>=lineM);
if (dnum>0)
{
const char* Albat = " ";
dits[dnum] = '\0';
for (int j=0; j<ALPHABET_SIZE; j++)
{
if (strcmp(dits, letters[2*j]) == 0)
{
Albat = letters[2*j+1];
break;
}
}
if (Albat[0]=='e') NeedClr=true;
if (NeedClr)
{
displayX.clearBuffer();
lidx=0;
displayX.setCursor(0,lineH);
}
displayX.print(Albat);
displayX.print(dits);
}
displayX.sendBuffer();
dnum = 0;
}
int ChkBtnState()
{
unsigned long DifTick;
unsigned char CurBtn;
int RetState = 0;
DifTick=0;
NowTime = millis();
CurBtn=digitalRead(BTN_PIN);
if ((CurBtn==HIGH)&&(LstBtn==LOW))
{
DifTick = (PshBtnTick>0)?(NowTime-PshBtnTick):0;
if (DifTick > UNIT_TIME*2)
RetState = 0x02;
else if (DifTick > (UNIT_TIME>>1))
RetState = 0x01;
}
if (LstBtn==CurBtn)
{
if (LstBtn==LOW)
{
if (PshBtnTick==0) PshBtnTick=NowTime;
}
if (LstBtn==HIGH)
{
if (RlsBtnTick==0) RlsBtnTick=NowTime;
//------------------------------------------
DifTick = (RlsBtnTick>1)?(NowTime-RlsBtnTick):0;
if (DifTick > UNIT_TIME*5.33)
{
RetState = 0x08;
RlsBtnTick = 1;
}
else if (DifTick > UNIT_TIME*2.2)
RetState = 0x04;
//------------------------------------------
}
} else
{
//---------------------------
digitalWrite(LED_PIN, !CurBtn);
digitalWrite(BEE_PIN, !CurBtn);
//---------------------------
RlsBtnTick = 0;
}
if (LstBtn==HIGH) PshBtnTick=0;
LstBtn = CurBtn;
return RetState;
}
void loop()
{
int btnsta = ChkBtnState();
switch(btnsta)
{
case 0x01:
dits[dnum++] = '.';
break;
case 0x02:
dits[dnum++] = '-';
break;
case 0x04:
//emitLetter();
break;
case 0x08:
emitLetter();
lidx++;
displayX.setCursor(0,(lidx+1)*lineH);
break;
}
}