Всем доброго времени суток. Спасибо, даже не ожидал такого внимания к моему вопросу. Отвечаю всем по порядку.
2 Zhuk72
Си уже по чуть-чуть начал учить, просто уже сделал проект простой древовидной менюшки на ассемблере, и хотел его "причесать", потому что в бессмертный PIC16F84 (1к слов) еле влезла менюшка 5 пунктов меню по 3 подпункта в каждом пункте (вместе с выводом на ЖК дисплей названий всех пунктов и подпунктов).
2 Аlex
Насчет использования макроса и пользе функции. Я понимаю что макрос не даст мне выиграша ни в чем, кроме общего восприятия кода в месте использования макроса. Я и хочу его использовать лишь для передачи внутрь процедуры адреса таблица в качестве параметра. Проблема в том что я не знаю, как передать АДРЕС ТАБЛИЦЫ в качестве параметра внутрь процедуры.
2 Albert_V
Все гораздо запущенее, я пишу для 12/16 Пиков

Но за примеры спасибо, утянул себе в примеры, на будущее.
2 BOB51
Нет, это уже есть реализовано, надо именно предать внутрь процедуры АДРЕС ТАБЛИЦЫ. Передать 8-битный указатель проблемы нет. А а вот адрес таблицы не умею

П.С. Кажется до меня дошло, как реализовать задуманное, я просто подходил не с той стороны, позже отпишусь...
П.П.С. Спасибо всем, у меню получилось реализовать задуманное. Менюшка похудела до 740 слов при том же функционале.
Спойлер
Код: Выделить всё
include MicroMenu_Lib.h
include HD44780_Lib.h
MicroMenu_Lib_udata udata_shr
symbol_pointer res 1
global symbol_pointer
extern Send_LCD_Symbol,Send_LCD_Command,Delay_4ms,Debounce_Delay
;===========================
MicroMenu code 0x100-4A
;===========================
Kursor
movlw b'10001111' ; Установим курсор на последний символ 1 строки
call Send_LCD_Command
movlw '<' ; И нарисуем там указатель текущего пункта меню
call Send_LCD_Symbol
movlw SECOND_LINE ; Переводим указатель на вторую строку
call Send_LCD_Command
return ; И приступаем к отрисовке следующего пункта меню
;===========================
Num_of_Submenu_Table ; Возвращаем количество пунктов нужного подменю, следить, чтобы все элементы данной таблицы находились на одной странице
movfw index_menu
clrf PCLATH
; bsf PCLATH,0 ; Если таблица размещена до адреса 0x0FF, закоментировать
addwf PCL
retlw_num_of_submenu_punkts
;===========================
Switch_Menu
call Debounce_Delay
movlw CLR_DISP
call Send_LCD_Command
call Delay_4ms ; Обязательная задержка после очистки дисплея !!!
call Switch_Menu_routine ; Рисуем текущий пункт меню
call Kursor ; Нарисуем признак текущего пункта меню
incf index_menu ; Берем следующий пункт
movfw index_menu
sublw NUM_OF_MAIN_MENU_PUNKTS ; Сравниваем с количеством пунктов меню
btfsc STATUS,Z
goto Correct_index_menu
call Switch_Menu_routine
decf index_menu ; Не забудем вернуть назад текущий пункт меню
return
Correct_index_menu ; Достигли последнего пункта меню, следующим отображаем 1 пункт
clrf index_menu
call Switch_Menu_routine
movlw NUM_OF_MAIN_MENU_PUNKTS-1
movwf index_menu
return
Switch_Menu_routine ; Подпрограмма вывода названия пункта меню на дисплей
clrf symbol_pointer
String
call Switch_Menu_Table
andlw 0FFh
btfsc STATUS,Z
return
call Send_LCD_Symbol
incf symbol_pointer
goto String
;----------
Switch_Submenu ; Поместим курсор на нужный подпункт нужного пункта
call Debounce_Delay
movlw CLR_DISP
call Send_LCD_Command
call Delay_4ms ; Обязательная задержка после очистки дисплея !!!
call Switch_Submenu_routine ; Рисуем текущий подпункт меню
call Kursor ; Нарисуем признак текущего подпункта меню
incf index_submenu
call Num_of_Submenu_Table
subwf index_submenu,w ; Сравниваем с количеством подпунктов меню
btfsc STATUS,Z
goto Correct_index_submenu
call Switch_Submenu_routine
decf index_submenu ; Не забудем вернуть назад текущий подпункт меню
return
Correct_index_submenu ; Достигли последнего подпункта меню, следующим отображаем 1 попункт
clrf index_submenu
call Switch_Submenu_routine
call Num_of_Submenu_Table
movwf index_submenu
decf index_submenu
return
Switch_Submenu_routine ; Подпрограмма вывода названия пункта подменю на дисплей
clrf symbol_pointer
String_
call Switch_Submenu_Table
andlw 0FFh
btfsc STATUS,Z
return
call Send_LCD_Symbol
incf symbol_pointer
goto String_
;===========================
Switch_Menu_Table
movfw index_menu
clrf PCLATH
bsf PCLATH,0
addwf PCL ; Эта команда должна находится в ячейке с адресом 0x0FF
goto_Punkt_Menu ; Макрос, создает теблицу переходов на пункты меню
;----------
Switch_Submenu_Table
movfw index_menu
clrf PCLATH
bsf PCLATH,0
addwf PCL
goto_Menu_X_Table ; Макрос, создает переходы на все подпункты меню
goto_Punkt_Submenu ; Супермакрос, создает цепочку макросов, в количестве пунктов меню
;===========================
Action_Switch ; Выполним действие, на котором находится курсор
call Debounce_Delay
movlw CLR_DISP
call Send_LCD_Command
call Delay_4ms ; Обязательная задержка после очистки дисплея !!!
movfw index_menu ; Берем выбраный пункт меню
clrf PCLATH
bsf PCLATH,0
addwf PCL ; Переходим на нужную ветку
goto_Menu_X_Table_action ; Макрос, создает переходы на все подпункты меню
goto_Punkt_Submenu_action ; Супермакрос, создает цепочку макросов, в количестве веток выполняемых действий
;===========================
Menu_1
add_PCL_symbol_pointer_0x100
dt "1.Guard On",0
Menu_2
add_PCL_symbol_pointer_0x100
dt "2.Guard Off",0
Menu_3
add_PCL_symbol_pointer_0x100
dt "3.Current Alarm",0
Menu_4
add_PCL_symbol_pointer_0x100
dt "4.Current Malfunction",0
Menu_5
add_PCL_symbol_pointer_0x100
dt "5.Option",0
;===========================
Menu_1_Submenu_1
add_PCL_symbol_pointer_0x100
dt "1.Garage",0
Menu_1_Submenu_2
add_PCL_symbol_pointer_0x100
dt "2.Doors",0
Menu_1_Submenu_3
add_PCL_symbol_pointer_0x100
dt "3.House",0
;----------
Table_Submenu code 0x200-4
Menu_2_Submenu_1
add_PCL_symbol_pointer_0x200
dt "1.Garage",0
Menu_2_Submenu_2
add_PCL_symbol_pointer_0x200
dt "2.Doors",0
Menu_2_Submenu_3
add_PCL_symbol_pointer_0x200
dt "3.House",0
;----------
Menu_3_Submenu_1
add_PCL_symbol_pointer_0x200
dt "1.Review",0
Menu_3_Submenu_2
add_PCL_symbol_pointer_0x200
dt "2.Shut Off",0
Menu_3_Submenu_3
add_PCL_symbol_pointer_0x200
dt "3.FAQ",0
;----------
Menu_4_Submenu_1
add_PCL_symbol_pointer_0x200
dt "1.Review",0
Menu_4_Submenu_2
add_PCL_symbol_pointer_0x200
dt "2.Shut Off",0
Menu_4_Submenu_3
add_PCL_symbol_pointer_0x200
dt "3.FAQ",0
;----------
Menu_5_Submenu_1
add_PCL_symbol_pointer_0x200
dt "1.Configuration",0
Menu_5_Submenu_2
add_PCL_symbol_pointer_0x200
dt "2.Settings",0
Menu_5_Submenu_3
add_PCL_symbol_pointer_0x200
dt "3.About",0
;===========================
Menu_1_Submenu_1_action ; Выполняем действие 1 подпункта 1 пункта
nop
return
Menu_1_Submenu_2_action ; Выполняем действие 2 подпункта 1 пункта
nop
return
Menu_1_Submenu_3_action ; Выполняем действие 3 подпункта 1 пункта
nop
return
;----------
Menu_2_Submenu_1_action ; Выполняем действие 1 подпункта 2 пункта
nop
return
Menu_2_Submenu_2_action ; Выполняем действие 2 подпункта 2 пункта
nop
return
Menu_2_Submenu_3_action ; Выполняем действие 3 подпункта 2 пункта
nop
return
;----------
Menu_3_Submenu_1_action ; Выполняем действие 1 подпункта 3 пункта
nop
return
Menu_3_Submenu_2_action ; Выполняем действие 2 подпункта 3 пункта
nop
return
Menu_3_Submenu_3_action ; Выполняем действие 3 подпункта 3 пункта
nop
return
;----------
Menu_4_Submenu_1_action ; Выполняем действие 1 подпункта 4 пункта
nop
return
Menu_4_Submenu_2_action ; Выполняем действие 2 подпункта 4 пункта
nop
return
Menu_4_Submenu_3_action ; Выполняем действие 3 подпункта 4 пункта
nop
return
;----------
Menu_5_Submenu_1_action ; Выполняем действие 1 подпункта 5 пункта
nop
return
Menu_5_Submenu_2_action ; Выполняем действие 2 подпункта 5 пункта
nop
return
Menu_5_Submenu_3_action ; Выполняем действие 3 подпункта 5 пункта
nop
return
;===========================
end