Вс ноя 06, 2022 11:48:40
if(flag_TIMER1 == ON)
{
flag_TIMER1 = OFF;
TCCR1B &= ~((1<<CS10)|(1<<CS12)); // anti-bounce timer stop
uint8_t buttonState = 0; // буфер для текущего состояния кнопок
buttonState = PINB ^ 0x07; // проверяем какая кнопка нажата
switch(buttonState)
{
case BACK: {direct = DIR_BACK; step = 0xFFFF; flag_ROLLBACK = OFF; TCCR0B |= (1<<CS00)|(1<<CS02);} break; // back
case FORWARD: {direct = DIR_FORWARD; step = 0xFFFF; flag_ROLLBACK = OFF; TCCR0B |= (1<<CS00)|(1<<CS02);} break; // forward
case STEP_FWRD: {direct = DIR_FORWARD; step = val_step_fwrd; flag_ROLLBACK = ON; TCCR0B |= (1<<CS00)|(1<<CS02);} break; // step forward
case 0: step = 0; break;
}
GIFR |= (1<<PCIF1); // Flag External Interrupt clear
GIMSK |= (1<<PCIE1); // External Interrupt Pin Change Interrupt Enable 1
stepper_motor();
}
Вс ноя 06, 2022 12:00:34
Вс ноя 06, 2022 12:02:09
uint8_t buttonState = 0; // буфер для текущего состояния кнопок
buttonState = PINB ^ 0x07; // проверяем какая кнопка нажата
switch(buttonState)
switch(PINB ^ 0x07)
Вс ноя 06, 2022 12:07:26
Вс ноя 06, 2022 12:12:03
uint8_t buttonState = 0; // буфер для текущего состояния кнопок
buttonState = PINB ^ 0x07; // проверяем какая кнопка нажата
uint8_t buttonState = PINB ^ 0x07; // буфер для текущего состояния кнопок // проверяем какая кнопка нажата
Вс ноя 06, 2022 12:16:24
Вс ноя 06, 2022 12:20:47
Вс ноя 06, 2022 12:21:46
это что?Land писал(а):Трабл
Вс ноя 06, 2022 12:50:54
Вс ноя 06, 2022 13:01:14
Вс ноя 06, 2022 13:25:31
Вс ноя 06, 2022 13:27:37
Вс ноя 06, 2022 17:48:16
//==================
#ifdef __IOTINY13_H
#define ST_TCNT TCNT0
#define ST_TIMSK TIMSK0
#define ST_OCIE OCIE0A
#define ST_OCR OCR0A
#define ST_TCCR TCCR0B
#define ST_CS0 CS00
#define ST_CS1 CS01
#define ST_CS2 CS02
#define ST_TIFR TIFR0
#define ST_OCF OCF0A
#endif
#ifdef __IOTINY13A_H
#define ST_TCNT TCNT0
#define ST_TIMSK TIMSK0
#define ST_OCIE OCIE0A
#define ST_OCR OCR0A
#define ST_TCCR TCCR0B
#define ST_CS0 CS00
#define ST_CS1 CS01
#define ST_CS2 CS02
#define ST_TIFR TIFR0
#define ST_OCF OCF0A
#endif
#ifdef __IOM8A_H
#define ST_TCNT TCNT2
#define ST_TIMSK TIMSK
#define ST_TIFR TIFR
#define ST_OCIE OCIE2
#define ST_OCR OCR2
#define ST_TCCR TCCR2
#define ST_CS0 CS20
#define ST_CS1 CS21
#define ST_CS2 CS22
#define ST_TIFR TIFR
#define ST_OCF OCF2
#endif
//==================
//==================
#define SYS_TICK (F_CPU/64/1000)
//==================
//==================
#ifdef __ST_INTERRUPT__
#pragma vector = TIMER2_COMP_vect
__interrupt void SysTimerComp (void)
{
static u08 cnt;
ST_OCR += SYS_TICK;
sys_tick++;
if (cnt++ >= 30) // Подавление дребезга.
{
cnt = 0;
kbd_drv ();
}
}
#endif
//==================
//==================
void Init_Soft_Timers (void)
{
sys_tick = 0;
ST_TCNT = 0;
ST_OCR = SYS_TICK;
#ifdef __IOTINY13_H
ST_TCCR |= ((1<<ST_CS1) | (1<<ST_CS0));
#endif
#ifdef __IOTINY13A_H
ST_TCCR |= ((1<<ST_CS1) | (1<<ST_CS0));
#endif
#ifdef __IOM8A_H
ST_TCCR |= (1<<ST_CS2);
#endif
#ifdef __ST_INTERRUPT__
set_bit (ST_TIMSK, ST_OCIE);
#endif
}
//==================
#ifndef KBD_DRV_H
#define KBD_DRV_H
#include "kbd_drv.h"
#include "main_def_func.h"
//==================
//==================
#ifdef __PROJECT_MODE_WORK__
#define DEBOUNCE_DELAY 30
//#define DEBOUNCE_DELAY 3
#endif
#ifdef __PROJECT_MODE_DEBUG__
#define DEBOUNCE_DELAY 3
#endif
//==================
//==================
#define KEY_1_PIN PINB
#define KEY_1 0
#define KEY_1_BIT (1<<0)
#define KEY_2_PIN PINB
#define KEY_2 1
#define KEY_2_BIT (1<<1)
#define KEY_3_PIN PINB
#define KEY_3 2
#define KEY_3_BIT (1<<2)
//==================
//==================
//#define KEY1_PRESSED() ((KEYS1_PIN & (1<<BIT_KEY1) == 0)
//#define KEY1_UNPRESSED() ((KEYS1_PIN & (1<<BIT_KEY1) == 1)
#ifdef __IOTINY13_H
#define Set_Is_Key_Pressed() check_bit (KEY_PIN, KEY) // High level.
#define Set_Is_Key_UnPressed() !(check_bit (KEY_PIN, KEY)) // Low level.
#endif
#ifdef __IOTINY13A_H
#define Set_Is_Key_Pressed() check_bit (KEY_PIN, KEY) // High level.
#define Set_Is_Key_UnPressed() !(check_bit (KEY_PIN, KEY)) // Low level.
#endif
#ifdef __IOM8A_H
#define check_key_1() (!(check_bit (KEY_1_PIN, KEY_1))) // Low level. |
#define check_key_2() (!(check_bit (KEY_2_PIN, KEY_2))) // Low level. |- Общий плюс.
#define check_key_3() (!(check_bit (KEY_3_PIN, KEY_3))) // Low level. |
#endif
// При работе с буфером входов (расширение ввода-вывода):
// #define Set_Is_Key_Stop_Pressed() check_bit (inputs_buf [0], KEY_STOP)
//==================
//==================
typedef enum _kbd_drv
{
KBD_DRV_NONE = 0,
KBD_DRV_WAIT_DOWN,
KBD_DRV_DOWN,
KBD_DRV_WAIT_UP,
} kbd_drv_t;
//==================
//==================
typedef enum kbd_codes
{
KEY_NULL_COD = 0,
KEY_1_COD,
KEY_2_COD,
KEY_3_COD,
} kbd_codes_t;
//==================
//==================
void kbd_drv (void);
void Set_Key_Cod (void);
kbd_codes_t Get_Key_Code (void);
//==================
#endif
//==================
#include "kbd_drv.h"
//==================
//==================
static u08 prev_keys;
static u08 curr_keys;
static kbd_codes_t keys_buf;
//==================
//==================
void scan_keys (void)
{
curr_keys = 0;
if (check_key_1())
set_bit (curr_keys, 0);
if (check_key_2())
set_bit (curr_keys, 1);
if (check_key_3())
set_bit (curr_keys, 2);
}
//==================
//==================
void kbd_drv (void)
{
static kbd_drv_t _kbd_drv;
// static soft_timer_t ST_KBD;
scan_keys ();
switch (_kbd_drv)
{
case KBD_DRV_NONE:
if (curr_keys)
{
prev_keys = curr_keys;
// set_soft_timer (ST_KBD, DEBOUNCE_DELAY);
_kbd_drv = KBD_DRV_WAIT_DOWN;
}
break;
case KBD_DRV_WAIT_DOWN:
// if (handle_soft_timer (ST_KBD)) // Таймер подавления дребезга.
// {
if (curr_keys && (prev_keys == curr_keys))
{
Set_Key_Cod ();
// Set_Event (EV_ID_KEY_PRESSED, USER_EVENT);
_kbd_drv = KBD_DRV_DOWN;
}
else
_kbd_drv = KBD_DRV_NONE;
prev_keys = curr_keys;
// }
break;
case KBD_DRV_DOWN:
if (!curr_keys)
{
// set_soft_timer (ST_KBD, DEBOUNCE_DELAY);
_kbd_drv = KBD_DRV_WAIT_UP;
}
break;
case KBD_DRV_WAIT_UP:
// if (handle_soft_timer (ST_KBD)) // Таймер подавления дребезга.
// {
if (!curr_keys)
{
Set_Event (EV_ID_KEY_UNPRESSED, USER_EVENT);
_kbd_drv = KBD_DRV_NONE;
}
else
_kbd_drv = KBD_DRV_DOWN;
prev_keys = curr_keys;
// }
break;
}
}
//==================
//==================
void Set_Key_Cod (void)
{
switch (curr_keys)
{
case KEY_1_BIT:
keys_buf = KEY_1_COD;
break;
case KEY_2_BIT:
keys_buf = KEY_2_COD;
break;
case KEY_3_BIT:
keys_buf = KEY_3_COD;
break;
default:
keys_buf = KEY_NULL_COD;
}
}
kbd_codes_t Get_Key_Code (void)
{
return keys_buf;
}
//==================
Вс ноя 06, 2022 18:21:07
Вс ноя 06, 2022 18:22:57
Вс ноя 06, 2022 18:35:02
12 //==================
\ In segment CODE, align 2, keep-with-next
13 void scan_keys (void)
\ scan_keys:
14 {
15 curr_keys = 0;
\ 00000000 E000 LDI R16, 0
16
17 if (check_key_1())
\ 00000002 9BB0 SBIS 0x16, 0x00
18 set_bit (curr_keys, 0);
\ 00000004 E001 LDI R16, 1
19
20 if (check_key_2())
\ ??scan_keys_0:
\ 00000006 9BB1 SBIS 0x16, 0x01
21 set_bit (curr_keys, 1);
\ 00000008 6002 ORI R16, 0x02
22
23 if (check_key_3())
\ ??scan_keys_1:
\ 0000000A 9BB2 SBIS 0x16, 0x02
24 set_bit (curr_keys, 2);
\ 0000000C 6004 ORI R16, 0x04
\ ??scan_keys_2:
\ 0000000E 9300.... STS (prev_keys + 1), R16
25 }
\ 00000012 9508 RET
\ 00000014 REQUIRE _A_PINB
26 //==================
Вс ноя 06, 2022 18:35:15
Вс ноя 06, 2022 18:44:55
Вс ноя 06, 2022 18:47:32
Вс ноя 06, 2022 18:54:06