#include <LiquidCrystal.h> // Подключаем стандартную библиотеку LiquidCrystal
// Инициализируем объект-экран, передаём использованные
// для подключения контакты на Arduino в порядке:
// RS, E, D4, D5, D6, D7
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
const int ledPin = 6; // светодиод на выводе с ШИМ
int potValue = 0; // значение от потенциометра
int brightness = 0; // конвертируем в яркость
int progress = 0; // индикатор прогресса
const int X_size = 16; // размер диспелея по горизонтали
const int Y_size = 2; // размер диспелея по вертикали
const char min_Char = 65; //символ 'A'
const char max_Char = 90; //символ 'Z'
const int S_size = 26; // количество отображаемых символов
const int pinX = A0;
const int pinY = A1;
const int joy_comparator = 10; //уровень срабатывания компаратора джойстика
const int X_dir = 0; //горизонтальное направление стрелок
const int Y_dir = 1; //вертикальное направление стрелок
const int button = 2;
int x, y; //оси джойстика
int cur_mid_button = LOW; //текущее состояние центральной кнопки
int last_mid_button = LOW; //предыдущее состояние центральной кнопки
int cur_dir_up, cur_dir_down, cur_dir_left, cur_dir_right; //текущие направления стрелок
int last_dir_up, last_dir_down, last_dir_left, last_dir_right; //предыдущие направления стрелок
int row = 0; //текущая строка [0,1]
int col = 0; //текущий столбец [0,15]
char symbol = 64; //текущий символ [0,25]
int last_row = 0; //предыдущая строка
int last_col = 0; //предыдущий столбец
int last_symbol = symbol; //предыдущий символ
//Функция подавления дребезга
int debounce (int last, int button)
{
int current = digitalRead(button);
if (last != current) //если состояние изменилось
{
delay(5);
current = digitalRead(button);
}
return current;
}
//Функция отслеживания нажатия кнопки
int button_press (int cur_But, int last_but)
{
if (last_but == HIGH && cur_But == LOW)
{
if (row == 0) {
row = 1;
}
else {
row = 0;
}
Serial.print("ROW = "); Serial.println (row);
}
return cur_But;
}
//Функция отслеживания нажатия стрелок на джойстике
int joy_arrow (int direction)
{
if (direction == X_dir)
{
if (x > (127 + joy_comparator) && last_dir_right == LOW) {
if (col > 0)
{
--col;
Serial.print("COL = "); Serial.println (col);
}
last_dir_right = HIGH;
}
else if (x < (127 - joy_comparator))
{
if (col < (X_size - 1))
{
++col;
Serial.print("COL = "); Serial.println (col);
}
last_dir_left = HIGH;
}
else
{
last_dir_right = LOW;
last_dir_left = LOW;
}
}
else
{
if (y > (127 + joy_comparator) && last_dir_up == LOW) {
if (symbol > min_Char)
{
--symbol;
Serial.print("symbol = "); Serial.println (symbol);
}
last_dir_up = HIGH;
}
else if (y < (127 - joy_comparator))
{
if (symbol < max_Char)
{
++symbol;
Serial.print("symbol = "); Serial.println (symbol);
}
last_dir_down = HIGH;
}
else
{
last_dir_up = LOW;
last_dir_down = LOW;
};
}
delay(50); //по ТЗ 100 мс
}
void setup()
{
Serial.begin(9600); //последовательный порт для отладки
// устанавливаем размер (количество столбцов и строк) экрана
lcd.begin(16, 2);
// ощищаем экран
lcd.clear();
lcd.blink();
}
void loop()
{
x = analogRead(pinX); // считываем значение оси Х
y = analogRead(pinY); // считываем значение оси Y
x = map(x, 0, 1023, 0, 255); //нормируем диапазон X
y = map(y, 0, 1023, 0, 255); //нормируем диапазон Y
joy_arrow(X_dir);
joy_arrow(Y_dir);
cur_mid_button = debounce (last_mid_button, button);
last_mid_button = button_press (cur_mid_button, last_mid_button);
if (last_col != col)
{
last_col = col;
lcd.setCursor(col, row);
symbol = min_Char;
//lcd.write(symbol);
}
if (last_row != row)
{
last_row = row;
lcd.setCursor(col, row);
symbol = min_Char;
//lcd.write(symbol);
}
if (last_symbol != symbol)
{
last_symbol = symbol;
lcd.setCursor(col, row);
lcd.write(symbol);
}
}