Код:
//******************** ******************** ******************** ******************** ******************** ******************** ******************** *********
// Программа дешифратора
// TFT_HX8357 25февраля 2018года
// г.Снежное, ДНР, D0ITC, D0ISM
//******************** ******************** ******************** ******************** ******************** ******************** ******* Подключаем библиотеки
#include <TFT_HX8357.h> //подключаем библиотеку для индикатора HX8357
#include "Free_Fonts.h" //подключаем шрифт Free_Fonts
//******************** ******************** ******************** ******************** ******************** ******************** ************ Задаём константы
#define D0 0 //константа порта подключения дешифратора ФНЧ(D0)
#define D1 1 //константа порта подключения дешифратора ФНЧ(D1)
#define D2 2 //константа порта подключения дешифратора ФНЧ(D2)
#define D3 3 //константа порта подключения дешифратора ФНЧ(D3)
#define Freq 47 //константа порта измерения частоты входного сигнала
TFT_HX8357 tft = TFT_HX8357(); //инициализация дисплея
//******************** ******************** ******************** ******************** ******************** ******************** ******** Назначаем переменные
float frq=0; //переменная частоты входного сигнала
int frq_get=0; //переменная после сравнения частоты для шифрации
float frq_old1=0; //переменная для сравнения первого цикла
float frq_old2=0; //переменная для сравнения второго цикла
float frq_old3=0; //переменная для сравнения третьего цикла
volatile unsigned long timerCounts; //таймер расчёта при измерении частоты входного сигнала
volatile boolean counterReady; //конечный подсчет
unsigned long overflowCount; //расчёт переполнения
unsigned int timerTicks; //таймер прерываний
unsigned int timerPeriod; //таймер периода
//******************** ******************** ******************** ******************** ******************** ******************** *** Подпрограмма начала счета
void startCounting (unsigned int ms){
counterReady=false; //готовность счётчика
timerPeriod=ms; //количество импульсов на входе за 1 мс
timerTicks=0; //сброс счетчика прерываний
overflowCount=0; //счётчик переполнений
TCCR2A=0; TCCR2B=0; TCCR5A=0; TCCR5B=0; //сброс таймера 2 и таймера 5
TIMSK5=bit(TOIE1); //таймер 5-подсчет импульсов на pin D47, прерывание при переполнении таймера 5
TCCR2A=bit(WGM21) ; //режим CTC
OCR2A=123; //подсчёт 125 тиков для получения 1мс(корректировка показаний)
TIMSK2=bit(OCIE2A); //timer 2-прерывание каждую 1 мс, включаем прерывание Timer2
TCNT2=0; TCNT5=0; //сброс счётчиков 2 и 5
GTCCR=bit(PSRASY); //сброс предделителя, таймер 2
TCCR2B=bit(CS20)|bit (CS22); //предделитель на 128, запуск таймера 5
TCCR5B=bit(CS50)|bit (CS51)|bit(CS52);} //чтение частоты на T4 pin (D47)
ISR (TIMER5_OVF_vect){++ overflowCount;} //подсчет числа переполнения счетчика 5, конец TIMER5_OVF_vect
ISR (TIMER2_COMPA_vect){ //таймер 2 прерываний запускается аппаратным таймером 2 каждую 1мс=1000Гц
unsigned int timer5CounterValue; //получить значение счетчика,перед его изменением
timer5CounterValue=T CNT5; //см.datasheet, (доступ к 16-битным регистрам)
if (++timerTicks<timerPeriod) return; //--------------------------------------------
if (TIFR5&TOV5)overflowCount++ ; //при переполнении
TCCR5A=0; TCCR5B=0; TCCR2A=0; TCCR2B=0; //обнуляем таймеры 5 и 2
TIMSK2=0; TIMSK5=0; //отключаем прерывания Timer2 и Timer5
timerCounts=(overflo wCount<<16)+timer5CounterVal ue; //подсчёт переполнений, каждое переполнение больше 65536
counterReady=true;} //установить глобальный флаг для периода конечного подсчета
//==================== ==================== =============== Установочная часть программы ==================== ==================== ==================== ====
void setup(){
pinMode(D0,OUTPUT); //назначаем вывод(D0)на выход, подключение дешифратора ФНЧ(0)
pinMode(D1,OUTPUT); //назначаем вывод(D1)на выход, подключение дешифратора ФНЧ(1)
pinMode(D2,OUTPUT); //назначаем вывод(D2)на выход, подключение дешифратора ФНЧ(2)
pinMode(D3,OUTPUT); //назначаем вывод(D3)на выход, подключение дешифратора ФНЧ(3)
pinMode(Freq,INPUT); //назначаем порт измерения частоты на вход(47)
tft.init(); //инициализация дисплея
tft.setRotation(3); //выбираем альбомную ориентацию дисплея
tft.fillScreen(TFT_B LACK); //заливаем экран черным цветом
for(int i=0; i<5; i++){ //включаем цикл
tft.drawRect(0+i,0+i ,480-i*2,320-i*2,TFT_SILVER);} //рисуем наружную окантовку
tft.setFreeFont(FSBI 18); tft.setTextColor(TFT _DARKGREY); //выбираем шрифт и цвет текста
tft.drawCentreString ("* RF BAND DECODER *",240,45,1); //выводим надпись "* RF BAND DECODER *"
tft.setFreeFont(FSBI 12); //выбираем шрифт текста
tft.drawCentreString ("D0ITC 2018 D0ISM",240,280,1); //выводим надпись "D0ITC 2018 D0ISM"
tft.setFreeFont(FSBI 18); tft.setTextColor(TFT _GREEN); //выбираем шрифт и цвет текста
tft.drawCentreString ("BAND",240,120,1); //выводим надпись "BAND"
}//==================== ==================== ==================== == Основной цикл ==================== ==================== ==================== ===========
void loop(){
for (int i=0; i<3; i++){startCounting(2 ); delay(2); //включаем цикл и выставляем 2мс для подсчёта частоты
frq=((timerCounts*16 )/100)/timerPeriod; //измеряем входную частоту в МГц(шаг 100кГц)
if (frq>frq_old1){frq_old1=f rq;}} //получаем наивысшую частоту "frq_old1"
for (int i=0; i<3; i++){startCounting(2 ); delay(2); //включаем цикл и выставляем 2мс для подсчёта частоты
frq=((timerCounts*16 )/100)/timerPeriod; //измеряем входную частоту в МГц(шаг 100кГц)
if (frq>frq_old2){frq_old2=f rq;}} //получаем наивысшую частоту "frq_old2"
for (int i=0; i<3; i++){startCounting(2 ); delay(2); //включаем цикл и выставляем 2мс для подсчёта частоты
frq=((timerCounts*16 )/100)/timerPeriod; //измеряем входную частоту в МГц(шаг 100кГц)
if (frq>frq_old3){frq_old3=f rq;}} //получаем наивысшую частоту "frq_old3"
if ((frq_old1==frq_old2 )&&(frq_old2==frq_old3) ) //сравниваем три частоты
{frq_get=frq_old1;} //и при их равенстве записываем в "frq_get"
tft.setTextColor(TFT _GREEN,TFT_BLACK); tft.setTextPadding(1 30); //выбираем цвет текста и включаем обновление подложки шрифта
switch (frq_get){ //после цикла выбора наивысшей частоты и совпадения частот
case 16 ... 30: tft.drawCentreString ("160m",240,170,6); //----------------- 160m -------------------
digitalWrite(D0,HIGH ); digitalWrite(D1,LOW) ; //вывод кода для дешифратора диапазонных ФНЧ
digitalWrite(D2,LOW) ; digitalWrite(D3,LOW) ; break; //--------- D3=0--D2=0--D1=0--D0=1 ---------
case 31 ... 50: tft.drawCentreString ("80m",240,170,6); //------------------ 80m -------------------
digitalWrite(D0,LOW) ; digitalWrite(D1,HIGH ); //вывод кода для дешифратора диапазонных ФНЧ
digitalWrite(D2,LOW) ; digitalWrite(D3,LOW) ; break; //--------- D3=0--D2=0--D1=1--D0=0 ---------
case 51 ... 80: tft.drawCentreString ("40m",240,170,6); //------------------ 40m -------------------
digitalWrite(D0,HIGH ); digitalWrite(D1,HIGH ); //вывод кода для дешифратора диапазонных ФНЧ
digitalWrite(D2,LOW) ; digitalWrite(D3,LOW) ; break; //--------- D3=0--D2=0--D1=1--D0=1 ---------
case 81 ... 120: tft.drawCentreString ("30m",240,170,6); //------------------ 30m -------------------
digitalWrite(D0,LOW) ; digitalWrite(D1,LOW) ; //вывод кода для дешифратора диапазонных ФНЧ
digitalWrite(D2,HIGH ); digitalWrite(D3,LOW) ; break; //--------- D3=0--D2=1--D1=0--D0=0 ---------
case 121 ... 160: tft.drawCentreString ("20m",240,170,6); //------------------ 20m -------------------
digitalWrite(D0,HIGH ); digitalWrite(D1,LOW) ; //вывод кода для дешифратора диапазонных ФНЧ
digitalWrite(D2,HIGH ); digitalWrite(D3,LOW) ; break; //--------- D3=0--D2=1--D1=0--D0=1 ---------
case 161 ... 190: tft.drawCentreString ("17m",240,170,6); //------------------ 17m -------------------
digitalWrite(D0,LOW) ; digitalWrite(D1,HIGH ); //вывод кода для дешифратора диапазонных ФНЧ
digitalWrite(D2,HIGH ); digitalWrite(D3,LOW) ; break; //--------- D3=0--D2=1--D1=1--D0=0 ---------
case 191 ... 230: tft.drawCentreString ("15m",240,170,6); //------------------ 15m -------------------
digitalWrite(D0,HIGH ); digitalWrite(D1,HIGH ); //вывод кода для дешифратора диапазонных ФНЧ
digitalWrite(D2,HIGH ); digitalWrite(D3,LOW) ; break; //--------- D3=0--D2=1--D1=1--D0=1 ---------
case 231 ... 260: tft.drawCentreString ("12m",240,170,6); //------------------ 12m -------------------
digitalWrite(D0,LOW) ; digitalWrite(D1,LOW) ; //вывод кода для дешифратора диапазонных ФНЧ
digitalWrite(D2,LOW) ; digitalWrite(D3,HIGH ); break; //--------- D3=1--D2=0--D1=0--D0=0 ---------
case 261 ... 300: tft.drawCentreString ("10m",240,170,6); //------------------ 10m -------------------
digitalWrite(D0,HIGH ); digitalWrite(D1,LOW) ; //вывод кода для дешифратора диапазонных ФНЧ
digitalWrite(D2,LOW) ; digitalWrite(D3,HIGH ); break; //--------- D3=1--D2=0--D1=0--D0=1 ---------
case 301 ... 510: tft.drawCentreString ("6m",240,170,6); //-------------------6m---------------------
digitalWrite(D0,LOW) ; digitalWrite(D1,LOW) ; //вывод кода для дешифратора диапазонных ФНЧ
digitalWrite(D2,LOW) ; digitalWrite(D3,LOW) ; break;} //--------- D3=0--D2=0--D1=0--D0=0 ---------
if (frq<frq_old1){frq_old1=0 ; frq_old2=0; frq_old3=0;} //если новая частота меньше предыдущей обнуляем "frq_old1-3"
}//******************** ******************** ******************** ******************** ******************** ******************** ******************* Конец!!!