Пн апр 19, 2021 19:16:52
Пн апр 19, 2021 19:45:17
Пн апр 19, 2021 19:48:45
Пн апр 19, 2021 19:52:45
///////////////////////////////////////////////////////////////////////////////////////
// The System Timer (systimer.c)
#include <avr/io.h>
#include <avr/interrupt.h>
#include "sys_timer.h"
///////////////////////////////////////////////////////////////////////////////////////
volatile uint16_t counter = 0x00000000;
///////////////////////////////////////////////////////////////////////////////////////
ISR(TIMER0_OVF0_vect)
{
counter--;
TCCR0 = SYS_TIMER_CONFIG;
TCNT0 = SYS_CNT_CONFIG;
}
///////////////////////////////////////////////////////////////////////////////////////
void SYSTIM_Init(void)
{
TCCR0 = SYS_TIMER_CONFIG;
TCNT0 = SYS_CNT_CONFIG;
TIMSK |= (1<<TOIE0);
}
///////////////////////////////////////////////////////////////////////////////////////
int16_t SYSTIM_Get(uint16_t time)
{
return (counter - time);
}
///////////////////////////////////////////////////////////////////////////////////////
void SYSTIM_Set(uint16_t *time, uint16_t tmout)
{
*time = (counter - tmout);
}
///////////////////////////////////////////////////////////////////////////////////////
void SYSTIM_Delay(uint16_t time)
{
uint16_t delay = 0;
SYSTIM_Set(&delay, time);
while(SYSTIM_Get(delay) > 0)
{
asm("nop");
}
}
///////////////////////////////////////////////////////////////////////////////////////
// systimer.h
#ifndef __SYS_TIMER_H
#define __SYS_TIMER_H
///////////////////////////////////////////////////////////////////////////////////////
#define SYS_CNT_CONFIG (0xFF - 0x4D)
#define SYS_TIMER_CONFIG ((1<<PSR0) | (1<<CS02) | (1<<CS00))
///////////////////////////////////////////////////////////////////////////////////////
void SYSTIM_Init(void);
int16_t SYSTIM_Get(uint16_t time);
void SYSTIM_Set(uint16_t *time, uint16_t tmout);
void SYSTIM_Delay(uint16_t time);
#endif
uint16_t delayTimer = 0;
// Взводим таймер на 100 мс
SYSTIM_Set(&delayTimer, 100);
// Проверяем, истекло ли время
if(SYSTIM_Get(delayTimer) <= 0)
{
// Действия, если истекло
}
Пн апр 19, 2021 19:53:51
Пн апр 19, 2021 20:11:58
Пн апр 19, 2021 20:16:43
Пн апр 19, 2021 20:37:40
Пн апр 19, 2021 20:48:24
Пн апр 19, 2021 23:05:24
void State_Button_Push(dSM_Handler_t m)
{
static SoftTimer_t timeout;
switch (m->Signal)
{
case DSM_SIGNAL_ENTRY:
SoftTimer_Set(&timeout, TIME_BUTTON_PUSH);
Data.Button.Count++;
if (Data.Button.State)
{
Data.prevflag = Data.flag;
Data.flag = Data.Button.State;
}
Set_Light();
break;
default:
if (SoftTimer_Expired(&timeout))
{
m->NextState = State_Button_Hold;
}
if (Data.Button.State)
{
//Data.flag = Data.Button.State;
}
else
{
m->NextState = State_Button_Release;
}
break;
}
}
Вт апр 20, 2021 04:12:06
Вт апр 20, 2021 10:32:10
Шикарный пример. Просто отличный.Demiurg писал(а):Мой пример обработки кнопок. Удержание, автоповтор.
u16 scan_keys (void)
{
u16 a = 0;
// if (Set_Is_Key_Plus_Pressed ()) a |= KEY_PLUS_BIT;
// if (Set_Is_Key_Minus_Pressed ()) a |= KEY_MINUS_BIT;
if (Set_Is_Key_Kn0_Pressed ()) a |= KEY_KN_0_BIT;
if (Set_Is_Key_Kn1_Pressed ()) a |= KEY_KN_1_BIT;
if (Set_Is_Key_Kn2_Pressed ()) a |= KEY_KN_2_BIT;
if (Set_Is_Key_Kn3_Pressed ()) a |= KEY_KN_3_BIT;
if (Set_Is_Key_Kn4_Pressed ()) a |= KEY_KN_4_BIT;
if (Set_Is_Key_Kn5_Pressed ()) a |= KEY_KN_5_BIT;
if (Set_Is_Key_Kn6_Pressed ()) a |= KEY_KN_6_BIT;
if (Set_Is_Key_Kn7_Pressed ()) a |= KEY_KN_7_BIT;
if (Set_Is_Key_Kn_Trig_Pressed ()) a |= KEY_TRIGGER_2_BIT;
return a;
}
u16 recoding_keys (void)
{
switch (keys_curr)
{
//case KEY_PLUS_BIT: return KEY_PLUS_COD;
//case KEY_MINUS_BIT: return KEY_MINUS_COD;
case KEY_KN_0_BIT: return KEY_KN_0_COD;
case KEY_KN_1_BIT: return KEY_KN_1_COD;
case KEY_KN_2_BIT: return KEY_KN_2_COD;
case KEY_KN_3_BIT: return KEY_KN_3_COD;
case KEY_KN_4_BIT: return KEY_KN_4_COD;
case KEY_KN_5_BIT: return KEY_KN_5_COD;
case KEY_KN_6_BIT: return KEY_KN_6_COD;
case KEY_KN_7_BIT: return KEY_KN_7_COD;
case KEY_TRIGGER_2_BIT: return KEY_TRIGGER_2_COD;
}
return 0;
}
Вт апр 20, 2021 10:35:36
using pins = PinList<PC2, PD7, PD6, PD5, PD4, PD3, PC5, PD2, PD1, PD0>;
Buttons<pins, ButtonMode::ShortOnly, 1> buttons;
PinList<PB7, PB6, PB5, PB4, PB3, PB5, PB2, PB1, PB0> leds;
buttons.init();
leds.init<PinMode::PushPull>();
while(true)
{
buttons.update();
if(buttons.changed())
{
auto state = buttons.state;
leds.write(state.current);
if(state.shortPressed & 0x200) .... // trigger
}
}
Вт апр 20, 2021 10:50:40
Вт апр 20, 2021 11:18:03
Вт апр 20, 2021 11:20:00
Вт апр 20, 2021 11:29:38
#define StartPotok(pot) {static unsigned int pot##_EscapeIteration=1; \
static unsigned char pot##_StepOfPotok=0; \
if (pot##_EscapeIteration) {(pot##_EscapeIteration)--; \
if ((pot##_EscapeIteration)==0) { \
switch (pot##_StepOfPotok){case 0: (pot##_EscapeIteration)=0
//задержка в потоке (имя потока, номер задержки, длительность задержки-циклов)
#define Delay_n(pot,step,tim) pot##_StepOfPotok=step; pot##_EscapeIteration=(tim)+1; goto pot##_Escape; \
case(step): (pot##_EscapeIteration)=0 //inc(_NextStep)
//задержка в потоке (имя потока, номер задержки, длительность задержки-мс)
#define Delay_t(x,step,tim) Delay_n(x,step,(tim)*(Speed_temp))
//заканчиваем поток (имя потока)
#define EndPotok(pot) pot##_EscapeIteration=1; default: pot##_StepOfPotok=0; pot##_Escape:;};};};}
Вт апр 20, 2021 11:35:28
Dimon456 писал(а):С чего же начать, наверно вот с этого
это же надо было так завернуть-заворотить?Dimon456 писал(а):а потом вот это
Вт апр 20, 2021 11:35:58
Вт апр 20, 2021 13:42:15