Это только в Keil-ARM работает, судя по всему. Пытался то же сделать в Keil C51 - аналогично, никак. Об этом и в хелпе писано.ADCSRAs->[вот тут должен вывалиться список...]
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Это только в Keil-ARM работает, судя по всему. Пытался то же сделать в Keil C51 - аналогично, никак. Об этом и в хелпе писано.ADCSRAs->[вот тут должен вывалиться список...]
можно попробовать Микрософт VS Codeuk8amk писал(а):И вообще что сейчас годное есть?
Код: Выделить всё
typedef enum{
STOP=0,
UP=1,
DOWN=2
} DEV_STA_t;
void main(void)
{
DEV_STA_t s;
s = ?
}Код: Выделить всё
enum{
CMD_STOP,
CMD_UP,
CMD_DN
};.Погуглил. Показалось интересным. Правда для моего проекта это мало интересно - слишком прост, чтобы в дебаггере ковыряться. Но, решил попробовать. Нашел в исходнике кучу #define и решил их превратить в enum.Use project enums instead of #define for ON and OFF.
Код: Выделить всё
#define KEY_SET 0x40
#define KEY_MODE 0x10
#define KEYMASK (KEY_SET | KEY_MODE)
#define HOLDED (1<<0)
#define KEY_RELEASE (1<<1) Код: Выделить всё
typedef enum KEY_DEFINITION {
KEY_SET = 0x40,
KEY_MODE = 0x10,
KEY_RELEASE = 0x02
} keys_t; А в чём некорректность? Неудобство обработки? Как вариант:uldemir писал(а):Тогда я бы мог переменной, куда читаю кнопки присвоить тип keys_t, да вот беда в том, что у них может быть аттрибут "повторения". И чтобы это работало корректно, надо определить еще по одному варианту для каждой кнопки (и еще вариант возврата "пустоты" - 0x00).
Можно ли это как сделать корректно или ну его нафиг?
Код: Выделить всё
[...]
case KEY_SET_REPEAT:
repeat = true;
// no break
case KEY_SET:
// обрабатываем с учётом флага
break;
[...]
Код: Выделить всё
return readkey; Код: Выделить всё
return readkey | HOLDED; Код: Выделить всё
// Функция опроса клавиатуры
// kbddelay = 448 - соответствует 1с. 1/488 = 2ms
#define DEBOUNCE_DELAY 6 // 6*2=12ms - подавление дребезга
#define REPEAT_DELAY (SCANPERSECOND/3*2) // 0.66c - задержка перед повтором
#define REPEAT_PERIOD (SCANPERSECOND/3) // 0.33c - период автоповтора
unsigned char kbdread(void) {
unsigned char readkey;
static unsigned char repeated, prevkey;
readkey = (PORTC ^ KEYMASK) & KEYMASK;
if (readkey == 0) { // not pressed
repeated = 0;
prevkey = 0;
kbddelay = 0;
return KEY_RELEASE;
} else {
if (prevkey != readkey){ // now pressed
prevkey = readkey;
repeated = 0;
kbddelay = DEBOUNCE_DELAY;
return 0;
}
else {
if (readkey == prevkey) {
if (kbddelay == 0) {
if (repeated) {
kbddelay = REPEAT_PERIOD;
return readkey | HOLDED;
}
else {
kbddelay = REPEAT_DELAY;
repeated = 1;
return readkey;
}
}
}
}
}
return 0;Код: Выделить всё
#include <mega8.h>
#include <io.h>
volatile unsigned char numl=0, nump=0, num_al=0, switch_arr[3]={1,2,3}, flag;
#define poworoty PORTB
#define left_sig 0
#define right_sig 1
#define left_butt PIND.0
#define right_butt PIND.1
#define alarm_butt PIND.2
#define left_on poworoty |= (1<<left_sig)
#define left_off poworoty &= ~ (1<<left_sig)
#define right_on poworoty |= (1<<right_sig)
#define right_off poworoty &= ~ (1<<right_sig)
#define alarm_on poworoty |= (1<<left_sig)|(1<<right_sig)
#define alarm_off poworoty &= ~ ((1<<right_sig)|(1<<left_sig))
// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
num_al++; //счетчик аварийки
nump++; //счетчик правого
numl++; //счетчик левого
TCNT1H=0;
TCNT1L=0;
}
void switcher () { //функция включения соответствующих портов
if (flag==1){
switch (numl){
case 0: left_off; break;
case 1: left_on; break;
case 2: numl=0; break;
}
}
else if (flag==2) {
switch (nump){
case 0: right_on; break;
case 1: right_off; break;
case 2: nump=0; break;
}
}
else if (flag==3) {
switch (num_al){
case 0: alarm_on; break;
case 1: alarm_off; break;
case 2: num_al=0; break;
}
}
}
void main(void)
{
// Declare your local variables here
DDRD = 0x00; // порт D на вход
PORTD = 0xFF; // подключаем внутренние подтяг. резисторы
DDRB = 0xFF; // порт B на выход
PORTB = 0x00; // устанавливаем нули на выходе
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (1<<CS10);
TCNT1H=0x0B;
TCNT1L=0xDC;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (1<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0);
// Global enable interrupts
#asm("sei")
while (1)
{
if (!left_butt) {flag=switch_arr[0]; switcher ();} else if (left_butt) {left_off; numl=0;}
//Правый указатель
if (!right_butt) {flag=switch_arr[1]; switcher ();} else if (right_butt) {right_off; nump=0;}
//Аварийка.
if (!alarm_butt) {flag=switch_arr[2]; switcher ();} else if (alarm_butt) {alarm_off; num_al=0;} ///через ету строку не работает все, то есть контроллер начинает переключать выводы на высокой частоте.
}
}Код: Выделить всё
typedef enum{
STATE_OFF,
STATE_LEFT,
STATE_RIGHT,
STATE_ALARM
} states;
states state;
volatile int counter;
interrupt [TIM1_COMPA] void timer1_compa_isr(void){
counter++;
}
void main(void){
// тут добавить настройки таймера и портов
if(!alarm_butt) state = STATE_ALARM;
else if(!left_butt) state = STATE_LEFT;
else if(!right_butt) state = STATE_RIGHT;
else state = STATE_OFF;
switch(state){
case STATE_OFF:
left_off;
right_off;
break;
case STATE_LEFT:
if(counter & 1)
left_on;
else
left_off;
break;
case STATE_RIGHT:
if(counter & 1)
right_on;
else
right_off;
break;
case STATE_ALARM:
if(counter & 1){
right_on;
left_on;
} else {
right_off;
right_off;
}
break;
}
}
Код: Выделить всё
typedef enum{
STATE_OFF,
STATE_LEFT,
STATE_RIGHT,
STATE_ALARM
} states;
states state;
volatile int counter;
interrupt [TIM1_COMPA] void timer1_compa_isr(void){
counter++;
}
void main(void){
// тут добавить настройки таймера и портов
while(1){
if(!alarm_butt) state = STATE_ALARM;
else if(!left_butt) state = STATE_LEFT;
else if(!right_butt) state = STATE_RIGHT;
else state = STATE_OFF;
if(counter & 1)
switch(state){
case STATE_LEFT: left_on; break;
case STATE_RIGHT: right_on; break;
case STATE_ALARM: right_on; left_on; break;
}
else {
left_off;
right_off;
}
}
}Код: Выделить всё
typedef enum KEY_DEFINITION {
KEY_NO_DATA = 0u,
KEY_SET = 0x40u,
KEY_MODE = 0x10u,
KEY_RELEASE = 0x02u
} keys_t;
#define KEYMASK (unsigned char)(KEY_SET | KEY_MODE)
unsigned char kbdread(void) {
unsigned char readkey;
static unsigned char repeated, prevkey;
readkey = (PORTC ^ KEYMASK) & KEYMASK;Код: Выделить всё
#define PORTC PORTC
extern volatile unsigned char PORTC @ 0x007;Код: Выделить всё
(PORTC ^ KEYMASK) & KEYMASKКод: Выделить всё
(PORTC ^ KEYMASK) & KEYMASKКод: Выделить всё
readkey = (PORTC ^ KEYMASK) & KEYMASK; Код: Выделить всё
int tmp = (PORTC ^ KEYMASK) & KEYMASK;
readkey = tmp; Код: Выделить всё
#define KEY_SET (1u<<6)
#define KEY_MODE (1u<<4)
#define KEY_RELEASE (1u<<1)
#define KEYMASK (KEY_SET | KEY_MODE)XC8 v1.42 pic16f723aКакой компилятор и проц ?
1. Избегайте логических операций с константами enum, иначе могут появляться предупреждения несоответствия типа Warning[Pe188]. Причина в том, что операторы логики дают в результате своей работы целый тип, а не тот тип, который определен в typedef enum. Задавать битовый маски константами enum тоже плохая идея.