ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
12 июля
443262 Топик полностью
Mazur (18.09.2013 09:13 - 21.09.2013 22:08, просмотров: 166) ответил Mazur на Вынужден повторить свою просьбу. Заблудился окончательно. Мне нужно получить доступ к памяти программ через указатель. С индексом получается громоздко. А на попытки получить через указатель компилер ругается. Поделитесь для изучения, разбора
НеЗаработало! Разбираюсь. Разобрался. Выше.  // Макросы. #define clrb(reg, bit) reg &= (~(1<<(bit))) // Очистка бита. #define setb(reg, bit) reg |= (1<<(bit)) // Установка бита. #define prb(data) pgm_read_byte(&(data)) // Краткий аналог. #define prw(data) pgm_read_word(&(data)) // Краткий аналог. Это заработало: //======================================================================== // Таблица в памяти программ. Правда волосы дыбом встают от дизасма. typedef struct PROGMEM { u08 key; // Какая кнопка нажата. u08 key_cod; // Код кнопки } str_key_cod; str_key_cod tab_keys_code [] = { {KEY_ESC_BIT, KEY_ESC_COD}, {KEY_ENTER_BIT, KEY_ENTER_COD}, {KEY_UP_BIT, KEY_UP_COD}, {KEY_DOWN_BIT, KEY_DOWN_COD}, {KEY_PLUS_BIT, KEY_PLUS_COD}, {KEY_MINUS_BIT, KEY_MINUS_COD}, }; //------------------------------------------------------------------------ void (define_keys) (void) // Функция определения кода нажатой кнопки. { if (keys_flags & 1<<DEFINE_KEYS_FLG) // Если установлен этот флаг, определение кнопки, иначе выход. { clrb (keys_flags, DEFINE_KEYS_FLG); // Сброс флага. u08 i; // Если конец таблицы, то выход. for (i=0; prb (tab_keys_code [i]) != sizeof (tab_keys_code); i++) { // Если маска нажатой кнопки соответствует //значению из таблицы, то считываем код кнопки и записываем его в keys_buf. if (prb (tab_keys_code [i].key) == keys_curr) { keys_buf = prb (tab_keys_code [i].key_cod); break; } } } } Наконец-то заработало. Может, что не так, скажите. typedef struct PROGMEM { u08 key_cod; u08 state; u08 next_state; void (*p_t_StateFunc) (void); } tab_key_curr_next_func; tab_key_curr_next_func table_handlers_keys [] = { {KEY_ESC_COD, PROC_MENU_2, PROC_MENU_2, led_1_switch}, {KEY_ENTER_COD, PROC_MENU_2, PROC_MENU_2, led_2_switch}, {KEY_UP_COD, PROC_MENU_2, PROC_MENU_2, led_3_switch}, {KEY_DOWN_COD, PROC_MENU_2, PROC_MENU_2, led_4_switch}, {KEY_PLUS_COD, PROC_MENU_2, PROC_MENU_2, led_5_switch}, {KEY_MINUS_COD, PROC_MENU_2, PROC_MENU_2, led_6_switch}, }; #define LED_DDR DDRD void led_1_switch (void) { #define LED1 0 #define m_led_1_switch (LED_DDR ^= (1<<LED1)); m_led_1_switch; } void led_2_switch (void) { #define LED2 1 #define m_led_2_switch (LED_DDR ^= (1<<LED2)); m_led_2_switch; } void led_3_switch (void) { #define LED3 2 #define m_led_3_switch (LED_DDR ^= (1<<LED3)); m_led_3_switch; } void led_4_switch (void) { #define LED4 3 #define m_led_4_switch (LED_DDR ^= (1<<LED4)); m_led_4_switch; } void led_5_switch (void) { #define LED5 4 #define m_led_5_switch (LED_DDR ^= (1<<LED5)); m_led_5_switch; } void led_6_switch (void) { #define LED6 5 #define m_led_6_switch (LED_DDR ^= (1<<LED6)); m_led_6_switch; } void check_keys_buf (void) { if ((proc_menu_flags & (1<<PROC_MENU_RUN_FLG)) && (keys_buf != 0xFF)) { void (*p_t_StateFunc) (void); p_t_StateFunc = NULL; u08 i; for (i=0; prb(table_handlers_keys[i]) != sizeof(table_handlers_keys); i++) { if (prb(table_handlers_keys[i].key_cod) == keys_buf && _proc_menu == prb(table_handlers_keys[i].state)) { keys_buf = 0xFF; _proc_menu = prb(table_handlers_keys[i].next_state); p_t_StateFunc = prw(table_handlers_keys[i].p_t_StateFunc); break; } } if ((*p_t_StateFunc)) (*p_t_StateFunc) (); } }