#define COUNT_TIME 16
#define PIN_BTN PC1 //A1
#define PIN_LED_BLUE PC3 //A3
#define PIN_LED_RED PC2 //A2
#define BOUNCE 100
#define LOW_PRESSED 2000
#define LONG_PRESSED 2000
#define BLINK_OFF 300
#define BLINK_ON 100
uint16_t cnt, cntBlinkLedSpeakerOFF, cntBlinkLedSpeakerON;
uint8_t BtnStatus = 0, LedStatus = 0, bl = 2; // статус состояния нажатия кнопки
#define BLINK_TIME_ON 300
#define BLINK_TIME_OFF 300
uint8_t blinkON = BLINK_TIME_ON, blinkOFF = BLINK_TIME_OFF, workLEDstatus = 0, fl = 0;
uint16_t blinkCounter;
/*
BtnStatus = 0; //button off
BtnStatus = 1; //contact bounce
BtnStatus = 0;
BtnStatus = 0;
*/
//-----Прототипы функций----------------------------
void timer_init();
void port_init();
void BlinkLed();
//-----END Прототипы функций----------------------------
//-----Прерывания----------------------------
ISR(TIMER1_COMPA_vect) {
switch (LedStatus) {
case 0:
break;
case 1:
if (bl != 0) {
bl --;
cntBlinkLedSpeakerOFF = BLINK_OFF;
cntBlinkLedSpeakerON = BLINK_ON;
LedStatus = 2;
}
else {
PORTC &= ~(1 << PIN_LED_BLUE);
LedStatus = 0;
}
break;
case 2:
PORTC &= ~(1 << PIN_LED_BLUE);
if (cntBlinkLedSpeakerOFF != 0) {
cntBlinkLedSpeakerOFF --;
}
else {
LedStatus = 3;
}
break;
case 3:
PORTC |= (1 << PIN_LED_BLUE);
if (cntBlinkLedSpeakerON != 0) {
cntBlinkLedSpeakerON --;
}
else {
LedStatus = 1;
}
break;
}
//=================================================================================
switch (BtnStatus) {
case 0:
PORTC &= ~(1 << PIN_LED_RED);
if (!(PINC & (1 << PIN_BTN))) {// если pin PIN_BTN == 0, кнопка нажата
cnt = BOUNCE;
BtnStatus = 1;
}
else {
BtnStatus = 0;
}
break;
case 1: // отрабатываем дребезг контактов
if (!(PINC & (1 << PIN_BTN))) { // если pin PIN_BTN == 0, кнопка нажата
if (cnt != 0) {
cnt --;
}
else {
BtnStatus = 2;
cnt = LOW_PRESSED;
}
}
else {
BtnStatus = 0;
}
break;
case 2: //рабочий режим кнопки
if (fl == 0) {
workLEDstatus = 1;
blinkCounter = 3;
fl = 1;
}
if (!(PINC & (1 << PIN_BTN))) { // если pin PIN_BTN == 0, кнопка нажата
if (cnt != 0) {
cnt --;
}
else {
cnt = LONG_PRESSED;
BtnStatus = 3;
}
}
else {
//doing something (one long LED flash);
BtnStatus = 0;
}
break;
case 3: //входим в режим программирования
if (!(PINC & (1 << PIN_BTN))) { // если pin PIN_BTN == 0, кнопка нажата
//function two pic in speaker
if (cnt != 0) {
cnt --;
}
else {
BtnStatus = 0;
//one long led flash
}
}
else {
//doing something (two long LED flash);
BtnStatus = 0;
}
break;
}
}
//-----END Прерывания----------------------------
void setup() {
timer_init();
port_init();
LedStatus = 1;
}
void loop() {
// put your main code here, to run repeatedly:
/*
if (blinkCounter != 0){
//workLEDstatus = 1;
BlinkLed();
}
else {
fl = 0;
}
*/
if (fl == 1) {
BlinkLed();
}
/*
if (!(PINC & (1 << PIN_BTN))) // если pin PIN_BTN == 0, кнопка нажата
{
PORTC |= (1 << PIN_LED_BLUE);
}
else
{
PORTC &= ~(1 << PIN_LED_BLUE);
}
*/
}
//-----Функции----------------------------
void timer_init() // инициализация Timer1
{
cli(); // отключить глобальные прерывания
TCCR1A = 0; // установить регистры в 0
TCCR1B = 0;
OCR1A = COUNT_TIME; // установка регистра совпадения
TCCR1B |= (1 << WGM12); // включение в CTC режим
// Установка битов CS10 и CS12 на коэффициент деления 1024
TCCR1B |= (1 << CS10);
TCCR1B |= (1 << CS12);
TIMSK1 |= (1 << OCIE1A); // включение прерываний по совпадению
sei(); // включить глобальные прерывания
}
void port_init() //инициализация портов
{
//pinMode(LEDPIN1, OUTPUT);
//pinMode(A2, OUTPUT);
DDRC |= (1 << PIN_LED_BLUE) | (1 << PIN_LED_RED); //ПОРТЫ НА ВЫХОД
PORTC &= ~(1 << PIN_LED_BLUE) | ~(1 << PIN_LED_RED); //В ПОРТАХ 0
DDRC &= ~(1 << PIN_BTN);
PORTC |= (1 << PIN_BTN);
}
void BlinkLed() //Функция мигания светодиодов
{
/*
if (blinkON != 0) {
blinkON --;
}
else {
PORTC ^= (1<<PIN_LED_BLUE);
blinkON = BLINK_TIME_ON;
fl = 0;
}
*/
switch (workLEDstatus) {
case 0:
PORTC &= ~(1 << PIN_LED_BLUE);
//fl = 0;
//blinkCounter--;
break;
case 1:
if (blinkON > 0) {
PORTC |= (1 << PIN_LED_BLUE);
blinkON --;
}
else {
workLEDstatus = 0;
blinkON = BLINK_TIME_ON;PORTC |= (1 << PIN_LED_RED);
}
break;
/*
case 2:
PORTC &= ~(1 << PIN_LED_BLUE);
if (blinkOFF != 0) {
blinkOFF --;
}
else {
workLEDstatus = 0;
blinkOFF = BLINK_TIME_OFF;
}
break;
*/
}
}
//void segchar (unsigned char seg)
//{
//switch (seg)
//{
//case 1: PORTD = 0b11111001; break;
//}
//}
//-----END Функции----------------------------
/*
#define RED A5
#define YELLOW A4
#define GREEN A3
#define DELAY 200
#define LEDPIN1 13
#define LEDPIN2 PC1
#define LEDPIN3 PC2
#define COUNT_TIME 15
#define COUNT_LEDPIN1 2000
#define COUNT_LEDPIN2 1000
#define COUNT_LEDPIN3 300
uint16_t COUNT_LED1 = COUNT_LEDPIN1;
uint16_t COUNT_LED2 = COUNT_LEDPIN2;
uint16_t COUNT_LED3 = COUNT_LEDPIN3;
int ar[] = {RED, YELLOW, GREEN};
ISR(TIMER1_COMPA_vect)
{
if (COUNT_LED1 > 0)
{
COUNT_LED1 --;
}
else
{
digitalWrite(LEDPIN1, !digitalRead(LEDPIN1));
COUNT_LED1 = COUNT_LEDPIN1;
}
if (COUNT_LED2 > 0)
{
COUNT_LED2 --;
}
else
{
DDRC ^= (1<<LEDPIN2);
COUNT_LED2 = COUNT_LEDPIN2;
}
if (COUNT_LED3 > 0)
{
COUNT_LED3 --;
}
else
{
DDRC ^= (1<<LEDPIN3);
COUNT_LED3 = COUNT_LEDPIN3;
}
}
void setup() {
// put your setup code here, to run once:
for (int i = 0; i < sizeof(ar) / sizeof(*ar); ++i) {
pinMode(ar[i], OUTPUT);
}
pinMode(LEDPIN1, OUTPUT);
//pinMode(A2, OUTPUT);
PORTC |= (1 << LEDPIN2)|(1 << LEDPIN3);
DDRC |= (1 << LEDPIN2)|(1 << LEDPIN3);
// инициализация Timer1
cli(); // отключить глобальные прерывания
TCCR1A = 0; // установить регистры в 0
TCCR1B = 0;
OCR1A = COUNT_TIME; // установка регистра совпадения
TCCR1B |= (1 << WGM12); // включение в CTC режим
// Установка битов CS10 и CS12 на коэффициент деления 1024
TCCR1B |= (1 << CS10);
TCCR1B |= (1 << CS12);
TIMSK1 |= (1 << OCIE1A); // включение прерываний по совпадению
sei(); // включить глобальные прерывания
}
void loop() {
// put your main code here, to run repeatedly:
for (int i = 0; i < sizeof(ar) / sizeof(*ar); ++i) {
for (int j = 0; j < sizeof(ar) / sizeof(*ar); ++j) {
if (ar[j] == ar[i]) {
digitalWrite(ar[j], HIGH);
//digitalWrite(ar[j], !digitalRead(ar[j]));
}
else {
digitalWrite(ar[j], LOW);
//digitalWrite(ar[j], !digitalRead(ar[j]));
}
}
delay(DELAY);
}
digitalWrite(A2, HIGH);
}
*/