Есть функции обработки кнопок. Есть функции обработки меню. И есть редактируемые, а также выводимые на дисплей параметры. Функции обработки кнопок:
KBD_DRV:
ldiy _KEYS_FLAGS ; Указатель на переменные.
ldd FLAGS,Y+DISP_KEYS_FLAGS ; Считывание флагов.
Scan_Keys ; Макрос сканирование кнопок. Дефайнами подставляются нужные функции. Порт\Матрица\Несколько портов.
Init_FSM _KEYS,Table_KBD_DRV_FSM
rcall Process_FSM ; Вызов автомата обработки кнопок.
sbrc FLAGS,DEFINE_KEYS_FLG ; Если этот флаг установлен,
rcall Define_Keys ; определяем, какая кнопка нажата.
std Y+DISP_KEYS_FLAGS,FLAGS ; Сохранение флагов.
ret
Keys_Init:
Init_KBD_DRV
ldi r16,_KEYS_NONE
std Y+DISP_KEYS,r16
Keys_None:
sbrs FLAGS,KEYS_PRESSED_FLG ; Если что-то нажато, то переход.
ret
Read_Keys_Current
Save_Keys_Prev
Set_Timer ST_KBD_DRV,1<<ST_BLOCK_FLG,DEBOUNC_DELAY
ldi r16,_KEYS_DOWN
std Y+DISP_KEYS,r16
Keys_NONE_End:
ret
Keys_Down:
Check_Time_Out ST_KBD_DRV
sbrs r16,ST_TIME_OUT_FLG
ret
sbrs FLAGS,KEYS_PRESSED_FLG
rjmp Keys_Set_None
Read_Compare_Keys
brne Keys_Set_None
sbr FLAGS,1<<DEFINE_KEYS_FLG
#if (HOLD==NO)
ldi r16,_KEYS_WAIT_UP
std Y+DISP_KEYS,r16
#elif (HOLD==YES)
Set_Timer ST_KBD_DRV,1<<ST_BLOCK_FLG,HOLD_DELAY
ldi r16,_KEYS_HOLD
std Y+DISP_KEYS,r16
#endif
ret
Keys_Set_None:
ldi r16,_KEYS_NONE
std Y+DISP_KEYS,r16
ret
Keys_Set_Wait_Up:
ldi r16,_KEYS_WAIT_UP
std Y+DISP_KEYS,r16
ret
#if (HOLD==YES)
Keys_Hold:
sbrs FLAGS,KEYS_PRESSED_FLG
rjmp Keys_Set_Wait_Up
Read_Compare_Keys
brne Keys_Set_None
Check_Time_Out ST_KBD_DRV
sbrs r16,ST_TIME_OUT_FLG
ret
sbr FLAGS,1<<DEFINE_KEYS_FLG
Set_Timer ST_KBD_DRV,(1<<ST_BLOCK_FLG | 1<<ST_RERUN_FLG),REPEAT_DELAY
ldi r16,_KEYS_REPEAT
std Y+DISP_KEYS,r16
ret
Keys_Repeat:
sbrs FLAGS,KEYS_PRESSED_FLG
rjmp Keys_Set_Wait_Up
Read_Compare_Keys
brne Keys_Set_None
Check_Time_Out ST_KBD_DRV
sbrs r16,ST_TIME_OUT_FLG
ret
sbr FLAGS,1<<DEFINE_KEYS_FLG
ret
#endif
Keys_WAIT_UP:
sbrc FLAGS,KEYS_PRESSED_FLG
ret
Set_Timer ST_KBD_DRV,1<<ST_BLOCK_FLG,DEBOUNC_DELAY
ldi r16,_KEYS_UP
std Y+DISP_KEYS,r16
Keys_WAIT_UP_END:
ret
Keys_UP:
Check_Time_Out ST_KBD_DRV
sbrs r16,ST_TIME_OUT_FLG
ret
sbrc FLAGS,KEYS_PRESSED_FLG
rjmp Keys_Set_Wait_Up
sts (ST_CNT_QUEUE+(ST_KBD_DRV*(ST_SIZE+1))),RCLR
ldi r16,_KEYS_NONE
std Y+DISP_KEYS,r16
ret
;=========================================================================
Define_Keys:
ldiz Table_Keys_Code
shiftlwz
ldd r16,Y+DISP_KEYS_CURRENT
Define_Keys_Cycle:
lpm r17,Z+
cpi r17,0xFF
breq Not_Define_Keys
cp r16,r17
breq Define_Keys_Equal
lpm r17,Z+
rjmp Define_Keys_Cycle
Define_Keys_Equal:
lpm r16,Z
std Y+DISP_KEYS_CODE,r16
cbr FLAGS,1<<DEFINE_KEYS_FLG
ret
Not_Define_Keys:
ser r16
ret
;=========================================================================
Process_Codes_Keys:
ldiy _PROC_MENU_FLAGS ; Указатель на переменные функций обработки меню.
ld FLAGS,Y
Init_FSM _KEYS_CODE,Table_Proc_Codes_Keys_FSM
rcall Process_FSM
st Y,FLAGS
ret
Process_Plus:
ldd ZH,Y+(DISP_PARAM_MENU_ITEM+12)
ldd ZL,Y+(DISP_PARAM_MENU_ITEM+13)
cp ZL,RCLR
cpc ZH,RCLR
breq Process_Plus_End
clr r17
ijmp
Process_Plus_End:
ret
Process_Minus:
ldd ZH,Y+(DISP_PARAM_MENU_ITEM+14)
ldd ZL,Y+(DISP_PARAM_MENU_ITEM+15)
cp ZL,RCLR
cpc ZH,RCLR
breq Process_Minus_End
ldi r17,1<<0
ijmp
Process_Minus_End:
ret
Table_KBD_DRV_FSM:
.db _QUANT_KEYS_STATES,tab_h(Table_KBD_DRV),_ERROR_KBD_DRV
Table_KBD_DRV:
.db tab_h(Keys_Init)
.db tab_h(Keys_None)
.db tab_h(Keys_Down)
.db tab_h(Keys_Hold)
.db tab_h(Keys_Repeat)
.db tab_h(Keys_Wait_Up)
.db tab_h(Keys_Up)
Table_Keys_Code:
.db 0b00000001, 0
.db 0b00000010, 1
.db 0b00000100, 2
.db 0b00001000, 3
.db 0b00010000, 4
.db 0b00100000, 5
.db 0b01000000, 6
.db 0b10000000, 7
Table_Proc_Codes_Keys_FSM:
.db _QUANT_KEYS_CODE,tab_h(Table_Proc_Codes_Keys),_ERROR_KEYS
Table_Proc_Codes_Keys:
.db tab_h(Process_Enter)
.db tab_h(Process_Ecs)
.db tab_h(Process_Up)
.db tab_h(Process_Down)
.db tab_h(Process_Plus)
.db tab_h(Process_Minus)
Обработчик меню:
Process_Menu:
ldiy _PROC_MENU_FLAGS
ld FLAGS,Y ; Считывание флагов.
sbrc FLAGS,PROC_MENU_RUN_FLG ; Если флаг сброшен,
rjmp Process_Menu_Run
Process_Menu_Init:
sbr FLAGS,1<<PROC_MENU_RUN_FLG | 1<<MENU_CHANGE_FLG | 1<<READ_PARAM_MENU_ITEM_FLG
ldi r16,HIGH(Main_Menu*2)
std Y+DISP_POINT_MENU_H,r16
ldi r16,LOW(Main_Menu*2)
std Y+DISP_POINT_MENU_L,r16
Process_Menu_Run:
sbrc FLAGS,MENU_CHANGE_FLG
rcall Out_Menu_Messages ; Вывод статических сообщений.
sbrc FLAGS,READ_PARAM_MENU_ITEM_FLG
rcall Read_Param_Menu_Item ; Считывание параметров текущего пункта меню.
sbrc FLAGS,CHECK_CURSOR_FLG
rcall Check_Cursor
sbrc FLAGS,SHOW_CURSOR_FLG
rcall Show_Cursor
st Y,FLAGS ; Сохранение флагов.
Process_Param_Menu:
ldd ZH,Y+DISP_POINT_PARAM_MENU_H ; Переход на обработчик текущего меню. Если никаких действий не требуется,
ldd ZL,Y+DISP_POINT_PARAM_MENU_L ; то это пустое действие. Если требуется, обрабатываются динамические действия.
ijmp
;==================================================================================================
Process_Main_Menu:
ldiy _PROC_WELD_FLAGS
Convert_Num_Prog LINE_BUF_0+15 ; Номер программы.
rcall CHECK_MODE
CHECK_WELDING_MAIN:
rcall CHECK_WELDING
CHECK_TREADLE:
lds r16,_TREADLE_FLAGS
sbrc r16,TREADLE_PRESSED_FLG
rjmp CHECK_TREADLE_PRESSED
CHECK_TREADLE_UNPRESSED:
Clear_String LINE_BUF_3, 20
ldiz T_TREADLE_UNPRESSED*2
ldix LINE_BUF_3+3
rcall Out_Text
ret
CHECK_TREADLE_PRESSED:
Clear_String LINE_BUF_3, 20
ldiz T_WELDING*2
ldix LINE_BUF_3+7
rcall Out_Text
Process_Main_Menu_End:
ret
;==================================================================================================
;==================================================================================================
Process_Menu_Settings_2:
ldiy _PROC_WELD_FLAGS
Convert_Param_XX_X LINE_BUF_0+16,DISP_COMP_1_BUF ; Сжатие 1
Convert_Param_XX_X LINE_BUF_1+16,DISP_COMP_2_BUF ; Сжатие 2
Convert_Param_XX_X LINE_BUF_2+16,DISP_WELD_1_BUF ; Сварка 1
Convert_Param_XX_X LINE_BUF_3+16,DISP_FORG_1_BUF ; Проковка 1
ret
;==================================================================================================
Change_Number_Programms:
Change_Param DISP_NUM_PROG_BUF,QUANT_PROG-1
ldix NUM_PROG_EE
mov EEDREG,r16
rcall EEWrite
rcall Read_Parameters_EEPROM
ret
Change_Comp_1:
Change_Param DISP_COMP_1_BUF,100 ; 100-MAX_VALUE
ret
Change_Comp_2:
Change_Param DISP_COMP_2_BUF,100
ret
Change_Weld_1:
Change_Param DISP_WELD_1_BUF,100
ret
Change_Forg_1:
Change_Param DISP_FORG_1_BUF,100
ret
;==================================================================================================
; 1) Enter - Вход в подменю (если есть),; выполнение функции.
; 0 - Empty_Action, 1 - Подменю, 2 - Action. Адреса: Выводимое подменю, выполняемая функция.
; 2) Esc - Выход из режима "Программирование". Выход из подменю.
; 0 - Empty_Action, 1 - Родительское меню. Адрес родительского подменю.
; 3) Вверх - Перемещение вверх указателя по пунктам меню.
; 4) Вниз - Перемещение вниз указателя по пунктам меню.
; 5) Плюс - Изменение параметра. Таблица параметров.
; 6) Минус - Изменение параметра. Таблица параметров.
.macro Make_Menu_Item
; Esc Enter Up Down Plus Minus
.db @0,tab_h(@1*2), @2,tab_h(@3), @4,tab_h(@5), @6,tab_h(@7), tab_h(@8), tab_h(@9)
.endmacro
.macro End_Menu
.db 0,0
.endmacro
.macro End_Messages
.db 0xFF,0xFF
.endmacro
.macro No_Menu_Parameters
.db 0,0
.endmacro
.macro No_Cursor
.db 0,0
.endmacro
;==================================================================================================
;==================================================================================================
MAIN_MENU:
.db tab_h(LINE_BUF_0+5), tab_h(T_PROGRAMMA*2)
End_Messages
No_Cursor
.db tab_h(Process_Main_Menu)
; Esc Enter Up Down Plus Minus
Make_Menu_Item 0,0, 1,MENU_2, 0,0, 0,0, Empty_Action, Empty_Action
End_Menu
T_PROGRAMMA:
.db "ПРОГРАММА", 0
T_MODE_WORKS:
.db "РЕЖИМ РАБОТЫ", 0, 0
T_ONE_WELDING:
.db "ОДИНОЧНАЯ СВАРКА", 0, 0
T_SERIES_WELDINGS:
.db "СЕРИЯ СВАРОК", 0, 0
T_WELDING_OFF:
.db "СВАРКА ОТКЛЮЧЕНА", 0, 0
T_WELDING_ON:
.db "СВАРКА ВКЛЮЧЕНА", 0
T_TREADLE_UNPRESSED:
.db "НАЖМИТЕ ПЕДАЛЬ", 0, 0
;==================================================================================================
;==================================================================================================
MENU_SETTINGS_2:
.db tab_h(LINE_BUF_0+1), tab_h(T_COMPRESSING_1*2)
.db tab_h(LINE_BUF_1+1), tab_h(T_COMPRESSING_2*2)
.db tab_h(LINE_BUF_2+1), tab_h(T_WELDING_1*2)
.db tab_h(LINE_BUF_3+1), tab_h(T_PROKOVKA_1*2)
End_Messages
.db tab_h(LINE_BUF_0)
.db tab_h(Process_Menu_Settings_2)
; Esc Enter Up Down Plus Minus
Make_Menu_Item 1,MENU_2, 0,0, 2,MENU_SETTINGS_1, 1,LINE_BUF_1, Change_Comp_1, Change_Comp_1
Make_Menu_Item 1,MENU_2, 0,0, 1,LINE_BUF_0, 1,LINE_BUF_2, Change_Comp_2, Change_Comp_2
Make_Menu_Item 1,MENU_2, 0,0, 1,LINE_BUF_1, 1,LINE_BUF_3, Change_Weld_1, Change_Weld_1
Make_Menu_Item 1,MENU_2, 0,0, 1,LINE_BUF_2, 2,MENU_SETTINGS_3, Change_Forg_1, Change_Forg_1
End_Menu
T_COMPRESSING_1:
.db "СЖАТИЕ 1", 0, 0
T_COMPRESSING_2:
.db "СЖАТИЕ 2", 0, 0
T_WELDING_1:
.db "СВАРКА 1", 0, 0
T_PROKOVKA_1:
.db "ПРОКОВКА 1", 0, 0
;==================================================================================================