ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
270371 Топик полностью
mazur (06.09.2011 10:05, просмотров: 501) ответил mazur на Может это частная проблема, может,я все не так делаю... Посидел, подумал, почитал. Получается решение моих проблем одно-общая для всех автоматов область памяти. Иначе чтение\запись всевозможных параметров раздует код. Перебрал все скачанные
Есть функции обработки кнопок. Есть функции обработки меню. И есть редактируемые, а также выводимые на дисплей параметры. Функции обработки кнопок: 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 ;==================================================================================================