; CALCULATOR Version: 1.1 ; Калькулятор на PIC16F873 ; Автор программы: Батов Игорь Александрович ; Контрольная сумма: 0x809C ; Размер: 2943 инструкций LIST P=16F873 #include __CONFIG 03D33H ;__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _RC_OSC ERRORLEVEL -306 ERRORLEVEL -302 ;************************************************************************************* ; Регистры воздействия ;************************************************************************************* VOZ1 EQU 0x20 VOZ2 EQU 0x21 VOZ3 EQU 0x22 VOZ4 EQU 0x23 VOZ5 EQU 0x24 VOZ6 EQU 0x25 VOZ7 EQU 0x26 ;************************************************************************************* ; Регистры дополнительного ВОЗДЕЙСТВИЯ ;************************************************************************************* DOPVOZ1 EQU 0x27 DOPVOZ2 EQU 0x28 DOPVOZ3 EQU 0x29 DOPVOZ4 EQU 0x2A DOPVOZ5 EQU 0x2B DOPVOZ6 EQU 0x2C DOPVOZ7 EQU 0x2D DOPVOZ8 EQU 0x2E ;************************************************************************************* ; Регистры принятия ;************************************************************************************* PRIN1 EQU 0x2F PRIN2 EQU 0x30 PRIN3 EQU 0x31 PRIN4 EQU 0x32 PRIN5 EQU 0x33 PRIN6 EQU 0x34 PRIN7 EQU 0x35 ;************************************************************************************* ; Регистры дополнительного ПРИНЯТИЯ ;************************************************************************************* DOPPRIN1 EQU 0x36 DOPPRIN2 EQU 0x37 DOPPRIN3 EQU 0x38 DOPPRIN4 EQU 0x39 DOPPRIN5 EQU 0x3A DOPPRIN6 EQU 0x3B DOPPRIN7 EQU 0x3C DOPPRIN8 EQU 0x3D ;************************************************************************************* ; Регистры результата ;************************************************************************************* OTVET1 EQU 0x3E OTVET2 EQU 0x3F OTVET3 EQU 0x40 OTVET4 EQU 0x41 OTVET5 EQU 0x42 OTVET6 EQU 0x43 OTVET7 EQU 0x44 ;************************************************************************************* ; Регистры остатка от деления (допускается и другое назначение) ;************************************************************************************* OSTAT1 EQU 0x45 OSTAT2 EQU 0x46 OSTAT3 EQU 0x47 OSTAT4 EQU 0x48 OSTAT5 EQU 0x49 OSTAT6 EQU 0x4A OSTAT7 EQU 0x4B OSTAT8 EQU 0x4C ;************************************************************************************* ; Регистры дробной части ;************************************************************************************* DROB1 EQU 0x4D DROB2 EQU 0x4E DROB3 EQU 0x4F DROB4 EQU 0x50 DROB5 EQU 0x51 DROB6 EQU 0x52 DROB7 EQU 0x53 ;************************************************************************************* ; На все случаи жизни ;************************************************************************************* BUFER1 EQU 0x54 BUFER2 EQU 0x55 BUFER3 EQU 0x56 BUFER4 EQU 0x57 BUFER5 EQU 0x58 BUFER6 EQU 0x59 BUFER7 EQU 0x5A ;************************************************************************************* ; Экранная память ;************************************************************************************* SCREEN1 EQU 0x5B SCREEN2 EQU 0x5C SCREEN3 EQU 0x5D SCREEN4 EQU 0x5E SCREEN5 EQU 0x5F SCREEN6 EQU 0x60 SCREEN7 EQU 0x61 SCREEN8 EQU 0x62 SCREEN9 EQU 0x63 ;************************************************************************************* ; В этих регистрах на время деления сохраняется ВОЗДЕЙСТВИЕ ;************************************************************************************* BUFVOZ1 EQU 0x64 BUFVOZ2 EQU 0x65 BUFVOZ3 EQU 0x66 BUFVOZ4 EQU 0x67 BUFVOZ5 EQU 0x68 BUFVOZ6 EQU 0x69 BUFVOZ7 EQU 0x6A BUFVOZ8 EQU 0x6B ; ----------------- ;------------------------- TOCHVOZ EQU 0x6C ; Отображает позицию запятой воздействующего значения TOCHPRIN EQU 0x6D ; Отображает позицию запятой принимающего значения ;------------------------- COL_PRIB EQU 0x6E ; Определяет количество циклов прибавления в ПП умножения ;------------------------- COL_ZNAC EQU 0x6F ; Определяет количество знаков после запятой ;------------------------- COUNT EQU 0x70 ; Регистр промежуточного результата деления ;------------------------- CNTDIV EQU 0x71 ; Определитель конфигурации колец деления ;------------------------- FLAG EQU 0x72 ; Регистр флагов 1 FLAG2 EQU 0x73 ; Регистр флагов 2 ;------------------------- COD_OPER EQU 0x74 ; Код операции COD_OPER1 EQU 0x75 ; Код операции ("Помощник") ;------------------------- INDEX EQU 0x76 ; Определяет количество используемых разрядов индикатора ;------------------------- SCHETZAP EQU 0x77 ; Определяет насколько разрядов результат выходит за рамки индикатора ;------------------------- OFF_REGL EQU 0x78 ; Эти два регистра определяют время неактивной OFF_REGH EQU 0x79 ; работы по истечении, которого происходит переход в SLEEP ;------------------------- CONSTTOCH EQU 0x7A ; Используется в ПП КОРЕНЬ CONSTCIFR EQU 0x7B DLJACOREN EQU 0x7C ; Используется в ПП КОРЕНЬ!!!!!!!!!!!!!!!!!!!!!!!! FLAG4 EQU 0x7D ; Используется в ПП КОРЕНЬ ;************************************************************************************* ; Регистры используемые функцией памяти ;************************************************************************************* ZAPMEMORY EQU 0x7E FLAG3 EQU 0x7F ;======Регистры банка 1 ===== MEMORY1 EQU 0A0h MEMORY2 EQU 0A1h MEMORY3 EQU 0A2h MEMORY4 EQU 0A3h MEMORY5 EQU 0A4h MEMORY6 EQU 0A5h MEMORY7 EQU 0A6h MEMORY8 EQU 0A7h BUFMEMORY EQU 0A8h ;************************************************************************************* ; На все случаи жизни ;************************************************************************************* BUFER8 EQU 0A9h BUFER9 EQU 0AAh BUFER10 EQU 0ABh BUFER11 EQU 0ACh BUFER12 EQU 0ADh BUFER13 EQU 0AEh BUFER14 EQU 0AFh BUFER15 EQU 0xB0 BUFER16 EQU 0xB1 NAHALADRES EQU 0xB2 CONECADRES EQU 0xB3 ;============================ ORG 0 NET0 CALL RESETMEMORY ; Обнуление MEMORY с запятой, FLAG3,0,1,2,3 GOTO START ;************************************************************************************* ; Применение вычисляемого перехода 1. ; Преобразование двоично-десятичного кода в код 7-сегментного индикатора ;************************************************************************************* TABLE ADDWF PCL,F ; RETLW b'00111111' ; ..FEDCBA = 0 RETLW b'00000110' ; .....CB. = 1 RETLW b'01011011' ; .G.ED.BA = 2 RETLW b'01001111' ; .G..DCBA = 3 RETLW b'01100110' ; .GF..CB. = 4 RETLW b'01101101' ; .GF.DC.A = 5 RETLW b'01111101' ; .GFEDC.A = 6 RETLW b'00100111' ; .....CBA = 7 RETLW b'01111111' ; .GFEDCBA = 8 RETLW b'01101111' ; .GF.DCBA = 9 RETLW b'00000000' ; ........ = Гашение RETLW b'01000000' ; .G...... = Минус ;************************************************************************************* ; Применение вычисляемого перехода 2. ; Развитие сценарий при нажатии кнопок ;************************************************************************************* CNOPCA BCF FLAG,4 MOVLW .10 SUBWF SCREEN8,W ; Проверка на переполнение индикатора BTFSS STATUS,Z BSF FLAG,4 ; Установить FLAG,4 если индикатор переполнен MOVF BUFER1,W ; ADDWF PCL,F GOTO START ;0; ON/C GOTO KN2 ;1; 7 GOTO KN3 ;2; 8 GOTO KN4 ;3; 9 GOTO KN5 ;4; % GOTO KN6 ;5; sqrt GOTO KN7 ;6; MC GOTO SON ;7; OFF GOTO KN9 ;8; 4 GOTO KN10 ;9; 5 GOTO KN11 ;10; 6 GOTO KN12 ;11; * GOTO KN13 ;12; / GOTO KN14 ;13; MR GOTO KN25 ;14; BACKSPACE GOTO KN16 ;15; 1 GOTO KN17 ;16; 2 GOTO KN18 ;17; 3 GOTO KN19 ;18; + GOTO KN20 ;19; - GOTO MEMMI ;20; M- GOTO KN22 ;21; CE GOTO KN23 ;22; 0 GOTO KN15 ;23; +/- GOTO KN24 ;24; , GOTO KN26 ;25; ODINNAX GOTO KN27 ;26; = GOTO MEMMI ;27; M+ ;************************************************************************************* ; Применение вычисляемого перехода 3. ; Запуск определенной подпрограммы вычисления ;************************************************************************************* CODOPER BCF FLAG,6 ; Чтоб результат вычисления записался в принятие MOVF COD_OPER1,W ; ADDWF PCL,F RETURN GOTO UMNOGENIE1 GOTO DELENIE1 GOTO PRIBAVTE GOTO MINUS1 ;************************************************************************************* ; Применение вычисляемого перехода 4. ; Вычисление разряда индикатора (используется в ПП динамической индикации) ;************************************************************************************* VIBR_RAZRAD BSF PORTA,5 BSF PORTA,4 MOVF INDEX,W ADDWF PCL,F RETLW B'01111111' RETLW B'10111111' RETLW B'11011111' RETLW B'11101111' RETLW B'11110111' RETLW B'11111011' RETLW B'11111101' RETLW B'11111110' MOVLW B'11111111' BCF PORTA,4 RETURN ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№ НАЧАЛО ПРОГРАММЫ № ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ START BSF STATUS,RP0 ; "Двойная" "штатная" команда установки BCF STATUS,RP1 ; 1-го банка. MOVLW .6 MOVWF ADCON1 ; CLRF OPTION_REG BCF STATUS,RP0 ; Установить банк 0 CLRF INTCON ; Запретить прерывания CLRF RCSTA ; Отключение USART. CLRF T1CON ; ----"---- TMR1. CLRF T2CON ; ----"---- TMR2. CLRF CCP1CON ; ----"---- CCP1. CLRF CCP2CON ; ----"---- CCP2. CLRF ADCON0 ; ----"---- АЦП. CLRF SSPCON ; ----"---- MSSP. CLRF PCLATH ;------------------------------------------------------------------------------------- ; Сброс регистров общего назначения с адресом 0x20 - 0x7C ;------------------------------------------------------------------------------------- MOVLW VOZ1 MOVWF FSR CLRF INDF INCF FSR,F MOVLW 0x7D SUBWF FSR,W BTFSS STATUS,Z GOTO $-5 BCF FLAG3,6 ; Запретить бло-ку "CE" BCF FLAG3,4 ; Запретить гасить отображаемое значение после нажатия на "цифру" или на "запятую" ;------------------------------------------------------------------------------------- ; Установка запятых в исходное состояние ;------------------------------------------------------------------------------------- MOVLW .1 MOVWF TOCHVOZ MOVWF TOCHPRIN ;------------------------------------------------------------------------------------- ; Определение времени, после которого, произойдет автоматическое выключение ;------------------------------------------------------------------------------------- MOVLW .19 MOVWF OFF_REGL MOVLW .59 MOVWF OFF_REGH ;№№№№№№№№№№№№№№№№№№№№№№№№№№---------№№№№№№№№№--------№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№ ПЕРЕХОД НА ПРЕОБРАЗОВАНИЕ И КОПИРОВАНИЕ ОТОБРАЖАЕМОЙ ИНФОРМАЦИИ № ;№ Перескок на подпрограмму преобразования двоично-десятичного числа из SCREEN в № ;№ двоичное число с записью его в PRIN, если FLAG,6 = 0 и в VOZ, если FLAG,6 = 1. № ;№ Такое преобразование произойдет только в том случае если FLAG,7 = 1 № ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ DINAMICA BTFSC FLAG3,2 RETURN CALL BCD_BIN ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№ ОПРЕДЕЛЕНИЕ ЗНАК (+/-) КАКОЙ СТРАНИЦИ НУЖНО ОТОБРАЗИТЬ № ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ MOVLW .10 MOVWF SCREEN9 BTFSS FLAG,6 ; GOTO $+4 BTFSC FLAG2,2 BSF SCREEN9,0 ; Вывод знака воздействия ( FLAG,6 = 1) GOTO $+3 BTFSC FLAG2,1 BSF SCREEN9,0 ; Вывод знака принятия ( FLAG,6 = 0) ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ; КОРРЕКЦИЯ ЗАПЯТОЙ НА СЛУЧАЙ ОШИБКИ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ BTFSS FLAG2,4 GOTO $+7 MOVF SCHETZAP,W BTFSC STATUS,Z BSF SCHETZAP,0 MOVF SCHETZAP,W MOVWF TOCHPRIN MOVWF TOCHVOZ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№ ОПРЕДЕЛЕНИЕ ЗАПЯТУЮ КАКОЙ СТРАНИЦИ НУЖНО ОТОБРАЗИТЬ № ;№ С последующим гашением незначащих нулей № ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;************************************************************************************* ; Копировать в BUFER1 запятую рабочей страницы ;************************************************************************************* BTFSS FLAG,6 GOTO $+3 MOVF TOCHVOZ,W GOTO $+2 MOVF TOCHPRIN,W MOVWF BUFER1 ;************************************************************************************* ; Подсчет порядкового номера запятой выбранного регистра и запись результата в BUFER4 ;************************************************************************************* CLRF BUFER4 RRF BUFER1,F BTFSC STATUS,C GOTO NET79 INCF BUFER4,F GOTO $-4 ;------------------------------------------------------------------------------------- ; Подсчет порядкового номера запятой выбранного регистра закончен, ; теперь ограничим гашение незначащих нулей до разряда, в котором находится запятая ; Определяем, сколько разрядов нужно погасить, ; находим разность от общего числа разрядов и порядкового номера запятой ;------------------------------------------------------------------------------------- NET79 MOVLW .7 MOVWF BUFER1 ; MOVF BUFER4,W SUBWF BUFER1,F BTFSC STATUS,Z GOTO ST_DINAM ;------------------------------------------------------------------------------------- ; Теперь гасим ;------------------------------------------------------------------------------------- MOVLW SCREEN8 MOVWF FSR CRUG3 MOVLW .10 SUBWF INDF,W BTFSC STATUS,Z ; Проверяем на 10 GOTO $+6 ; Да MOVF INDF,W ; Нет BTFSS STATUS,Z ; Проверяем на 0 GOTO ST_DINAM ; Не 0, значит, нужная цифра, гасить ее не нужно MOVLW .10 ; Да, значит гасим MOVWF INDF DECF FSR,F DECFSZ BUFER1,F GOTO CRUG3 ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ; ПОДПРОГРАММА ДИНАМИЧЕСКОЙ ИНДИКАЦИИ ; Отображается содержимое регистров экранной памяти SCREEN ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ST_DINAM DECFSZ OFF_REGL,F GOTO $+4 DECFSZ OFF_REGH,F GOTO $+2 GOTO SON ;------------------------------------------------------------------------------------- ; Устанавливаем время опроса клавиатуры и необходимые настройки портов ;------------------------------------------------------------------------------------- MOVLW .50 MOVWF BUFER1 MOVLW .2 MOVWF BUFER3 BSF PORTA,5 BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVLW B'11001111' MOVWF TRISA CLRF TRISB CLRF TRISC BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК ;------------------------------------------------------------------------------------- ; Включение светодиода ошибки HL1 (если FLAG2,4 =1) и памяти HL2 (если FLAG2,6 =1) ;------------------------------------------------------------------------------------- CYCLE2 BTFSC FLAG2,4 GOTO $+3 BTFSS FLAG3,3 GOTO NET55 CLRF PORTB BCF PORTC,7 BCF PORTC,6 BTFSC FLAG2,4 BSF PORTC,7 BTFSC FLAG3,3 BSF PORTC,6 BCF PORTA,5 ;------------------------------------------------------------------------------------- ; Организация косвенной адресации к регистрам экранной памяти ;------------------------------------------------------------------------------------- NET55 CLRF INDEX CYCLE MOVLW SCREEN1 ADDWF INDEX,W MOVWF FSR MOVF INDF,W ;------------------------------------------------------------------------------------- ; Преобразование двоичного кода в код семи сегментного индикатора ;------------------------------------------------------------------------------------- CALL TABLE MOVWF BUFER2 ;------------------------------------------------------------------------------------- ; Вычисление разряда индикатора ;------------------------------------------------------------------------------------- CLRF PORTB CALL VIBR_RAZRAD MOVWF PORTC ;------------------------------------------------------------------------------------- ; Формирование запятой ;------------------------------------------------------------------------------------- MOVF BUFER4,W SUBWF INDEX,W BTFSC STATUS,Z BSF BUFER2,7 ;------------------------------------------------------------------------------------- ; Вывод десятичной цифры на индикацию ;------------------------------------------------------------------------------------- MOVF BUFER2,W MOVWF PORTB ;------------------------------------------------------------------------------------- ; Увеличение на 1 содержимого INDEX с последующей проверкой ; результата инкремента на равенство числу 9 ;------------------------------------------------------------------------------------- INCF INDEX,F MOVLW .9 SUBWF INDEX,W BTFSS STATUS,Z GOTO CYCLE DECFSZ BUFER1,F GOTO CYCLE2 DECFSZ BUFER3,F GOTO CYCLE2 ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№ ОПРОС КЛАВИАТУРЫ № ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;------------------------------------------------------------------------------------- ; Настройка выводов PORTB на вход ; Подключение подтягивающих резисторов ;------------------------------------------------------------------------------------- BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVLW .255 MOVWF TRISB BCF OPTION_REG,7 MOVWF TRISC MOVLW B'11111110' MOVWF TRISA BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК CLRF PORTA CRUG2 MOVLW .7 MOVWF BUFER5 MOVF PORTB,W MOVWF BUFER2 CRUG1 BTFSS BUFER2,6 GOTO NAGATA INCF BUFER1,F RLF BUFER2,F DECFSZ BUFER5,F GOTO CRUG1 DECF BUFER1,F BSF STATUS,RP0 ; Установить банк 1 BTFSS TRISA,3 GOTO OTGATA BSF STATUS,C RLF TRISA,F BCF STATUS,RP0 ; Установить банк 0 INCF BUFER1,F GOTO CRUG2 OTGATA BCF STATUS,RP0 ; Установить банк 0 BCF FLAG,5 ; Снятие блокировки клавиатуры GOTO ST_DINAM ;------------------------------------------------------------------------------------- ; Определение времени, после которого, произойдет автоматическое выключение ;------------------------------------------------------------------------------------- NAGATA MOVLW .19 MOVWF OFF_REGL MOVLW .59 MOVWF OFF_REGH ;------------------------------------------------------------------------------------- ; В случае, когда вычисление привело к ошибке, вся клавиатура ; блокируется (кроме кнопки on/c и OFF)! ;------------------------------------------------------------------------------------- BTFSS FLAG2,4 GOTO $+8 MOVF BUFER1,W BTFSC STATUS,Z GOTO $+5 MOVLW .7 SUBWF BUFER1,W BTFSS STATUS,Z GOTO ST_DINAM BTFSC FLAG,5 GOTO ST_DINAM ; BSF FLAG,5 GOTO CNOPCA ; ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№ Распределение по вычислительным программам № ;№ П О Д Г О Т О В И Т Е Л Ь Н Ы Е О П Е Р А Ц И И № ;№ П Е Р Е Д В Ы Ч И С Л Е Н И Е М № ;№ ДЕЛАЕМ ПЕРВЫЕ ШАГИ К НАВЕДЕНИЮ ПОРЯДКА !! № ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ; Д Е Л Е Н И Е ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ DELENIE1 MOVLW .7 MOVWF BUFER1 MOVLW VOZ1 MOVWF FSR MOVF INDF,W BTFSS STATUS,Z GOTO NET156 INCF FSR,F DECFSZ BUFER1,F GOTO $-5 CALL OFF_ICRAN ; Обнуляются показания BCF FLAG2,1 BSF FLAG2,4 ; Главное (общее) подтверждение ошибки RETURN ;------------------------------------------------------------------------------------- ; Перед делением нужно сохранить состояние регистров ВОЗДЕЙСТВИЯ ;------------------------------------------------------------------------------------- NET156 CALL SOHR_VOZ ; Сохраняем CALL DELENIE ; Делим ! ;------------------------------------------------------------------------------------ ; Если результат деления ноль то минус убирается а само деление прекращается, и ; рабочая точка возвращается по стеку ;------------------------------------------------------------------------------------ NET53 MOVLW .7 MOVWF BUFER1 MOVLW PRIN1 MOVWF FSR MOVF INDF,W BTFSS STATUS,Z GOTO $+6 INCF FSR,F DECFSZ BUFER1,F GOTO $-5 BCF FLAG2,1 RETURN ; Результат имеет нулевое значение (убираем минус и выходим) ;------------------------------------------------------------------------------------ ; Реализация логики знака при делении ;------------------------------------------------------------------------------------ MOVLW B'00000110' ANDWF FLAG2,W BTFSS STATUS,Z GOTO $+3 BCF FLAG2,1 RETURN MOVLW B'00000110' ANDWF FLAG2,W MOVWF BUFER1 MOVLW .6 SUBWF BUFER1,W BTFSC STATUS,Z GOTO $-8 BSF FLAG2,1 RETURN ; Окончательный выход из деления ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ; СЛОЖЕНИЕ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ; Так как подпрограмма сложения работает с содержимым регистров DOPPRIN и DOPVOZ в двоично-десятичном ; виде, а введенное с клавиатуры число находится в регистрах PRIN и VOZ в двоичном виде то необходимо ; преобразовать PRIN и VOZ в двоично-десятичный вид и скопировать результат преобразования в соответствующий ; регистр DOPPRIN и DOPVOZ. Для такого преобразования и копирования необходима перейти на метку COPIRPREOBR PRIBAVTE BSF PCLATH,3 ; BSF PCLATH,3 CALL COPIRPREOBR ; Преобразуем и копируем PLUSMEMORI CALL SOHR_VOZ ; Сохраняем воздействие CALL SOVMESTITE ; Совмещение дополнительного принятия и воздействия по запятым ;------------------------------------------------------------------------------------ ; Выяснить, равны ли запятые принятия и воздействия ;------------------------------------------------------------------------------------ MOVLW B'00000110' ANDWF FLAG2,W BTFSC STATUS,Z GOTO NET24 MOVLW B'00000110' ANDWF FLAG2,W MOVWF BUFER1 MOVLW .6 SUBWF BUFER1,W BTFSC STATUS,Z GOTO NET24 ;------------------------------------------------------------------------------------ ; Выяснилось, что знаки не ровны, значит, следуем по следующему сценарию: ;------------------------------------------------------------------------------------ CALL SRAVNITE GOTO NET22 ;------------------------------------------------------------------------------------ ; Выяснилось, что знаки ровны, значит, следуем по следующему сценарию: ;------------------------------------------------------------------------------------ NET24 CALL START_PLUS NET22 CALL VOST_VOZ RETURN ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ; ВЫЧИТАНИЕ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ; Так как подпрограмма вычитания работает с содержимым регистров DOPPRIN и DOPVOZ в двоично-десятичном ; виде, а введенное с клавиатуры число находится в регистрах PRIN и VOZ в двоичном виде то необходимо ; преобразовать PRIN и VOZ в двоично-десятичный вид и скопировать результат преобразования в соответствующий ; регистр DOPPRIN и DOPVOZ. Для такого преобразования и копирования необходима перейти на метку COPIRPREOBR MINUS1 BSF PCLATH,3 ; BSF PCLATH,3 CALL COPIRPREOBR MINUSMEMORI MOVLW B'00000100' ANDWF FLAG2,W BTFSC STATUS,Z GOTO $+5 BCF FLAG2,2 MOVLW .3 MOVWF COD_OPER GOTO PLUSMEMORI CALL SOHR_VOZ ; Сохраняем воздействие CALL SOVMESTITE ; Совмещение DOPPRIN и DOPVOZ по запятым MOVLW B'00000010' ANDWF FLAG2,W BTFSS STATUS,Z GOTO NET24 CALL SRAVNITE GOTO NET22 ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ; УМНОЖЕНИЕ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ UMNOGENIE1 CALL SOHR_VOZ CALL UMNOGENIE CALL VOST_VOZ GOTO NET53 ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№ Сценарии развития № ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ KN23 MOVLW .0 GOTO CIFRAA KN16 MOVLW .1 GOTO CIFRAA KN17 MOVLW .2 GOTO CIFRAA KN18 MOVLW .3 GOTO CIFRAA KN9 MOVLW .4 GOTO CIFRAA KN10 MOVLW .5 GOTO CIFRAA KN11 MOVLW .6 GOTO CIFRAA KN2 MOVLW .7 GOTO CIFRAA KN3 MOVLW .8 GOTO CIFRAA KN4 MOVLW .9 CIFRAA MOVWF BUFER1 GOTO CIFRA KN12 MOVLW .1 GOTO OPERAZIAA KN13 MOVLW .2 GOTO OPERAZIAA KN19 MOVLW .3 GOTO OPERAZIAA KN20 MOVLW .4 OPERAZIAA MOVWF COD_OPER GOTO OPERAZIA ; Переход на ПП запуска определенной операции KN5 BSF PCLATH,3 ; BSF PCLATH,3 CALL PROCENT BCF PCLATH,3 ; BCF PCLATH,3 GOTO DINAMICA KN6 BSF PCLATH,3 ; BSF PCLATH,3 GOTO COREN KN7 CALL RESETMEMORY GOTO DINAMICA KN14 BSF PCLATH,3 ; BSF PCLATH,3 GOTO MR KN25 BSF PCLATH,3 ; BSF PCLATH,3 GOTO BACK KN26 BSF PCLATH,3 ; BSF PCLATH,3 GOTO ODINNAX ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№ КНОПКА +/- № ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ KN15 BTFSS FLAG,2 GOTO NET97 CLRF BUFER1 GOTO CIFRA ;------------------------------------------------------------------------------------- ; Если значение на экране ровно нулю, то минус не ставим ;------------------------------------------------------------------------------------- NET97 CALL NOLLISCREEN BTFSC FLAG3,5 ;------------------------------------------------------------------------------------- ; Значение действительно ровно нулю, выходим! ;------------------------------------------------------------------------------------- GOTO DINAMICA ;------------------------------------------------------------------------------------- ; Значение не ровно нулю значит, ставим знак +/- ;------------------------------------------------------------------------------------- MOVLW B'00000100' ; Подготовка к изменению знака воздействия (FLAG2,2) BTFSS FLAG,6 MOVLW B'00000010' ; Подготовка к изменению знака принятия (FLAG2,1) XORWF FLAG2,F GOTO DINAMICA ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№ КНОПКА ГАШЕНИЯ ПОСЛЕДНЕГО ВВЕДЕНОГО ЧИСЛА (CE) № ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ KN22 BTFSC FLAG3,6 GOTO DINAMICA BTFSS FLAG2,0 GOTO DINAMICA CALL OFF_ICRAN ; Обнуление экранной памяти MOVLW .1 BTFSC FLAG,6 ; Выяснить, запятую и знак, какой страницы нужно сбрасывать GOTO $+4 MOVWF TOCHPRIN ; Сбрасываем запятую и знак страницы PRIN BCF FLAG2,1 GOTO $+3 MOVWF TOCHVOZ ; Сбрасываем запятую и знак страницы VOZ BCF FLAG2,2 BCF FLAG,3 ; Отключение запятой BSF FLAG,7 ; Для преобразования получившегося значения в двоичный вид GOTO DINAMICA ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№ ЗАПЯТАЯ № ; 1. Если перед нажатием на запятую перехода на страницу воздействия не было ; (FLAG,2 = 0), то просто установится FLAG,3 ; 2. Если перед нажатием на запятую переход на страницу воздействия был (FLAG,2 = 1), ; то кроме установки FLAG,3 происходит: ; - сброс регистров SCREEN ( для гашения прежних показаний) ; - TOCHVOZ = 1 (для того чтобы начать отображать вторую страницу с "чистого листа")) ; - Установка FLAG,6 (для того чтобы начать отображать вторую страницу) ; - Сброс FLAG2,2 (убрать знак минус воздействия (конечно, если он установлен)) ; - Установить FLAG,7 (для того чтобы изменение вступили в силу в ПП BCD_BIN) ; - Установить FLAG2,0 (для того чтобы сделать возможным вычисления) ; - Сброс FLAG,2 (для того чтобы в следующий раз всего этого не произошло) ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ KN24 CALL GASIM_POCAZ ; Гасим показания если флаг FLAG3,4 установлен BTFSC FLAG2,5 CALL SBROS_PRIN ; Принятие будет сброшено, если установлен флаг кнопки равно BTFSS FLAG,2 ; Проверить был ли переход на страницу воздействия GOTO NET2 ; Нет. Обходим процедуру перехода на VOZ стороной ;------------------------------------------------------------------------------------- ; Переход на страницу VOZ ;------------------------------------------------------------------------------------- CALL OFF_ICRAN ; Да. Переходим на VOZ MOVLW .1 MOVWF TOCHVOZ ; Сброс запятой воздействия BSF FLAG,6 ; Теперь будем сдвигать, и отображать запятую воздействия ; BCF FLAG2,2 ; Убираем знак минус (конечно, если он установлен) BCF FLAG,2 ; Чтобы в следующий раз обойти процедуру перехода на VOZ ;---------------------------- NET2 BSF FLAG2,0 ; Разрешаем вычисление после нажатия на операцию (но ; вычисление произойдет только в том случае, если ; код операции уже находится в регистре COD_OPER1) BSF FLAG,7 ; Разрешаем преобразование в BCD_BIN BSF FLAG,3 ; Выключение запятой GOTO DINAMICA ; ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№ Кнопка равно (=) № ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ KN27 BSF FLAG2,5 ; Установка флага кнопки равно для гашения принятия ; в ПП SBROS_PRIN после нажатия на цифру или запятую BCF FLAG,2 ; Если после нажатия на равно нажать цифру, то она ; всегда запишется в принятие BCF FLAG2,0 ; Если перед нажатием на кнопку равно была нажата цифра, ; то следующее нажатие на операцию не приведет к ; началу вычисления MOVF COD_OPER,W MOVWF COD_OPER1 ; Определяем код операции CALL CODOPER ; Если в COD_OPER1 находится код операции, то в ; ПП CODOPER произойдет переход на соответствующую ; ПП вычисления. GOTO DINAMICA ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№ ЦИФРА № ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ CIFRA CALL GASIM_POCAZ CIFMEM BTFSC FLAG2,5 CALL SBROS_PRIN BTFSS FLAG,2 ; Проверить был ли переход на страницу воздействия GOTO NET1 ; Нет ;------------------------------------------------------------------------------------- ; Переход на страницу VOZ ;------------------------------------------------------------------------------------- CALL OFF_ICRAN ; Да MOVLW .1 MOVWF TOCHVOZ ; Сброс запятой воздействия BSF FLAG,6 ; Теперь будем сдвигать, и отображать запятую воздействия ; BCF FLAG,3 ; Включение запятой BCF FLAG2,2 ; Убираем знак минус (конечно, если он установлен) BCF FLAG,2 ; Чтобы в следующий раз обойти сброс и все остальное GOTO $+4 ;------------------------------------------------------------------------------------- ; Проверить заполнен ли полностью индикатор, если нет, то сдвиг показаний влево не произойдет ;------------------------------------------------------------------------------------- NET1 BTFSC FLAG,4 ; Индикатор заполнен? GOTO DINAMICA ; Да CALL ZDVIG ; Нет MOVF BUFER1,W MOVWF SCREEN1 ; Загрузка цифры BSF FLAG,7 ; Разрешаем преобразование в BCD_BIN BSF FLAG2,0 ; Разрешаем вычисление после нажатия на операцию (но ; вычисление произойдет только в том случае, если ; код операции уже находится в регистре COD_OPER1) GOTO DINAMICA ; Отображение ;===================================================================================== ; Перед сдвигом проверяется, включена ли запятая, если запятая вЫключена (FLAG,3 = 0), ; то показания сдвигаются, а запятая остается нетронутой. ; Но если запятая включена, то проверяется, какую запятую нужно сдвигать. ; Если FLAG,6 = 1 то сдвигается запятая воздействия иначе запятая принятия ;===================================================================================== ZDVIG BTFSS FLAG,3 ; Запятая включена или нет? GOTO ZDVIG_VLEVO_SCREEN ; Нет ;------------------------------------------------------------------------------------- ; Проверяется, какую запятую нужно сдвигать ;------------------------------------------------------------------------------------- BCF STATUS,C ; Да BTFSC FLAG,6 GOTO $+3 RLF TOCHPRIN,F GOTO ZDVIG_VLEVO_SCREEN RLF TOCHVOZ,F ;------------------------------------------------------------------------------------- ; Сдвиг регистров экранной памяти влево ;------------------------------------------------------------------------------------- ZDVIG_VLEVO_SCREEN MOVF SCREEN7,W MOVWF SCREEN8 MOVF SCREEN6,W MOVWF SCREEN7 MOVF SCREEN5,W MOVWF SCREEN6 MOVF SCREEN4,W MOVWF SCREEN5 MOVF SCREEN3,W MOVWF SCREEN4 MOVF SCREEN2,W MOVWF SCREEN3 MOVF SCREEN1,W MOVWF SCREEN2 RETURN ;------------------------------------------------------------------------------------- ; Сдвиг регистров экранной памяти вправо ;------------------------------------------------------------------------------------- ZDVIG_VPRAVO_SCREEN MOVF SCREEN2,W MOVWF SCREEN1 MOVF SCREEN3,W MOVWF SCREEN2 MOVF SCREEN4,W MOVWF SCREEN3 MOVF SCREEN5,W MOVWF SCREEN4 MOVF SCREEN6,W MOVWF SCREEN5 MOVF SCREEN7,W MOVWF SCREEN6 MOVF SCREEN8,W MOVWF SCREEN7 CLRF SCREEN8 RETURN ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№ ОПЕРАЦИЯ № ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;===================================================================================== ; После нажатия на кнопку операции происходит: ; - Установка FLAG,2 ; - переключение запятой принятия в исходное состояние, если на экране нет значащих ; цифр (0.0000000 -> 0.), а также убираются ненужные нули справа от введенного числа (25,000 -> 25,) ; - Если до нажатия операции была нажата цифра или запятая и код операции установлен, то произойдет ; запуск подпрограммы вычисления. Результат вычисления запишется в регистры принятия и ; скопируется в регистры воздействия. ;===================================================================================== OPERAZIA BCF FLAG3,4 ; Для запрещения гашения показаний в ПП GASIM_POCAZ BCF FLAG2,5 ; Обнуление флага кнопки равно BSF FLAG,2 ; Устанавливаем флаг операции ;------------------------------------------------------------------------------------- ; Проверить разрешено ли вычисление ;------------------------------------------------------------------------------------- BTFSC FLAG2,0 ; Вычисление разрешено? CALL CODOPER ; Да MOVF COD_OPER,W ; Нет MOVWF COD_OPER1 BCF FLAG2,0 ; Запрещаем вычисление при повторном нажатии на кнопку операции ;------------------------------------------------------------------------------------- ; Если значение на экране ровно нулю, то убираем минус рабочей страницы ;------------------------------------------------------------------------------------- BSF PCLATH,3 ; BSF PCLATH,3 CALL NUKA ; ;------------------------------------------------------------------------------------- ; 25.000 - > 0. ;------------------------------------------------------------------------------------- CALL CORRECTIC ; Нормализация числа BCF PCLATH,3 ; BCF PCLATH,3 CALL COPIR ; Копирование PRIN в VOZ. GOTO DINAMICA ; ;************************************************************************************* ; Копирование PRIN в VOZ вместе с запятой и знаком ;************************************************************************************* COPIR MOVF PRIN1,W MOVWF VOZ1 MOVF PRIN2,W MOVWF VOZ2 MOVF PRIN3,W MOVWF VOZ3 MOVF PRIN4,W MOVWF VOZ4 MOVF PRIN5,W MOVWF VOZ5 MOVF PRIN6,W MOVWF VOZ6 MOVF PRIN7,W MOVWF VOZ7 MOVF TOCHPRIN,W MOVWF TOCHVOZ BCF FLAG2,2 BTFSC FLAG2,1 BSF FLAG2,2 RETURN ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№ BCD_BIN № ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;===================================================================================== ; Перед преобразованием BCD в BIN происходит проверка FLAG,7: ; - Если 0 то преобразование отменяется. ; - Если 1 то происходит проверка FLAG,6: ; - Если 0 то копирование происходит в принятие. ; - Если 1 то копирование происходит в воздействие. ;===================================================================================== BCD_BIN BTFSS FLAG,7 RETURN BCF FLAG,7 COPIR1 BTFSC FLAG,6 GOTO $+3 ;------------------------------------------------------------------------------------- ; Сброс регистров принятия ;------------------------------------------------------------------------------------- CALL OFF_PRIN GOTO $+2 ;------------------------------------------------------------------------------------- ; Сброс регистров воздействия ;------------------------------------------------------------------------------------- CALL OFF_VOZ ;------------------------------------------------------------------------------------- ; Подпрограмма преобразования двоично-десятичного кода из SCREEN в двоичный код с сохранением ; результата в PRIN или в VOZ (зависит от состояния FLAG,6). ; Перед преобразованием происходит замена в SCREEN десяток на нули. ;------------------------------------------------------------------------------------- CALL ZAMSCR10_0 ;------------------------------------------------------------------------------------- ; Замена в SCREEN десяток на нули закончена, теперь переходим к преобразованию ;------------------------------------------------------------------------------------- CALL ZAGRUZ8 MOVF SCREEN8,W CALL UMNOG CALL ZAGRUZ7 MOVF SCREEN7,W CALL UMNOG CALL ZAGRUZ6 MOVF SCREEN6,W CALL UMNOG CALL ZAGRUZ5 MOVF SCREEN5,W CALL UMNOG CALL ZAGRUZ4 MOVF SCREEN4,W CALL UMNOG CALL ZAGRUZ3 MOVF SCREEN3,W CALL UMNOG CALL ZAGRUZ2 MOVF SCREEN2,W CALL UMNOG MOVF SCREEN1,W MOVWF OSTAT1 BTFSS FLAG,6 GOTO PL2 GOTO PL3 ;===================================================================================== ; Подпрограмма умножения позволяет умножить один из восьми разрядов преобразуемого ; двоично-десятичного числа (SCREEN1,2,3,4,5,6,7,8), который находится в ; младшем полубайте регистра INDEX, на 4-х байтный регистр BUFER. ; Результат умножения оседает в 4-х байтном регистре OSTAT1,2,3,4. ; Потом результат прибавляется к регистру PRIN1,2,3,4 или VOZ1,2,3,4 (зависит от FLAG,6) ;===================================================================================== UMNOG MOVWF INDEX MOVLW .4 MOVWF COUNT CLRF OSTAT1 CLRF OSTAT2 CLRF OSTAT3 CLRF OSTAT4 ;........................................... SNOVA1 BCF STATUS,C RRF INDEX,F BTFSS STATUS,C GOTO OBHOD ;============================ MOVF BUFER1,W ADDWF OSTAT1,F BTFSS STATUS,C GOTO NET4 ;........................................... INCFSZ OSTAT2,F GOTO NET4 INCFSZ OSTAT3,F GOTO NET4 INCF OSTAT4,F ;........................................... NET4 MOVF BUFER2,W ADDWF OSTAT2,F BTFSS STATUS,C GOTO NET5 ;........................................... INCFSZ OSTAT3,F GOTO NET5 INCF OSTAT4,F ;........................................... NET5 MOVF BUFER3,W ADDWF OSTAT3,F BTFSC STATUS,C INCF OSTAT4,F ;........................................... MOVF BUFER4,W ADDWF OSTAT4,F ;============================ OBHOD DECFSZ COUNT,F GOTO $+4 BTFSS FLAG,6 GOTO PL2 GOTO PL3 BCF STATUS,C RLF BUFER1,F RLF BUFER2,F RLF BUFER3,F RLF BUFER4,F GOTO SNOVA1 ;........................................... ; Загрузка 10 000 000 в BUFER ;........................................... ZAGRUZ8 CLRF BUFER4 MOVLW B'10011000' MOVWF BUFER3 MOVLW B'10010110' MOVWF BUFER2 MOVLW B'10000000' MOVWF BUFER1 RETURN ;........................................... ; Загрузка 1 000 000 в BUFER ;........................................... ZAGRUZ7 CLRF BUFER4 MOVLW B'00001111' MOVWF BUFER3 MOVLW B'01000010' MOVWF BUFER2 MOVLW B'01000000' MOVWF BUFER1 RETURN ;........................................... ; Загрузка 100 000 в BUFER ;........................................... ZAGRUZ6 CLRF BUFER4 MOVLW B'00000001' MOVWF BUFER3 MOVLW B'10000110' MOVWF BUFER2 MOVLW B'10100000' MOVWF BUFER1 RETURN ;........................................... ; Загрузка 10 000 в BUFER ;........................................... ZAGRUZ5 CLRF BUFER4 CLRF BUFER3 MOVLW B'00100111' MOVWF BUFER2 MOVLW B'00010000' MOVWF BUFER1 RETURN ;........................................... ; Загрузка 1 000 в BUFER ;........................................... ZAGRUZ4 CLRF BUFER4 CLRF BUFER3 MOVLW B'00000011' MOVWF BUFER2 MOVLW B'11101000' MOVWF BUFER1 RETURN ;........................................... ; Загрузка 100 в BUFER ;........................................... ZAGRUZ3 CLRF BUFER4 CLRF BUFER3 CLRF BUFER2 MOVLW B'01100100' MOVWF BUFER1 RETURN ;........................................... ; Загрузка 10 в BUFER ;........................................... ZAGRUZ2 CLRF BUFER4 CLRF BUFER3 CLRF BUFER2 MOVLW B'00001010' MOVWF BUFER1 RETURN ;===================================================================================== ; Трехбайтное суммирующее устройство 1. ; Здесь происходит прибавление промежуточного результата умножения из OSTAT ; к окончательному ответу PRIN ;===================================================================================== PL2 MOVF OSTAT1,W ADDWF PRIN1,F BTFSS STATUS,C GOTO NET6 ;........................................... INCFSZ PRIN2,F GOTO NET6 INCFSZ PRIN3,F GOTO NET6 INCF PRIN4,F NET6 MOVF OSTAT2,W ADDWF PRIN2,F BTFSS STATUS,C GOTO NET7 ;........................................... INCFSZ PRIN3,F GOTO NET7 INCF PRIN4,F NET7 MOVF OSTAT3,W ADDWF PRIN3,F BTFSC STATUS,C ;........................................... INCF PRIN4,F MOVF OSTAT4,W ADDWF PRIN4,F RETURN ;===================================================================================== ; Трехбайтное суммирующее устройство 2. ; Здесь происходит прибавление промежуточного результата умножения из OSTAT ; к окончательному ответу VOZ ;===================================================================================== PL3 MOVF OSTAT1,W ADDWF VOZ1,F BTFSS STATUS,C GOTO NET8 ;........................................... INCFSZ VOZ2,F GOTO NET8 INCFSZ VOZ3,F GOTO NET8 INCF VOZ4,F NET8 MOVF OSTAT2,W ADDWF VOZ2,F BTFSS STATUS,C GOTO NET9 ;........................................... INCFSZ VOZ3,F GOTO NET9 INCF VOZ4,F NET9 MOVF OSTAT3,W ADDWF VOZ3,F BTFSC STATUS,C ;........................................... INCF VOZ4,F MOVF OSTAT4,W ADDWF VOZ4,F RETURN ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№ BIN_BCD № ;# Преобразование двоичного кода из OTVET в двоично-десятичный код, с сохранением # ;# результата в регистры SCREEN # ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ BIN_BCD MOVLW SCREEN8 MOVWF FSR CALL ZAGRUZ8 ; CALL BN_DC ; CALL ZAGRUZ7 ; CALL BN_DC ; CALL ZAGRUZ6 ; CALL BN_DC ; CALL ZAGRUZ5 ; CALL BN_DC ; CALL ZAGRUZ4 ; CALL BN_DC ; CALL ZAGRUZ3 ; CALL BN_DC ; CALL ZAGRUZ2 ; CALL BN_DC ; MOVF OTVET1,W MOVWF INDF RETURN BN_DC CLRF COUNT B_D CALL ST_MIN BTFSC FLAG,0 GOTO ST_PL INCF COUNT,F GOTO B_D ST_PL MOVF BUFER1,W ADDWF OTVET1,F BTFSS STATUS,C GOTO NET15 ;---------------------------- INCFSZ OTVET2,F GOTO NET15 INCFSZ OTVET3,F GOTO NET15 INCF OTVET4,F ;**************************** NET15 MOVF BUFER2,W ADDWF OTVET2,F BTFSS STATUS,C GOTO NET16 ;---------------------------- INCFSZ OTVET3,F GOTO NET16 INCF OTVET4,F ;**************************** NET16 MOVF BUFER3,W ADDWF OTVET3,F BTFSC STATUS,C INCF OTVET4,F ;**************************** MOVF BUFER4,W ADDWF OTVET4,F ; ----------------- MOVF COUNT,W MOVWF INDF DECF FSR,F RETURN ST_MIN BCF FLAG,0 MOVF BUFER1,W SUBWF OTVET1,F BTFSC STATUS,C GOTO NET17 ; ----------------- ;---------------------------- DECF OTVET2,F MOVLW .255 SUBWF OTVET2,W BTFSS STATUS,Z GOTO NET17 ; ----------------- DECF OTVET3,F MOVLW .255 SUBWF OTVET3,W BTFSS STATUS,Z GOTO NET17 ; ----------------- DECF OTVET4,F MOVLW .255 SUBWF OTVET4,W BTFSC STATUS,Z BSF FLAG,0 ;***************************** NET17 MOVF BUFER2,W SUBWF OTVET2,F BTFSC STATUS,C GOTO NET18 ;---------------------------- DECF OTVET3,F MOVLW .255 SUBWF OTVET3,W BTFSS STATUS,Z GOTO NET18 ; ----------------- DECF OTVET4,F MOVLW .255 SUBWF OTVET4,W BTFSC STATUS,Z BSF FLAG,0 ;***************************** NET18 MOVF BUFER3,W SUBWF OTVET3,F BTFSC STATUS,C GOTO NET19 ;---------------------------- DECF OTVET4,F MOVLW .255 SUBWF OTVET4,W BTFSC STATUS,Z BSF FLAG,0 ;***************************** NET19 MOVF BUFER4,W SUBWF OTVET4,F BTFSS STATUS,C BSF FLAG,0 ; ----------------- RETURN ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;------------------------------------------------------------------------------------ ; Обнуление регистров MEMORY, запятой MEMORY и FLAG3 (C) ;------------------------------------------------------------------------------------ RESETMEMORY BCF STATUS,RP1 BSF STATUS,RP0 ; Установить банк 1 MOVLW MEMORY1 MOVWF FSR CLRF INDF INCF FSR,F MOVLW 0xB4 SUBWF FSR,W BTFSS STATUS,Z GOTO $-5 BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVLW .1 MOVWF ZAPMEMORY MOVLW B'11110000' ANDWF FLAG3,F RETURN ;************************************************************************************* ; Этот фрагмент программы гасит весь экран вместе с запятыми и знаками. ; Он используется после нажатия на цифру или запятую, но только в том ; случае если предварительно был установлен флаг FLAG3<4> ;************************************************************************************* GASIM_POCAZ BCF FLAG3,6 BTFSS FLAG3,4 RETURN BCF FLAG,4 CALL OFF_ICRAN MOVLW .1 BTFSC FLAG,6 GOTO NET78 MOVWF TOCHPRIN BCF FLAG2,1 GOTO NET77 NET78 MOVWF TOCHVOZ BCF FLAG2,2 NET77 BCF FLAG3,4 RETURN ;------------------------------------------------------------------------------------- ; Если значение на экране ровно нулю, то поднимаем FLAG3,5 ;------------------------------------------------------------------------------------- NOLLISCREEN BCF FLAG3,5 MOVLW .8 MOVWF BUFER2 MOVLW SCREEN8 MOVWF FSR NET25 MOVLW .10 SUBWF INDF,W BTFSC STATUS,Z ; Проверяем на 10 GOTO $+4 ; Да MOVF INDF,W ; Нет BTFSS STATUS,Z ; Проверяем на 0 RETURN ; Не 0, значит, нужная цифра, ставим знак +/- DECF FSR,F ; Да DECFSZ BUFER2,F GOTO NET25 BSF FLAG3,5 RETURN ;************************************************************************************* ; Копировать PRIN в OTVET ;************************************************************************************* PRIN_V_OTVET MOVF PRIN1,W MOVWF OTVET1 MOVF PRIN2,W MOVWF OTVET2 MOVF PRIN3,W MOVWF OTVET3 MOVF PRIN4,W MOVWF OTVET4 MOVF PRIN5,W MOVWF OTVET5 MOVF PRIN6,W MOVWF OTVET6 MOVF PRIN7,W MOVWF OTVET7 RETURN ;************************************************************************************* ; Сохранение регистров ВОЗДЕЙСТВИЯ ;************************************************************************************* SOHR_VOZ MOVF TOCHVOZ,W MOVWF SCREEN9 MOVF VOZ1,W MOVWF BUFVOZ1 MOVF VOZ2,W MOVWF BUFVOZ2 MOVF VOZ3,W MOVWF BUFVOZ3 MOVF VOZ4,W MOVWF BUFVOZ4 MOVF VOZ5,W MOVWF BUFVOZ5 MOVF VOZ6,W MOVWF BUFVOZ6 MOVF VOZ7,W MOVWF BUFVOZ7 RETURN ;************************************************************************************* ; Восстановление регистра ВОЗДЕЙСТВИЯ ;************************************************************************************* VOST_VOZ MOVF SCREEN9,W MOVWF TOCHVOZ MOVF BUFVOZ1,W MOVWF VOZ1 MOVF BUFVOZ2,W MOVWF VOZ2 MOVF BUFVOZ3,W MOVWF VOZ3 MOVF BUFVOZ4,W MOVWF VOZ4 MOVF BUFVOZ5,W MOVWF VOZ5 MOVF BUFVOZ6,W MOVWF VOZ6 MOVF BUFVOZ7,W MOVWF VOZ7 RETURN ;************************************************************************************* ; Замена в SCREEN .10 на нули ;************************************************************************************* ZAMSCR10_0 MOVLW .7 MOVWF BUFER2 MOVLW SCREEN8 MOVWF FSR MOVLW .10 SUBWF INDF,W BTFSC STATUS,Z CLRF INDF DECF FSR,F DECFSZ BUFER2,F GOTO $-6 RETURN ;************************************************************************************* ; СБРОС РЕГИСТРОВ ЭКРАННОЙ ПАМЯТИ ;************************************************************************************* OFF_ICRAN CLRF SCREEN1 CLRF SCREEN2 CLRF SCREEN3 CLRF SCREEN4 CLRF SCREEN5 CLRF SCREEN6 CLRF SCREEN7 CLRF SCREEN8 RETURN ;************************************************************************************* ; СБРОС РЕГИСТРОВ ВОЗДЕЙСТВИЯ ;************************************************************************************* OFF_VOZ CLRF VOZ7 CLRF VOZ6 CLRF VOZ5 CLRF VOZ4 CLRF VOZ3 CLRF VOZ2 CLRF VOZ1 RETURN ;************************************************************************************* ; СБРОС РЕГИСТРОВ ПРИНЯТИЯ ;************************************************************************************* OFF_PRIN CLRF PRIN7 CLRF PRIN6 CLRF PRIN5 CLRF PRIN4 CLRF PRIN3 CLRF PRIN2 CLRF PRIN1 RETURN ;************************************************************************************* ; СБРОС ВСЕГО ПРИНЯТИЯ ;************************************************************************************* SBROS_PRIN CALL OFF_ICRAN BCF FLAG2,1 MOVLW .1 MOVWF TOCHPRIN BCF FLAG2,5 BCF FLAG,3 CLRF COD_OPER1 BCF FLAG,4 RETURN ;------------------------------------------------------------------------------------- ; Сдвиг регистров DOPPRIN на 1 знак вправо вместе с запятой ;------------------------------------------------------------------------------------- ZDVIG_VPRAVO_DOPPRIN MOVF DOPPRIN2,W MOVWF DOPPRIN1 MOVF DOPPRIN3,W MOVWF DOPPRIN2 MOVF DOPPRIN4,W MOVWF DOPPRIN3 MOVF DOPPRIN5,W MOVWF DOPPRIN4 MOVF DOPPRIN6,W MOVWF DOPPRIN5 MOVF DOPPRIN7,W MOVWF DOPPRIN6 MOVF DOPPRIN8,W MOVWF DOPPRIN7 CLRF DOPPRIN8 BCF STATUS,C RRF TOCHPRIN,F RETURN ;===================================================================================== ; Перед выходом в SLEEP происходит настройка прерывания на одну кнопку ;===================================================================================== SON MOVLW .255 MOVWF PORTB MOVLW B'11111110' MOVWF PORTA BSF STATUS,RP0 ; Установить банк 1 MOVWF TRISA MOVLW .255 MOVWF TRISB MOVWF TRISC MOVLW B'00001000' MOVWF INTCON BCF STATUS,RP0 ; Установить банк 0 SLEEP NOP BTFSC PORTB,6 GOTO SON GOTO NET0 ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№ ПОМЕСТИТЬСЯ ЛИ ЦЕЛАЯ ЧАСТЬ В ЭКРАН ? ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ OPRED_ERROR BCF FLAG2,3 ; MOVF OTVET7,W BTFSS STATUS,Z GOTO ER_ROR MOVF OTVET6,W BTFSS STATUS,Z GOTO ER_ROR MOVF OTVET5,W BTFSS STATUS,Z GOTO ER_ROR MOVLW .5 SUBWF OTVET4,W BTFSS STATUS,C RETURN BTFSS STATUS,Z GOTO ER_ROR MOVLW .245 SUBWF OTVET3,W BTFSS STATUS,C RETURN BTFSS STATUS,Z GOTO ER_ROR MOVLW .224 SUBWF OTVET2,W BTFSS STATUS,C RETURN BTFSC STATUS,Z RETURN ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№ ЦЕЛАЯ ЧАСТЬ В ЭКРАН НЕ ПОМЕСТИТСЯ ! № ;№ Значит, разделим её на десять, а для этого нужно проделать следующие № ;№ подготовительные операции: № ;№ - Скопировать ОТВЕТ в ПРИНЯТИЕ № ;№ - Копировать константу 10 в ВОЗДЕЙСТВИЕ № ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ER_ROR BSF FLAG2,3 ; Временное подтверждение ошибки BCF STATUS,C ; BTFSC FLAG2,4 GOTO $+3 CLRF SCHETZAP BSF STATUS,C RRF SCHETZAP,F ; BSF FLAG2,4 ; Главное (общее) подтверждение ошибки BSF FLAG4,1 ; Флаг промежуточной ошибки (используется в ПП КОРЕНЬ) MOVF OTVET1,W MOVWF PRIN1 MOVF OTVET2,W MOVWF PRIN2 MOVF OTVET3,W MOVWF PRIN3 MOVF OTVET4,W MOVWF PRIN4 MOVF OTVET5,W MOVWF PRIN5 MOVF OTVET6,W MOVWF PRIN6 MOVF OTVET7,W MOVWF PRIN7 CALL OFF_VOZ MOVLW .10 MOVWF VOZ1 RETURN ;************************************************************************************* ; Деление ;------------------------------------------------------------------------------------- ; ;;; ; ;;;;; ; ;;; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;;; ; ;;;;; ; ;;; ;************************************************************************************* ;************************************************************************************* ; Общие подготовительные операции ;************************************************************************************* DEL BCF FLAG,1 CLRF OSTAT1 CLRF OSTAT2 CLRF OSTAT3 CLRF OSTAT4 CLRF OSTAT5 CLRF OSTAT6 CLRF OSTAT7 CLRF OSTAT8 CLRF OTVET1 CLRF OTVET2 CLRF OTVET3 CLRF OTVET4 CLRF OTVET5 CLRF OTVET6 CLRF OTVET7 ;------------------------------------------------------------------------------------ ; Определяет количество знаков после запятой ;------------------------------------------------------------------------------------ MOVLW .7 MOVWF COL_ZNAC ; ----------------- ;------------------------------------------------------------------------------------ ; Определитель конфигурации колец деления ;------------------------------------------------------------------------------------ MOVLW .13 MOVWF CNTDIV ; ----------------- SNOVA CLRF COUNT ;************************************************************************************ ; Определение регистра делимого, один из полубайтов которого нужно копировать в младший ; полубайт регистра - остатка для последующего деления на делитель. ;************************************************************************************ BCF STATUS,C RRF CNTDIV,W MOVWF FSR MOVLW PRIN1 ADDWF FSR,F ; ----------------- ;************************************************************************************ ; Определение полубайта выбранного регистра - делимого ;************************************************************************************ BTFSC CNTDIV,0 GOTO RAW_1 ; ----------------- ;------------------------------------------------------------------------------------- ; Нулевой бит регистра CNTDIV равен 0, значит, происходит копирование младшего ; полубайта выбранного регистра ;------------------------------------------------------------------------------------- MOVLW B'00001111' ANDWF INDF,W IORWF OSTAT1,F GOTO START_DIV ; ----------------- ;------------------------------------------------------------------------------------- ; Нулевой бит регистра CNTDIV равен 1, значит, происходит копирование старшего ; полубайта выбранного регистра ;------------------------------------------------------------------------------------- RAW_1 SWAPF INDF,W ANDLW B'00001111' IORWF OSTAT1,F ; ----------------- ;************************************************************************************* ; Активация промежуточного деления ;************************************************************************************* START_DIV CALL MINUS BTFSC FLAG,0 GOTO PLUS INCF COUNT,F GOTO START_DIV ; ----------------- ;************************************************************************************* ; Прибавить делитель к делимому ;************************************************************************************* PLUS MOVF VOZ1,W ADDWF OSTAT1,F BTFSS STATUS,C GOTO PLUS1 ;---------------------------- INCFSZ OSTAT2,F GOTO PLUS1 INCFSZ OSTAT3,F GOTO PLUS1 INCFSZ OSTAT4,F GOTO PLUS1 INCFSZ OSTAT5,F GOTO PLUS1 INCFSZ OSTAT6,F GOTO PLUS1 INCF OSTAT7,F ;**************************** PLUS1 MOVF VOZ2,W ADDWF OSTAT2,F BTFSS STATUS,C GOTO PLUS2 ;---------------------------- INCFSZ OSTAT3,F GOTO PLUS2 INCFSZ OSTAT4,F GOTO PLUS2 INCFSZ OSTAT5,F GOTO PLUS2 INCFSZ OSTAT6,F GOTO PLUS2 INCF OSTAT7,F ;**************************** PLUS2 MOVF VOZ3,W ADDWF OSTAT3,F BTFSS STATUS,C GOTO PLUS3 ;---------------------------- INCFSZ OSTAT4,F GOTO PLUS3 INCFSZ OSTAT5,F GOTO PLUS3 INCFSZ OSTAT6,F GOTO PLUS3 INCF OSTAT7,F ;**************************** PLUS3 MOVF VOZ4,W ADDWF OSTAT4,F BTFSS STATUS,C GOTO PLUS4 ;---------------------------- INCFSZ OSTAT5,F GOTO PLUS4 INCFSZ OSTAT6,F GOTO PLUS4 INCF OSTAT7,F ;**************************** PLUS4 MOVF VOZ5,W ADDWF OSTAT5,F BTFSS STATUS,C GOTO PLUS5 ;---------------------------- INCFSZ OSTAT6,F GOTO PLUS5 INCF OSTAT7,F ;**************************** PLUS5 MOVF VOZ6,W ADDWF OSTAT6,F BTFSS STATUS,C GOTO PLUS6 ;---------------------------- INCF OSTAT7,F ;**************************** PLUS6 MOVF VOZ7,W ADDWF OSTAT7,F ; ----------------- MOVLW .100 SUBWF DROB1,W BTFSC STATUS,Z RETURN ;------------------------------------------------------------------------------------- ; Переход на процедуру распределения дробной части по регистрам ;------------------------------------------------------------------------------------- MOVLW .7 SUBWF COL_ZNAC,W BTFSS STATUS,Z GOTO RASPRED ; ----------------- ;************************************************************************************ ; Определение регистра - частного, в один полубайт которого нужно записать промежуточный ; результат деления из регистра COUNT ;************************************************************************************ BCF STATUS,C RRF CNTDIV,W MOVWF FSR MOVLW OTVET1 ADDWF FSR,F ; ----------------- ;************************************************************************************ ;Определение нужного полубайта выбранного регистра ;************************************************************************************ BTFSC CNTDIV,0 GOTO RAW1 ; ----------------- ;------------------------------------------------------------------------------------- ; Нулевой бит регистра CNTDIV равен 0, значит, происходит копирование в младший ; полубайт выбранного регистра ;------------------------------------------------------------------------------------- MOVF COUNT,W IORWF INDF,F GOTO ZENTR ; ----------------- ;------------------------------------------------------------------------------------- ; Нулевой бит регистра CNTDIV равен 1, значит, происходит копирование в старший ; полубайт выбранного регистра ;------------------------------------------------------------------------------------- RAW1 SWAPF COUNT,W IORWF INDF,F ; ----------------- ;************************************************************************************* ; Проверить регистр CNTDIV ;************************************************************************************* ZENTR DECF CNTDIV,F MOVLW .255 SUBWF CNTDIV,W BTFSC STATUS,Z GOTO DROBNOE ; ----------------- ;************************************************************************************* ; Сдвиг остатка от промежуточного деления на один полубайт влево. ;************************************************************************************* MOVLW .4 MOVWF COUNT BCF STATUS,C RLF OSTAT1,F RLF OSTAT2,F RLF OSTAT3,F RLF OSTAT4,F RLF OSTAT5,F RLF OSTAT6,F RLF OSTAT7,F DECFSZ COUNT,F GOTO $-9 ; ----------------- GOTO SNOVA ; ----------------- ;************************************************************************************ ; Вычитание делимого из делителя ;************************************************************************************ MINUS BCF FLAG,0 MOVF VOZ1,W SUBWF OSTAT1,F BTFSS STATUS,C ;---------------------------- CALL NET42 ;***************************** MOVF VOZ2,W SUBWF OSTAT2,F BTFSS STATUS,C ;---------------------------- CALL NET43 ;***************************** MOVF VOZ3,W SUBWF OSTAT3,F BTFSS STATUS,C ;---------------------------- CALL NET44 ;***************************** MOVF VOZ4,W SUBWF OSTAT4,F BTFSS STATUS,C ;---------------------------- CALL NET45 ;***************************** MOVF VOZ5,W SUBWF OSTAT5,F BTFSS STATUS,C ;---------------------------- CALL NET46 ;***************************** MOVF VOZ6,W SUBWF OSTAT6,F BTFSS STATUS,C ;---------------------------- CALL NET47 ;***************************** MOVF VOZ7,W SUBWF OSTAT7,F BTFSS STATUS,C BSF FLAG,0 ; ----------------- RETURN NET42 DECF OSTAT2,F MOVLW .255 SUBWF OSTAT2,W BTFSS STATUS,Z RETURN ; ----------------- NET43 DECF OSTAT3,F MOVLW .255 SUBWF OSTAT3,W BTFSS STATUS,Z RETURN ; ----------------- NET44 DECF OSTAT4,F MOVLW .255 SUBWF OSTAT4,W BTFSS STATUS,Z RETURN ; ----------------- NET45 DECF OSTAT5,F MOVLW .255 SUBWF OSTAT5,W BTFSS STATUS,Z RETURN ; ----------------- NET46 DECF OSTAT6,F MOVLW .255 SUBWF OSTAT6,W BTFSS STATUS,Z RETURN ; ----------------- NET47 DECF OSTAT7,F MOVLW .255 SUBWF OSTAT7,W BTFSC STATUS,Z BSF FLAG,0 RETURN ;************************************************************************************* ; Вычисление семи знаков после запятой ;************************************************************************************* DROBNOE MOVLW .101 SUBWF DROB1,W BTFSC STATUS,Z RETURN ;------------------------------------------------------------------------------------- ;Сохранение остатка в регистрах BUFER ;------------------------------------------------------------------------------------- MOVF OSTAT1,W MOVWF BUFER1 MOVF OSTAT2,W MOVWF BUFER2 MOVF OSTAT3,W MOVWF BUFER3 MOVF OSTAT4,W MOVWF BUFER4 MOVF OSTAT5,W MOVWF BUFER5 MOVF OSTAT6,W MOVWF BUFER6 MOVF OSTAT7,W MOVWF BUFER7 ; ----------------- ;------------------------------------------------------------------------------------- ;Умножение остатка на 8 ;------------------------------------------------------------------------------------- MOVLW .3 MOVWF COL_PRIB BCF STATUS,C RLF OSTAT1,F RLF OSTAT2,F RLF OSTAT3,F RLF OSTAT4,F RLF OSTAT5,F RLF OSTAT6,F RLF OSTAT7,F DECFSZ COL_PRIB,F GOTO $-9 ; ----------------- ;------------------------------------------------------------------------------------- ; Прибавить два раза к умноженному на 8 остатку его состояние до умножения ;------------------------------------------------------------------------------------- MOVLW .2 MOVWF COL_PRIB UMNX2 MOVF BUFER1,W ADDWF OSTAT1,F BTFSS STATUS,C GOTO NET10 ;---------------------------- INCFSZ OSTAT2,F GOTO NET10 INCFSZ OSTAT3,F GOTO NET10 INCFSZ OSTAT4,F GOTO NET10 INCFSZ OSTAT5,F GOTO NET10 INCFSZ OSTAT6,F GOTO NET10 INCF OSTAT7,F ;**************************** NET10 MOVF BUFER2,W ADDWF OSTAT2,F BTFSS STATUS,C GOTO NET11 ;---------------------------- INCFSZ OSTAT3,F GOTO NET11 INCFSZ OSTAT4,F GOTO NET11 INCFSZ OSTAT5,F GOTO NET11 INCFSZ OSTAT6,F GOTO NET11 INCF OSTAT7,F ;**************************** NET11 MOVF BUFER3,W ADDWF OSTAT3,F BTFSS STATUS,C GOTO NET12 ;---------------------------- INCFSZ OSTAT4,F GOTO NET12 INCFSZ OSTAT5,F GOTO NET12 INCFSZ OSTAT6,F GOTO NET12 INCF OSTAT7,F ;**************************** NET12 MOVF BUFER4,W ADDWF OSTAT4,F BTFSS STATUS,C GOTO NET13 ;---------------------------- INCFSZ OSTAT5,F GOTO NET13 INCFSZ OSTAT6,F GOTO NET13 INCF OSTAT7,F ;**************************** NET13 MOVF BUFER5,W ADDWF OSTAT5,F BTFSS STATUS,C GOTO NET14 ;---------------------------- INCFSZ OSTAT6,F GOTO NET14 INCF OSTAT7,F ;**************************** NET14 MOVF BUFER6,W ADDWF OSTAT6,F BTFSC STATUS,C ;---------------------------- INCF OSTAT7,F ;**************************** MOVF BUFER7,W ADDWF OSTAT7,F DECFSZ COL_PRIB,F GOTO UMNX2 ; ----------------- ; ----------------- BTFSC FLAG,1 RETURN ; ----------------- ; ----------------- DECF COL_ZNAC,F CLRF COUNT GOTO START_DIV ;************************************************************************************* ; Процедура распределения дробной части по регистрам DROB ;************************************************************************************* RASPRED MOVF COL_ZNAC,W SUBLW 0x53 MOVWF FSR MOVF COUNT,W MOVWF INDF MOVF COL_ZNAC,W BTFSS STATUS,Z GOTO DROBNOE CALL OPRED_ERROR ; Проверим, поместиться ли целая часть в экран BTFSC FLAG2,3 GOTO DELENIE CALL BIN_BCD ; Выход на преобразование ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ;№ РАСПРЕДЕЛЕНИЕ РЕЗУЛЬТАТА № ;№ Результат после отработки подпрограммы вычисления разделен на 2 части: № ;№ К первой части относится целая часть, она находится в регистрах SCREEN № ;№ Ко второй части относится дробная часть, которая находится в регистрах DROB № ;№ Подпрограмма RAS_OTVETA объединяет эти части в одну с сохранением № ;№ результата в SCREEN № ;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ RAS_OTVETA MOVLW .1 MOVWF TOCHPRIN CRUG4 MOVF SCREEN8,W BTFSS STATUS,Z GOTO NET20 ; ИНДИКАТОР ЗАПОЛНЕН ПОЛНОСТЬЮ (ВЫХОДИМ) ;************************************************************************************* ; Экранная память ;************************************************************************************* CALL ZDVIG_VLEVO_SCREEN ; Сдвиг регистров экранной памяти влево MOVF DROB1,W MOVWF SCREEN1 MOVF DROB2,W MOVWF DROB1 MOVF DROB3,W MOVWF DROB2 MOVF DROB4,W MOVWF DROB3 MOVF DROB5,W MOVWF DROB4 MOVF DROB6,W MOVWF DROB5 MOVF DROB7,W MOVWF DROB6 CLRF DROB7 BCF STATUS,C RLF TOCHPRIN,F BTFSS TOCHPRIN,7 GOTO CRUG4 NET20 BSF PCLATH,3 ; BSF PCLATH,3 CALL CORRECTIC BCF PCLATH,3 ; BCF PCLATH,3 CALL VOST_VOZ RETURN ;************************************************************************************* ; ВХОД В ДЕЛЕНИЕ ;************************************************************************************* ;------------------------------------------------------------------------------------- ; Сдвиг вправо регистров «плавающей» запятой ;------------------------------------------------------------------------------------- DELENIE BSF FLAG,1 BCF STATUS,C RRF TOCHVOZ,F BCF STATUS,C RRF TOCHPRIN,F ;------------------------------------------------------------------------------------- ; Проверка на ноль регистров «плавающей» запятой ;------------------------------------------------------------------------------------- MOVF TOCHVOZ,W IORWF TOCHPRIN,W BTFSC STATUS,Z GOTO DEL MOVF TOCHVOZ,W BTFSC STATUS,Z GOTO VOZx10 MOVF TOCHPRIN,W BTFSC STATUS,Z GOTO PRINx10 GOTO DELENIE ;------------------------------------------------------------------------------------- ; Подготовка к умножению на 10 регистра воздействия ;------------------------------------------------------------------------------------- VOZx10 MOVF VOZ1,W MOVWF OSTAT1 MOVF VOZ2,W MOVWF OSTAT2 MOVF VOZ3,W MOVWF OSTAT3 MOVF VOZ4,W MOVWF OSTAT4 MOVF VOZ5,W MOVWF OSTAT5 MOVF VOZ6,W MOVWF OSTAT6 MOVF VOZ7,W MOVWF OSTAT7 ;------------------------------------------------------------------------------------- ; Умножение на 10 регистра воздействия ;------------------------------------------------------------------------------------- CALL DROBNOE ;------------------------------------------------------------------------------------- MOVF OSTAT1,W MOVWF VOZ1 MOVF OSTAT2,W MOVWF VOZ2 MOVF OSTAT3,W MOVWF VOZ3 MOVF OSTAT4,W MOVWF VOZ4 MOVF OSTAT5,W MOVWF VOZ5 MOVF OSTAT6,W MOVWF VOZ6 MOVF OSTAT7,W MOVWF VOZ7 GOTO DELENIE ;------------------------------------------------------------------------------------- ; Подготовка к умножению на 10 регистра принятия ;------------------------------------------------------------------------------------- PRINx10 MOVF PRIN1,W MOVWF OSTAT1 MOVF PRIN2,W MOVWF OSTAT2 MOVF PRIN3,W MOVWF OSTAT3 MOVF PRIN4,W MOVWF OSTAT4 MOVF PRIN5,W MOVWF OSTAT5 MOVF PRIN6,W MOVWF OSTAT6 MOVF PRIN7,W MOVWF OSTAT7 ;------------------------------------------------------------------------------------- ; Умножение на 10 регистра принятия ;------------------------------------------------------------------------------------- CALL DROBNOE ;------------------------------------------------------------------------------------- MOVF OSTAT1,W MOVWF PRIN1 MOVF OSTAT2,W MOVWF PRIN2 MOVF OSTAT3,W MOVWF PRIN3 MOVF OSTAT4,W MOVWF PRIN4 MOVF OSTAT5,W MOVWF PRIN5 MOVF OSTAT6,W MOVWF PRIN6 MOVF OSTAT7,W MOVWF PRIN7 GOTO DELENIE ;************************************************************************************* ; Прибавление ;------------------------------------------------------------------------------------- ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;************************************************************************************* ;===================================================================================== ; Совмещение дополнительного принятия и воздействия по запятым ;===================================================================================== SOVMESTITE MOVF TOCHPRIN,W SUBWF TOCHVOZ,W BTFSC STATUS,Z RETURN BTFSS STATUS,C GOTO NET29 MOVF DOPPRIN8,W BTFSS STATUS,Z GOTO NET30 MOVF DOPPRIN7,W MOVWF DOPPRIN8 MOVF DOPPRIN6,W MOVWF DOPPRIN7 MOVF DOPPRIN5,W MOVWF DOPPRIN6 MOVF DOPPRIN4,W MOVWF DOPPRIN5 MOVF DOPPRIN3,W MOVWF DOPPRIN4 MOVF DOPPRIN2,W MOVWF DOPPRIN3 MOVF DOPPRIN1,W MOVWF DOPPRIN2 CLRF DOPPRIN1 BCF STATUS,C RLF TOCHPRIN,F GOTO SOVMESTITE NET30 MOVF DOPVOZ2,W MOVWF DOPVOZ1 MOVF DOPVOZ3,W MOVWF DOPVOZ2 MOVF DOPVOZ4,W MOVWF DOPVOZ3 MOVF DOPVOZ5,W MOVWF DOPVOZ4 MOVF DOPVOZ6,W MOVWF DOPVOZ5 MOVF DOPVOZ7,W MOVWF DOPVOZ6 MOVF DOPVOZ8,W MOVWF DOPVOZ7 CLRF DOPVOZ8 BCF STATUS,C RRF TOCHVOZ,F GOTO SOVMESTITE ;----------------------------------- NET29 MOVF DOPVOZ8,W BTFSS STATUS,Z GOTO NET31 MOVF DOPVOZ7,W MOVWF DOPVOZ8 MOVF DOPVOZ6,W MOVWF DOPVOZ7 MOVF DOPVOZ5,W MOVWF DOPVOZ6 MOVF DOPVOZ4,W MOVWF DOPVOZ5 MOVF DOPVOZ3,W MOVWF DOPVOZ4 MOVF DOPVOZ2,W MOVWF DOPVOZ3 MOVF DOPVOZ1,W MOVWF DOPVOZ2 CLRF DOPVOZ1 BCF STATUS,C RLF TOCHVOZ,F GOTO SOVMESTITE NET31 CALL ZDVIG_VPRAVO_DOPPRIN GOTO SOVMESTITE ;************************************************************************************* ; Сложение DOPPRIN и DOPVOZ с сохранением результата в DOPPRIN ;************************************************************************************* START_PLUS MOVF DOPVOZ1,W ADDWF DOPPRIN1,F MOVLW .10 SUBWF DOPPRIN1,W BTFSS STATUS,C GOTO $+4 MOVLW .10 SUBWF DOPPRIN1,F INCF DOPPRIN2,F ;------------------------------ MOVF DOPVOZ2,W ADDWF DOPPRIN2,F MOVLW .10 SUBWF DOPPRIN2,W BTFSS STATUS,C GOTO $+4 MOVLW .10 SUBWF DOPPRIN2,F INCF DOPPRIN3,F ;------------------------------ MOVF DOPVOZ3,W ADDWF DOPPRIN3,F MOVLW .10 SUBWF DOPPRIN3,W BTFSS STATUS,C GOTO $+4 MOVLW .10 SUBWF DOPPRIN3,F INCF DOPPRIN4,F ;------------------------------ MOVF DOPVOZ4,W ADDWF DOPPRIN4,F MOVLW .10 SUBWF DOPPRIN4,W BTFSS STATUS,C GOTO $+4 MOVLW .10 SUBWF DOPPRIN4,F INCF DOPPRIN5,F ;------------------------------ MOVF DOPVOZ5,W ADDWF DOPPRIN5,F MOVLW .10 SUBWF DOPPRIN5,W BTFSS STATUS,C GOTO $+4 MOVLW .10 SUBWF DOPPRIN5,F INCF DOPPRIN6,F ;------------------------------ MOVF DOPVOZ6,W ADDWF DOPPRIN6,F MOVLW .10 SUBWF DOPPRIN6,W BTFSS STATUS,C GOTO $+4 MOVLW .10 SUBWF DOPPRIN6,F INCF DOPPRIN7,F ;------------------------------ MOVF DOPVOZ7,W ADDWF DOPPRIN7,F MOVLW .10 SUBWF DOPPRIN7,W BTFSS STATUS,C GOTO $+4 MOVLW .10 SUBWF DOPPRIN7,F INCF DOPPRIN8,F ;------------------------------ MOVF DOPVOZ8,W ADDWF DOPPRIN8,F MOVLW .10 SUBWF DOPPRIN8,W BTFSS STATUS,C GOTO NET33 ;************************************************************************************* ; Работа с перегрузкой ;************************************************************************************* MOVLW .10 SUBWF DOPPRIN8,F ;------------------------------------------------------------------------------------ ; Проверить привела ли перегрузка к ошибке ;------------------------------------------------------------------------------------ BTFSS TOCHPRIN,0 GOTO NET35 ;------------------------------------------------------------------------------------ ; Ошибка ЕСТЬ! Значит, сдвигаем показания, устанавливаем флаг ошибки и ; отделяем самый старший разряд запятой ;------------------------------------------------------------------------------------ CALL ZDVIG_VPRAVO_DOPPRIN MOVLW .1 MOVWF DOPPRIN8 MOVLW .128 MOVWF SCHETZAP BSF FLAG2,4 GOTO NET28 ; Просто копируем результат ошибки в экранную память и выходим NET35 CALL ZDVIG_VPRAVO_DOPPRIN MOVLW .1 MOVWF DOPPRIN8 ;..................................................................................... ; 25,000 -> 25, ;..................................................................................... NET33 BTFSC TOCHPRIN,0 GOTO NET28 ; Отображение MOVF DOPPRIN1,W BTFSS STATUS,Z GOTO NET28 ; Отображение CALL ZDVIG_VPRAVO_DOPPRIN GOTO NET33 ;------------------------------------------------------------------------------------ ; Копируем результат ошибки в экранную память и выходим ;------------------------------------------------------------------------------------ NET28 MOVF DOPPRIN8,W MOVWF SCREEN8 MOVF DOPPRIN7,W MOVWF SCREEN7 MOVF DOPPRIN6,W MOVWF SCREEN6 MOVF DOPPRIN5,W MOVWF SCREEN5 MOVF DOPPRIN4,W MOVWF SCREEN4 MOVF DOPPRIN3,W MOVWF SCREEN3 MOVF DOPPRIN2,W MOVWF SCREEN2 MOVF DOPPRIN1,W MOVWF SCREEN1 ;------------------------------------------------------------------------------------ ; Результат деления уже находится в экранной памяти, но его еще нужно преобразовать в ; двоичную форму и скопировать в регистры ПРИНЯТИЯ ;------------------------------------------------------------------------------------ CALL COPIR1 RETURN ;------------------------------------------------------------------------------------ ; Сравнение регистров DOPVOZ и DOPPRIN ;------------------------------------------------------------------------------------ SRAVNITE MOVF DOPVOZ8,W SUBWF DOPPRIN8,W BTFSS STATUS,C GOTO SMENA BTFSS STATUS,Z GOTO START_MINUS MOVF DOPVOZ7,W SUBWF DOPPRIN7,W BTFSS STATUS,C GOTO SMENA BTFSS STATUS,Z GOTO START_MINUS MOVF DOPVOZ6,W SUBWF DOPPRIN6,W BTFSS STATUS,C GOTO SMENA BTFSS STATUS,Z GOTO START_MINUS MOVF DOPVOZ5,W SUBWF DOPPRIN5,W BTFSS STATUS,C GOTO SMENA BTFSS STATUS,Z GOTO START_MINUS MOVF DOPVOZ4,W SUBWF DOPPRIN4,W BTFSS STATUS,C GOTO SMENA BTFSS STATUS,Z GOTO START_MINUS MOVF DOPVOZ3,W SUBWF DOPPRIN3,W BTFSS STATUS,C GOTO SMENA BTFSS STATUS,Z GOTO START_MINUS MOVF DOPVOZ2,W SUBWF DOPPRIN2,W BTFSS STATUS,C GOTO SMENA BTFSS STATUS,Z GOTO START_MINUS MOVF DOPVOZ1,W SUBWF DOPPRIN1,W BTFSS STATUS,C GOTO SMENA BTFSS STATUS,Z GOTO START_MINUS BCF FLAG2,1 GOTO START_MINUS ;------------------------------------------------------------------------------------ ; Поменять местами регистры DOPVOZ и DOPPRIN ;------------------------------------------------------------------------------------ SMENA MOVLW .64 MOVWF BUFER1 BCF STATUS,C NET36 RLF DOPPRIN1,F RLF DOPPRIN2,F RLF DOPPRIN3,F RLF DOPPRIN4,F RLF DOPPRIN5,F RLF DOPPRIN6,F RLF DOPPRIN7,F RLF DOPPRIN8,F RLF DOPVOZ1,F RLF DOPVOZ2,F RLF DOPVOZ3,F RLF DOPVOZ4,F RLF DOPVOZ5,F RLF DOPVOZ6,F RLF DOPVOZ7,F RLF DOPVOZ8,F DECFSZ BUFER1,F GOTO NET36 RLF DOPPRIN1,F RLF DOPPRIN2,F RLF DOPPRIN3,F RLF DOPPRIN4,F RLF DOPPRIN5,F RLF DOPPRIN6,F RLF DOPPRIN7,F RLF DOPPRIN8,F MOVLW B'00000010' XORWF FLAG2,F ; Инвертировать знак принятия ;************************************************************************************* ; Вычитание ;------------------------------------------------------------------------------------- ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;************************************************************************************* ;------------------------------------------------------------------------------------ ; Преобразовать двоично-десятичное значение из DOPVOZ в двоичное с сохранением в регистры VOZ ;------------------------------------------------------------------------------------ START_MINUS MOVF DOPVOZ1,W MOVWF SCREEN1 MOVF DOPVOZ2,W MOVWF SCREEN2 MOVF DOPVOZ3,W MOVWF SCREEN3 MOVF DOPVOZ4,W MOVWF SCREEN4 MOVF DOPVOZ5,W MOVWF SCREEN5 MOVF DOPVOZ6,W MOVWF SCREEN6 MOVF DOPVOZ7,W MOVWF SCREEN7 MOVF DOPVOZ8,W MOVWF SCREEN8 BSF FLAG,6 CALL COPIR1 ;------------------------------------------------------------------------------------ ; Преобразовать двоично-десятичное значение из DOPPRIN в двоичное с сохранением в регистры PRIN ;------------------------------------------------------------------------------------ MOVF DOPPRIN1,W MOVWF SCREEN1 MOVF DOPPRIN2,W MOVWF SCREEN2 MOVF DOPPRIN3,W MOVWF SCREEN3 MOVF DOPPRIN4,W MOVWF SCREEN4 MOVF DOPPRIN5,W MOVWF SCREEN5 MOVF DOPPRIN6,W MOVWF SCREEN6 MOVF DOPPRIN7,W MOVWF SCREEN7 MOVF DOPPRIN8,W MOVWF SCREEN8 BCF FLAG,6 CALL COPIR1 ;************************************************************************************* ; Вычитание из регистров PRIN регистры VOZ с сохранением в PRIN ;************************************************************************************* MOVF VOZ1,W SUBWF PRIN1,F BTFSS STATUS,C ;---------------------------- CALL NET37 ;***************************** MOVF VOZ2,W SUBWF PRIN2,F BTFSS STATUS,C ;---------------------------- CALL NET38 ;***************************** MOVF VOZ3,W SUBWF PRIN3,F BTFSS STATUS,C ;---------------------------- CALL NET39 ;***************************** MOVF VOZ4,W SUBWF PRIN4,F BTFSS STATUS,C ;---------------------------- CALL NET40 ;***************************** MOVF VOZ5,W SUBWF PRIN5,F BTFSS STATUS,C ;---------------------------- CALL NET41 ;***************************** MOVF VOZ6,W SUBWF PRIN6,F BTFSS STATUS,C ;---------------------------- DECF PRIN7,F ;***************************** MOVF VOZ7,W SUBWF PRIN7,F ; ----------------- ;------------------------------------------------------------------------------------ ; Преобразовать результат вычитания в двоично-десятичную форму ;------------------------------------------------------------------------------------ CALL PRIN_V_OTVET CALL BIN_BCD NET52 BSF PCLATH,3 ; BSF PCLATH,3 CALL CORRECTIC BCF PCLATH,3 ; BCF PCLATH,3 RETURN NET37 DECF PRIN2,F MOVLW .255 SUBWF PRIN2,W BTFSS STATUS,Z RETURN ; ----------------- NET38 DECF PRIN3,F MOVLW .255 SUBWF PRIN3,W BTFSS STATUS,Z RETURN ; ----------------- NET39 DECF PRIN4,F MOVLW .255 SUBWF PRIN4,W BTFSS STATUS,Z RETURN ; ----------------- NET40 DECF PRIN5,F MOVLW .255 SUBWF PRIN5,W BTFSS STATUS,Z RETURN ; ----------------- NET41 DECF PRIN6,F MOVLW .255 SUBWF PRIN6,W BTFSC STATUS,Z ; ----------------- DECF PRIN7,F RETURN ;************************************************************************************* ; Умножение ;------------------------------------------------------------------------------------- ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;************************************************************************************* UMNOGENIE MOVLW .100 MOVWF DROB1 MOVLW .27 MOVWF COUNT CLRF OSTAT1 CLRF OSTAT2 CLRF OSTAT3 CLRF OSTAT4 CLRF OSTAT5 CLRF OSTAT6 CLRF OSTAT7 ;........................................... SNOVA_UMN BCF STATUS,C RRF PRIN7,F RRF PRIN6,F RRF PRIN5,F RRF PRIN4,F RRF PRIN3,F RRF PRIN2,F RRF PRIN1,F BTFSS STATUS,C GOTO OBHOD_PLUS ;============================ CALL PLUS ;============================ OBHOD_PLUS DECFSZ COUNT,F GOTO NET64 GOTO VIHODIM NET64 BCF STATUS,C RLF VOZ1,F RLF VOZ2,F RLF VOZ3,F RLF VOZ4,F RLF VOZ5,F RLF VOZ6,F RLF VOZ7,F GOTO SNOVA_UMN VIHODIM MOVF OSTAT1,W MOVWF OTVET1 MOVF OSTAT2,W MOVWF OTVET2 MOVF OSTAT3,W MOVWF OTVET3 MOVF OSTAT4,W MOVWF OTVET4 MOVF OSTAT5,W MOVWF OTVET5 MOVF OSTAT6,W MOVWF OTVET6 MOVF OSTAT7,W MOVWF OTVET7 MOVLW .101 MOVWF DROB1 NET57 CALL OPRED_ERROR ; Проверим, поместиться ли целая часть в экран BTFSS FLAG2,3 GOTO NET56 CALL DEL GOTO NET57 NET56 CLRF DROB1 CALL BIN_BCD ;************************************************************************************ ; Здесь начинается работа с запятой. ;************************************************************************************ MOVF TOCHPRIN,W MOVWF BUFER1 CLRF BUFER2 CLRF BUFER3 CLRF BUFER4 ;------------------------------------------------------------------------------------ ; Сдвинуть трехбайтный регистр BUFER3 – 1 влево на столько раз, на сколько раз сдвинута ; влево запятая воздействия. Если запятая воздействия имеет исходное состояние, то и ; сдвигать не чего не нужно ;------------------------------------------------------------------------------------ NET58 BCF STATUS,C RRF TOCHVOZ,F BTFSC STATUS,C GOTO NET89 RLF BUFER1,F RLF BUFER2,F RLF BUFER3,F GOTO NET58 ;------------------------------------------------------------------------------------ ; Если FLAG2,7 установлен то трехбайтный регистр BUFER3 – 1 сдвинется влево два раза ; (это нужно для деления на сто при вычислении процентов) ;------------------------------------------------------------------------------------ NET89 BTFSS FLAG2,7 GOTO NET49 BCF STATUS,C RLF BUFER1,F RLF BUFER2,F RLF BUFER3,F BCF STATUS,C RLF BUFER1,F RLF BUFER2,F RLF BUFER3,F ;------------------------------------------------------------------------------------ NET49 MOVF SCHETZAP,W BTFSC STATUS,Z ; GOTO NET48 ; BCF STATUS,C ; RLF SCHETZAP,F BTFSC STATUS,C GOTO NET50 RRF BUFER3,F RRF BUFER2,F RRF BUFER1,F RRF BUFER4,F GOTO NET49 NET50 BCF STATUS,C RRF BUFER3,F RRF BUFER2,F RRF BUFER1,F RRF BUFER4,F MOVF BUFER4,W ; BTFSS STATUS,Z GOTO NET62 ; BCF FLAG2,4 GOTO NET48 NET62 MOVF BUFER4,W MOVWF SCHETZAP GOTO NET52 ; сдвиг запятых вместе с показаниями ;-------------------------------- NET48 MOVF BUFER1,W BTFSS STATUS,Z ; BUFER1 заполнен ? GOTO NET51 ; Да ;-------------------------------- ; Нет CALL ZDVIG_VPRAVO_SCREEN ; Сдвиг показаний BCF STATUS,C RRF BUFER3,F RRF BUFER2,F ; Сдвиг запятой RRF BUFER1,F GOTO NET48 NET51 MOVF BUFER1,W MOVWF TOCHPRIN GOTO NET52 ;************************************************************************************* ; Организация памяти ;------------------------------------------------------------------------------------- ; # # #### # # ### #### # # ; ## ## # ## ## # # # # # # ; # ## # #### # ## # # # #### # ; # # # # # # # # # # ; # # #### # # ### # # # ;************************************************************************************* MEMMI BSF PCLATH,3 ; BSF PCLATH,3 CALL NUKA BCF PCLATH,3 ; BCF PCLATH,3 BTFSC FLAG,2 ; Проверить был ли переход на страницу воздействия GOTO DINAMICA ; ДА ; НЕТ BSF FLAG3,4 BCF FLAG,3 ; Запятая вЫключена! BSF FLAG3,6 BSF PCLATH,3 ; BSF PCLATH,3 MOVF BUFER1,W MOVWF BUFER7 CALL CORRECTIC ;------------------------------------------------------------------------------------- ; Записываем регистры общего назначения в ПП UNIVRSOHR с адресами 0x20 - 0x7C в EEPROM памяти BSF STATUS,RP0 ; Установить банк 1 MOVLW 0x20 MOVWF NAHALADRES MOVLW 0x7C MOVWF CONECADRES CALL UNIVRSOHR ; BCF STATUS,RP0 ; Установить банк 0 ;------------------------------------------------------------------------------------ ; Замена в SCREEN десяток на нули с последующим копированием в DOPVOZ ; (вместе с запятой и знаком текущего банка) ;------------------------------------------------------------------------------------ BCF PCLATH,3 ; BCF PCLATH,3 CALL ZAMSCR10_0 ;Копирование SCREEN в DOPVOZ MOVF SCREEN1,W MOVWF DOPVOZ1 MOVF SCREEN2,W MOVWF DOPVOZ2 MOVF SCREEN3,W MOVWF DOPVOZ3 MOVF SCREEN4,W MOVWF DOPVOZ4 MOVF SCREEN5,W MOVWF DOPVOZ5 MOVF SCREEN6,W MOVWF DOPVOZ6 MOVF SCREEN7,W MOVWF DOPVOZ7 MOVF SCREEN8,W MOVWF DOPVOZ8 BTFSC FLAG,6 GOTO NET70 MOVF TOCHPRIN,W MOVWF TOCHVOZ ; Сделать запятую ПРИНЯТИЯ запятой ВОЗДНЙСТВИЯ BCF FLAG2,2 BTFSC FLAG2,1 ; Сделать знак ПРИНЯТИЯ знаком ВОЗДНЙСТВИЯ BSF FLAG2,2 ;------------------------------------------------------------------------------------ ; Копировать Memory в DOPPRIN (вместе с запятой и знаком) ;------------------------------------------------------------------------------------ NET70 MOVLW DOPPRIN1 MOVWF FSR BSF STATUS,RP0 ; Установить банк 1 MOVF MEMORY1,W MOVWF INDF INCF FSR,F MOVF MEMORY2,W MOVWF INDF INCF FSR,F MOVF MEMORY3,W MOVWF INDF INCF FSR,F MOVF MEMORY4,W MOVWF INDF INCF FSR,F MOVF MEMORY5,W MOVWF INDF INCF FSR,F MOVF MEMORY6,W MOVWF INDF INCF FSR,F MOVF MEMORY7,W MOVWF INDF INCF FSR,F MOVF MEMORY8,W MOVWF INDF BCF STATUS,RP0 ; Установить банк 0 MOVF ZAPMEMORY,W MOVWF TOCHPRIN ; Сделать запятую ZAPMEMORY запятой ПРИНЯТИЯ BCF FLAG2,1 BTFSC FLAG3,0 ; Сделать знак MEMORY знаком ПРИНЯТИЯ BSF FLAG2,1 BTFSS BUFER7,0 ; Какая кнопка нажата? GOTO NET69 ;M+ BCF PCLATH,3 ; BCF PCLATH,3 CALL PLUSMEMORI GOTO NET71 ;M- NET69 BCF PCLATH,3 ; BCF PCLATH,3 CALL MINUSMEMORI ;------------------------------------------------------------------------------------ ; Копировать SCREEN в Memory (вместе с запятой и знаком) ;------------------------------------------------------------------------------------ NET71 BSF PCLATH,3 ; BSF PCLATH,3 BTFSC FLAG2,4 GOTO NET80 BSF STATUS,RP0 ; Установить банк 1 MOVLW MEMORY1 MOVWF FSR BCF STATUS,RP0 ; Установить банк 0 MOVF SCREEN1,W MOVWF INDF INCF FSR,F MOVF SCREEN2,W MOVWF INDF INCF FSR,F MOVF SCREEN3,W MOVWF INDF INCF FSR,F MOVF SCREEN4,W MOVWF INDF INCF FSR,F MOVF SCREEN5,W MOVWF INDF INCF FSR,F MOVF SCREEN6,W MOVWF INDF INCF FSR,F MOVF SCREEN7,W MOVWF INDF INCF FSR,F MOVF SCREEN8,W MOVWF INDF MOVF TOCHPRIN,W MOVWF ZAPMEMORY ; Сделать запятую ПРИНЯТИЯ запятой MEMORY BCF FLAG3,0 BTFSC FLAG2,1 ; Сделать знак ПРИНЯТИЯ знаком MEMORY BSF FLAG3,0 ;------------------------------------------------------------------------------------ NET80 BCF FLAG3,1 BTFSC FLAG2,4 ; Если была ошибка то устанавливаем FLAG3,1 BSF FLAG3,1 ;------------------------------------------------------------------------------------ BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVLW 0x20 MOVWF NAHALADRES MOVLW 0x7C MOVWF CONECADRES CALL UNIVERVOST ; BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК BCF FLAG2,4 BTFSC FLAG3,1 ; Если была ошибка то устанавливаем FLAG2,4 BSF FLAG2,4 BSF FLAG3,3 ; Включить светодиод памяти ;------------------------------------------------------------------------------------ ; Если память равна нулю то флаг FLAG3,3 (индикатор ERROR на экране) обнуляется ; Если память не ровна нулю, то флаг установится ;------------------------------------------------------------------------------------ BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVLW .8 MOVWF BUFMEMORY MOVLW MEMORY1 MOVWF FSR NET73 MOVF INDF,W BTFSS STATUS,Z GOTO NET72 INCF FSR,F DECFSZ BUFMEMORY,F GOTO NET73 BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК BCF FLAG3,3 ; Выключить светодиод памяти ;------------------------------------------------------------------------------------- ;Если вычисление привело к ошибке (FLAG2,4 = 1) то SCHETZAP = 0 и все минусы убираются. NET72 BCF STATUS,RP0 ; Установить банк 0 BCF PCLATH,3 ; BCF PCLATH,3 BTFSS FLAG2,4 GOTO DINAMICA CALL OFF_ICRAN CLRF SCHETZAP BCF FLAG2,1 BCF FLAG2,2 GOTO DINAMICA ;------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------ ; Полное извлечение регистров MEMORY (MR) ;------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------ ;************************************************************************************* ; Организация памяти ;------------------------------------------------------------------------------------- ; # # #### ; ## ## # # ; # ## # #### ; # # # # ; # # # # ;************************************************************************************* ;------------------------------------------------------------------------------------ ; Обнуляем показания индикатора ;------------------------------------------------------------------------------------ MR BCF PCLATH,3 ; BCF PCLATH,3 CALL OFF_ICRAN ; Обнуляем регистры экранной памяти BCF FLAG,3 ; Выключаем запятую BSF FLAG3,6 ; Флаг для блокировки "CE" и Backspace BSF FLAG3,4 ; Устанавливаем флаг FLAG3,4 для гашения отображаемого ; значения в ПП GASIM_POCAZ после нажатия на "цифру" или на "запятую" BCF FLAG,4 ; Обнуление индикатора переполнения экрана BSF FLAG3,2 ; Устанавливаем флаг FLAG3,2 для использования ПП цифра CLRF BUFER1 ; Обнуляем BUFER1 CALL CIFMEM ; и переходим на ПП цифра для имитации нажатия цифры 0 BCF FLAG3,2 ; Обнуляем флаг использования ПП цифра BSF PCLATH,3 ; BSF PCLATH,3 MOVF ZAPMEMORY,W BTFSS FLAG,6 GOTO NET74 ;------------------------------------------------------------------------------------ ; Делаем запятую и знак MEMORY запятой и знаком принятия или воздействия (зависит от FLAG,6) ;------------------------------------------------------------------------------------ MOVWF TOCHVOZ ; Сделать запятую MEMORY запятой ВОЗДЕЙСТВИЯ BCF FLAG2,2 BTFSC FLAG3,0 ; Сделать знак MEMORY знаком ВОЗДЕЙСТВИЯ BSF FLAG2,2 GOTO NET75 NET74 MOVWF TOCHPRIN ; Сделать запятую MEMORY запятой ПРИНЯТИЯ BCF FLAG2,1 BTFSC FLAG3,0 ; Сделать знак MEMORY знаком ПРИНЯТИЯ BSF FLAG2,1 ;------------------------------------------------------------------------------------ ; Копируем MEMORY в SCREEN ;------------------------------------------------------------------------------------ NET75 MOVLW SCREEN1 MOVWF FSR BSF STATUS,RP0 ; Установить банк 1 MOVF MEMORY1,W MOVWF INDF INCF FSR,F MOVF MEMORY2,W MOVWF INDF INCF FSR,F MOVF MEMORY3,W MOVWF INDF INCF FSR,F MOVF MEMORY4,W MOVWF INDF INCF FSR,F MOVF MEMORY5,W MOVWF INDF INCF FSR,F MOVF MEMORY6,W MOVWF INDF INCF FSR,F MOVF MEMORY7,W MOVWF INDF INCF FSR,F MOVF MEMORY8,W MOVWF INDF BCF STATUS,RP0 ; Установить банк 0 BCF PCLATH,3 ; BCF PCLATH,3 CALL COPIR1 ; Преобразовать SCREEN в BIN GOTO DINAMICA ;..................................................................................... ; 25,000 -> 25, ;..................................................................................... CORRECTIC MOVF TOCHPRIN,W MOVWF FSR BTFSS FLAG,6 GOTO NET86 MOVF TOCHVOZ,W MOVWF FSR NET86 BTFSC FSR,0 GOTO NET138 MOVF SCREEN1,W BTFSS STATUS,Z GOTO NET138 ;------------------------------------------------------------------------------------- ; Сдвиг регистров экранной памяти вправо ;------------------------------------------------------------------------------------- BCF PCLATH,3 ; BCF PCLATH,3 CALL ZDVIG_VPRAVO_SCREEN ; BSF PCLATH,3 ; BSF PCLATH,3 BCF STATUS,C RRF FSR,F GOTO NET86 NET138 MOVF FSR,W BTFSC FLAG,6 ; Восстанавливаем запятую из OSTAT1... GOTO $+3 MOVWF TOCHPRIN ; в TOCHPRIN GOTO NET117 MOVWF TOCHVOZ ; в TOCHVOZ NET117 BCF PCLATH,3 ; BCF PCLATH,3 CALL COPIR1 BSF PCLATH,3 ; BSF PCLATH,3 RETURN ;************************************************************************************* ; Процент ;------------------------------------------------------------------------------------- ; ## # ; # # # ; ## # ; # ## ; # # # ; # ## ;************************************************************************************* ; ; - Разрешаем гасить отображаемое значение в ПП GASIM_POCAZ после нажатия на "цифру" или ; на "запятую" (FLAG3,4 = 1) ; - Обнуляем флаг операции (FLAG,2 = 0) ; - Устанавливаем FLAG3,6 для блокировки "CE" и Backspace ; - Разрешаем вычисление после нажатия на операцию (FLAG2,0 = 1) ; - Отключаем запятую FLAG,3 = 0 ; - Если был переход на страницу воздействия, то устанавливаем FLAG,6 ; - Перед вычислением процентов происходит сохранение FLAG,6 ; - Обнуление FLAG,6 для того чтобы результат вычисления записался в принятие ; - Сохранение регистров принятия (0x2F - 0x35) в EEPROM памяти. Сохранение происходит в ; ПП UNIVRSOHR, также происходит сохранение запятой принятия в BUFER8 и знака в FLAG3,5 ; - После того как принятие сохранилось пора умножить принятие на воздействие только перед ; умножением нужно установить флаг FLAG2,7 для деления на 100 в ПП UMNOGENIE1 ; - После умножения флаг FLAG2,7 обнуляется ; - Если страница принятия то выходим. ; - Если страница воздействия, то копируем результат из принятия в воздействие ; - Принятие восстанавливается из EEPROM памяти, также восстанавливается запятая из BUFER8 ; и знак из FLAG3,5 ;------------------------------------------------------------------------------------- PROCENT BSF FLAG3,4 ; Разрешаем гасить отображаемое значение в ПП GASIM_POCAZ ; после нажатия на "цифру" или на "запятую" BCF FLAG,2 ; Обнуляем флаг операции BSF FLAG3,6 ; Устанавливаем FLAG3,6 для блокировки "CE" и Backspace BSF FLAG2,0 ; Разрешаем вычисление после нажатия на операцию BCF FLAG,3 ; Отключаем запятую FLAG,3 = 0 BTFSC FLAG,2 ; Проверить, был ли переход на страницу воздействия BSF FLAG,6 ; Теперь будем сдвигать, и отображать запятую воздействия BCF FLAG4,4 BTFSC FLAG,6 ; Сохранение FLAG,6 в FLAG4,4 BSF FLAG4,4 BCF FLAG,6 ; Результат вычисления процента направим в принятие ;------------------------------------------------------------------------------------- ; Сохранение регистров принятия (0x2F - 0x35) в EEPROM памяти. Сохранение происходит ; в ПП UNIVRSOHR, ;------------------------------------------------------------------------------------- BSF STATUS,RP0 ; Установить банк 1 MOVLW 0x2F MOVWF NAHALADRES MOVLW 0x35 MOVWF CONECADRES CALL UNIVRSOHR ; ;------------------------------------------------------------------------------------- ;также происходит сохранение запятой принятия в BUFER8 и знака в FLAG3,5 ;------------------------------------------------------------------------------------- BCF STATUS,RP1 BCF STATUS,RP0 ; Установить банк 0 MOVF TOCHPRIN,W BSF STATUS,RP0 ; Установить банк 1 MOVWF BUFER8 BCF STATUS,RP0 ; Установить банк 0 BCF FLAG3,5 BTFSC FLAG2,1 BSF FLAG3,5 ;------------------------------------------------------------------------------------ ;После того как принятие сохранилось пора умножить принятие на воздействие только ;перед умножением нужно установить флаг FLAG2,7 для деления на 100 в ПП UMNOGENIE1 ;------------------------------------------------------------------------------------ BCF PCLATH,3 ; BCF PCLATH,3 BSF FLAG2,7 CALL UMNOGENIE1 BCF FLAG2,7 BTFSS FLAG4,4 ; Если страница принятия то выходим. RETURN ; BSF FLAG,6 ; Если воздействия, то CALL COPIR ; копируем результат из принятия в воздействие, BSF PCLATH,3 ; BSF PCLATH,3 ;------------------------------------------------------------------------------------ ; Принятие восстанавливается из EEPROM памяти ;------------------------------------------------------------------------------------ BSF STATUS,RP0 ; Установить банк 1 MOVLW 0x2F MOVWF NAHALADRES MOVLW 0x35 MOVWF CONECADRES CALL UNIVERVOST ; ;------------------------------------------------------------------------------------- ; также восстанавливается запятая из BUFER8 и знак из FLAG3,5 ;------------------------------------------------------------------------------------- BCF STATUS,RP1 BSF STATUS,RP0 ; Установить банк 1 MOVF BUFER8,W BCF STATUS,RP0 ; Установить банк 0 MOVWF TOCHPRIN BCF FLAG2,1 BTFSC FLAG3,5 BSF FLAG2,1 RETURN ;************************************************************************************* ;Преобразование PRIN в BCD с сохранением в DOPPRIN ;************************************************************************************* COPIRPREOBR BCF PCLATH,3 ; BCF PCLATH,3 CALL PRIN_V_OTVET CALL BIN_BCD MOVF SCREEN1,W MOVWF DOPPRIN1 MOVF SCREEN2,W MOVWF DOPPRIN2 MOVF SCREEN3,W MOVWF DOPPRIN3 MOVF SCREEN4,W MOVWF DOPPRIN4 MOVF SCREEN5,W MOVWF DOPPRIN5 MOVF SCREEN6,W MOVWF DOPPRIN6 MOVF SCREEN7,W MOVWF DOPPRIN7 MOVF SCREEN8,W MOVWF DOPPRIN8 ;************************************************************************************* ;Преобразование VOZ в BCD с сохранением в DOPVOZ ;************************************************************************************* MOVF VOZ1,W MOVWF OTVET1 MOVF VOZ2,W MOVWF OTVET2 MOVF VOZ3,W MOVWF OTVET3 MOVF VOZ4,W MOVWF OTVET4 MOVF VOZ5,W MOVWF OTVET5 MOVF VOZ6,W MOVWF OTVET6 MOVF VOZ7,W MOVWF OTVET7 CALL BIN_BCD MOVF SCREEN1,W MOVWF DOPVOZ1 MOVF SCREEN2,W MOVWF DOPVOZ2 MOVF SCREEN3,W MOVWF DOPVOZ3 MOVF SCREEN4,W MOVWF DOPVOZ4 MOVF SCREEN5,W MOVWF DOPVOZ5 MOVF SCREEN6,W MOVWF DOPVOZ6 MOVF SCREEN7,W MOVWF DOPVOZ7 MOVF SCREEN8,W MOVWF DOPVOZ8 RETURN ;************************************************************************************* ; Удаление последней цифры введенного числа ;------------------------------------------------------------------------------------- ; ##### # # # # # # ; # # # # # # # # ; # # # # # # # ; ##### # # # # # # ; # # # ##### # # # # ; # # # # # # # # ; ##### # # # # # # # ;************************************************************************************* BACK BCF PCLATH,3 ; BCF PCLATH,3 BTFSC FLAG3,6 GOTO DINAMICA BTFSS FLAG2,0 GOTO DINAMICA BSF PCLATH,3 ; BSF PCLATH,3 BTFSC FLAG,6 GOTO NET32 ;************************************************************************************* ; Отмена последнего действия в PRIN ;************************************************************************************* BTFSS TOCHPRIN,0 GOTO NET76 BTFSS FLAG,3 GOTO NET81 NET88 BCF FLAG,3 CALL NUKA BCF PCLATH,3 ; BCF PCLATH,3 GOTO DINAMICA NET81 CALL ZDVIG_DLA_BACKSPACE GOTO NET88 NET76 CALL ZDVIG_DLA_BACKSPACE BCF STATUS,C RRF TOCHPRIN,F BCF PCLATH,3 ; BCF PCLATH,3 GOTO DINAMICA ;************************************************************************************* ; Отмена последнего действия в VOZ ;************************************************************************************* NET32 BTFSS TOCHVOZ,0 GOTO NET87 BTFSS FLAG,3 GOTO NET81 GOTO NET88 NET87 CALL ZDVIG_DLA_BACKSPACE BCF STATUS,C RRF TOCHVOZ,F BCF PCLATH,3 ; BCF PCLATH,3 GOTO DINAMICA ;===================================================================================== ZDVIG_DLA_BACKSPACE BCF PCLATH,3 ; BCF PCLATH,3 CALL ZDVIG_VPRAVO_SCREEN BSF FLAG,7 BSF PCLATH,3 ; BSF PCLATH,3 RETURN ;************************************************************************************* ; Если значение на экране ровно нулю, то убираем минус текущей страницы ;************************************************************************************* NUKA BCF PCLATH,3 ; BCF PCLATH,3 CALL NOLLISCREEN BSF PCLATH,3 ; BSF PCLATH,3 BTFSS FLAG3,5 RETURN CLRF SCREEN1 BTFSS FLAG,6 GOTO NET96 BCF FLAG2,2 RETURN NET96 BCF FLAG2,1 RETURN ;************************************************************************************* ; Нахождение частного от деления единицы на отображаемое число ;------------------------------------------------------------------------------------- ; # # ; # # # ; # # ; # # # # ; # # # # ; # # ; # # # ; # # # ;************************************************************************************* ;************************************************************************************* ; Сохранение регистров ПРИНЯТИЯ и ВОЗДЕЙСТВИЯ в EEPROM памяти ;************************************************************************************* ODINNAX BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVLW 0x20 MOVWF NAHALADRES MOVLW 0x3D MOVWF CONECADRES CALL UNIVRSOHR ; BCF STATUS,RP1 BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVF TOCHPRIN,W BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVWF BUFER8 BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVF TOCHVOZ,W BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVWF BUFER9 BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК BCF FLAG3,5 BTFSC FLAG2,1 BSF FLAG3,5 BCF FLAG3,7 BTFSC FLAG2,2 BSF FLAG3,7 ;------------------------------------------------------------------------------------ ; Копирование отображаемого числа в воздействие. Если отображаемое число уже находится ; в воздействии (FLAG,6 = 1) то копирование естественно не происходит ;------------------------------------------------------------------------------------ BCF PCLATH,3 ; BCF PCLATH,3 BTFSS FLAG,6 CALL COPIR ;------------------------------------------------------------------------------------ ; Копировать в PRIN число 1 ;------------------------------------------------------------------------------------ CALL OFF_PRIN BSF PCLATH,3 ; BSF PCLATH,3 MOVLW .1 MOVWF PRIN1 MOVWF TOCHPRIN BCF FLAG2,1 BSF FLAG4,4 BTFSS FLAG,6 BCF FLAG4,4 BCF FLAG,6 ;------------------------------------------------------------------------------------ ; Деление VOZ на PRIN ;------------------------------------------------------------------------------------ BCF PCLATH,3 ; BCF PCLATH,3 CALL DELENIE1 BSF FLAG,6 BTFSS FLAG4,4 BCF FLAG,6 BSF PCLATH,3 ; BSF PCLATH,3 ;------------------------------------------------------------------------------------ ; Сохранить результат деления ;------------------------------------------------------------------------------------ MOVF SCREEN8,W MOVWF BUFVOZ8 MOVF SCREEN7,W MOVWF BUFVOZ7 MOVF SCREEN6,W MOVWF BUFVOZ6 MOVF SCREEN5,W MOVWF BUFVOZ5 MOVF SCREEN4,W MOVWF BUFVOZ4 MOVF SCREEN3,W MOVWF BUFVOZ3 MOVF SCREEN2,W MOVWF BUFVOZ2 MOVF SCREEN1,W MOVWF BUFVOZ1 MOVF TOCHPRIN,W BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVWF BUFER10 BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК BCF FLAG3,1 BTFSC FLAG2,1 BSF FLAG3,1 ;------------------------------------------------------------------------------------ ; Восстановление регистров ПРИНЯТИЯ и ВОЗДЕЙСТВИЯ из EEPROM памяти ;------------------------------------------------------------------------------------ BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVLW 0x20 MOVWF NAHALADRES MOVLW 0x3D MOVWF CONECADRES CALL UNIVERVOST ; BCF STATUS,RP1 BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVF BUFER8,W BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVWF TOCHPRIN BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVF BUFER9,W BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVWF TOCHVOZ BCF FLAG2,1 BTFSC FLAG3,5 BSF FLAG2,1 BCF FLAG2,2 BTFSC FLAG3,7 BSF FLAG2,2 ;------------------------------------------------------------------------------------ ; Нажатие кнопки CIFRA ;------------------------------------------------------------------------------------ BCF FLAG,4 BSF FLAG3,2 CLRF BUFER1 BCF PCLATH,3 ; BCF PCLATH,3 CALL CIFMEM BSF PCLATH,3 ; BSF PCLATH,3 BCF FLAG3,2 ;************************************************************************************* ; Копировать сохраненный результат деления в SCREEN ;************************************************************************************* MOVF BUFVOZ8,W MOVWF SCREEN8 MOVF BUFVOZ7,W MOVWF SCREEN7 MOVF BUFVOZ6,W MOVWF SCREEN6 MOVF BUFVOZ5,W MOVWF SCREEN5 MOVF BUFVOZ4,W MOVWF SCREEN4 MOVF BUFVOZ3,W MOVWF SCREEN3 MOVF BUFVOZ2,W MOVWF SCREEN2 MOVF BUFVOZ1,W MOVWF SCREEN1 BSF FLAG3,6 ; Разрешаем блокировку "CE" и Backspace BSF FLAG3,4 ; Разрешаем гасить отображаемое значение в ПП GASIM_POCAZ ; после нажатия на "цифру" или на "запятую" BCF FLAG,3 ; Выключаем запятую ;------------------------------------------------------------------------------------ ; Восстановление запятой и знака результата деления в принятие или воздействие (зависит от FLAG,6) ;------------------------------------------------------------------------------------ BTFSS FLAG,6 GOTO NET100 BCF FLAG2,2 BTFSC FLAG3,1 BSF FLAG2,2 BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVF BUFER10,W BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVWF TOCHVOZ GOTO $+8 NET100 BCF FLAG2,1 BTFSC FLAG3,1 BSF FLAG2,1 BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVF BUFER10,W BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVWF TOCHPRIN BCF PCLATH,3 ; BCF PCLATH,3 GOTO DINAMICA ;************************************************************************************* ; Вычисление квадратного корня ;------------------------------------------------------------------------------------- ; # # # # # # # # # # # # # # ; # ; # ; # # # # # # # ; # # # # ; # # # ; # # # # ; # # # ;************************************************************************************* COREN BTFSC FLAG2,5 CLRF COD_OPER1 BCF FLAG,3 ; Выключим запятую CALL NUKA ; Если значение на экране ровно нулю, то убираем минус текущей страницы CALL CORRECTIC ; 25,000 -> 25, BCF PCLATH,3 ; BCF PCLATH,3 BTFSC FLAG3,5 ; Если значение на экране ровно нулю то выходим GOTO DINAMICA BSF PCLATH,3 ; BSF PCLATH,3 BTFSC FLAG,2 ; Проверить, был ли переход на страницу воздействия BSF FLAG,6 ; Теперь будем сдвигать, и отображать запятую воздействия ; ; Если значение на экране отрицательное, то устанавливаем ошибку и выходим BTFSC FLAG,6 GOTO NET123 BTFSC FLAG2,1 GOTO NET125 GOTO NET124 NET123 BTFSS FLAG2,2 GOTO NET124 NET125 BCF PCLATH,3 ; BCF PCLATH,3 BCF FLAG,6 BSF FLAG2,4 BCF FLAG2,1 CALL OFF_ICRAN CLRF SCHETZAP GOTO DINAMICA NET124 BSF FLAG2,0 BSF FLAG3,6 ; Флаг для блокировки "CE" и Backspace MOVLW B'11001100' ANDWF FLAG4,F BSF FLAG3,4 ; Разрешить гасить отображаемое значение после нажатия на "цифру" или на "запятую" MOVLW .1 ; MOVWF CONSTTOCH ; Загрузка стартового значения константы MOVLW .27 MOVWF CONSTCIFR CALL ANALIZ ; Анализатор + ШИФРАТОР Если число меньше одного (шифрация производилась) то устанавливается FLAG4,3 BTFSS FLAG,6 GOTO NET105 BSF FLAG4,4 ; Запоминаем страницу ;------------------------------------------------------------------------------------ ; Сохранение введенного числа ;------------------------------------------------------------------------------------ BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVLW 0x2F MOVWF NAHALADRES MOVLW 0x35 MOVWF CONECADRES CALL UNIVRSOHR ; Сохранить принятиеие BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVF TOCHPRIN,W BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVWF BUFER8 BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК BCF FLAG3,7 BTFSC FLAG2,1 BSF FLAG3,7 BCF FLAG2,1 ; Сохранение VOZ MOVF VOZ1,W MOVWF DROB4 MOVF VOZ2,W MOVWF DROB5 MOVF VOZ3,W MOVWF DROB6 MOVF VOZ4,W MOVWF DROB7 MOVF TOCHVOZ,W BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVWF BUFER11 BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК GOTO NET129 NET105 BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVLW 0x20 MOVWF NAHALADRES MOVLW 0x26 MOVWF CONECADRES CALL UNIVRSOHR ; Сохранить воздействие BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVF TOCHVOZ,W BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVWF BUFER9 BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК BCF FLAG3,7 BTFSC FLAG2,2 BSF FLAG3,7 BCF FLAG2,2 ; Сохранение PRIN MOVF PRIN1,W MOVWF DROB4 MOVF PRIN2,W MOVWF DROB5 MOVF PRIN3,W MOVWF DROB6 MOVF PRIN4,W MOVWF DROB7 MOVF TOCHPRIN,W BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVWF BUFER11 BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК NET129 BCF FLAG,6 ; Вычислять корень будем на странице PRIN ;------------------------------------------------------------------------------------ ; Загрузка в VOZ и PRIN значение константы ;------------------------------------------------------------------------------------ CALL ZAKLADKA CLRF SCHETZAP ;------------------------------------------------------------------------------------ ; Сохранение регистров PRIN ;------------------------------------------------------------------------------------ NET106 MOVF PRIN1,W BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVWF BUFER12 BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVF PRIN2,W BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVWF BUFER13 BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVF PRIN3,W BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVWF BUFER14 BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVF PRIN4,W BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVWF BUFER15 BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVF TOCHPRIN,W BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVWF BUFER16 BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVLW .1 SUBWF CONSTCIFR,W BTFSS STATUS,Z GOTO NET98 MOVF SCREEN8,W BTFSS STATUS,Z BSF FLAG4,0 ; Если индикатор заполнен полностью то устанавливаем FLAG4,0 ;------------------------------------------------------------------------------------ ; Умножить PRIN на VOZ = PRIN ;------------------------------------------------------------------------------------ NET98 BCF PCLATH,3 ; BCF PCLATH,3 CALL UMNOGENIE CALL NET53 BSF PCLATH,3 ; BSF PCLATH,3 MOVLW .1 SUBWF CONSTCIFR,W BTFSS STATUS,Z BCF FLAG4,1 BTFSC FLAG2,4 GOTO PRAVO ; 2-Й Случай (PRIN>A). Вычитаем текущую константу из PRIN (в ПП PRAVO) и выходим ;------------------------------------------------------------------------------------ ; Сравнить PRIN и введенное число ;------------------------------------------------------------------------------------ MOVF DROB7,W MOVWF VOZ4 MOVF DROB6,W MOVWF VOZ3 MOVF DROB5,W MOVWF VOZ2 MOVF DROB4,W MOVWF VOZ1 CLRF VOZ5 CLRF VOZ6 CLRF VOZ7 BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVF BUFER11,W BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVWF TOCHVOZ ; Вычитание введенного числа из PRIN. BCF PCLATH,3 ; BCF PCLATH,3 CALL MINUS1 BSF PCLATH,3 ; BSF PCLATH,3 BTFSC FLAG2,1 GOTO LEVO ; 1-Й Случай (PRINA). Результат вычитания положительный и больше нуля INCF FSR,F DECFSZ BUFER1,F GOTO $-5 GOTO RAVNO ; 3-Й Случай (PRIN=A). Результат равен нулю ;************************************************************************************* ; 1-Й Случай: PRIN < Введенного числа ;************************************************************************************* LEVO BCF FLAG2,1 ; Убрать минус PRIN CALL VOST_CONST ; Восстановить то подобранное число, которое было до умножения ; Прибавление к PRIN текущей константы NET107 BCF PCLATH,3 ; BCF PCLATH,3 CALL OFF_VOZ MOVF CONSTCIFR,W MOVWF VOZ1 MOVF CONSTTOCH,W MOVWF TOCHVOZ CALL PRIBAVTE ; Копирование PRIN в VOZ . CALL COPIR BSF PCLATH,3 ; BSF PCLATH,3 GOTO NET106 ;************************************************************************************* ; 2-Й Случай: PRIN > Введенного числа ;************************************************************************************* PRAVO BCF FLAG2,4 MOVLW .1 SUBWF CONSTCIFR,W BTFSS STATUS,Z GOTO NET99 ; Если перед умножением индикатор был полностью заполнен, то выходим в ПП RAVNO BTFSC FLAG4,0 ; GOTO RAVNO NET99 CALL VOST_CONST ; Восстановить то подобранное число, которое было до умножения ; Вычесть из PRIN текущую константу BCF PCLATH,3 ; BCF PCLATH,3 CALL OFF_VOZ BSF PCLATH,3 ; BSF PCLATH,3 MOVF CONSTCIFR,W MOVWF VOZ1 MOVF CONSTTOCH,W MOVWF TOCHVOZ BCF PCLATH,3 ; BCF PCLATH,3 CALL MINUS1 BSF PCLATH,3 ; BSF PCLATH,3 ;************************ ; Коррекция константы. ;************************ MOVLW .1 SUBWF CONSTCIFR,W BTFSC STATUS,Z GOTO NET101 DECF CONSTCIFR,F GOTO NET107 ; Переход в ПП LEVO для прибавления к подобранному числу обновленной константы NET101 BCF STATUS,C RLF CONSTTOCH,F GOTO NET107 ; Переход в ПП LEVO для прибавления к подобранному числу обновленной константы ;************************************************************************************* ; 3-Й Случай: PRIN = Введенному числу. Или PRIN > Введенного числа, но индикатор заполнен ;************************************************************************************* ;************************************************************************************* ;************************************************************************************* ;************************************************************************************* ;************************************************************************************* ;************************************************************************************* RAVNO CALL VOST_CONST ; Восстановить то подобранное число, которое было до умножения BCF PCLATH,3 ; BCF PCLATH,3 CALL OFF_VOZ MOVLW .1 MOVWF TOCHVOZ ; CALL PRIBAVTE ; Прибавляем к восстановленному PRIN ноль, чтобы вывести PRIN на экран BSF PCLATH,3 ; BSF PCLATH,3 BTFSS FLAG4,1 ; Если при умножении был перебор, то подобранное число нужно уменьшить GOTO NET118 MOVLW .8 MOVWF BUFER1 MOVLW SCREEN8 MOVWF FSR NET92 MOVLW .1 SUBWF INDF,W BTFSC STATUS,Z ; Проверяем на 1 GOTO $+4 ; Да MOVF INDF,W ; Нет BTFSS STATUS,Z ; Проверяем на 0 GOTO NET110 DECF FSR,F ; Да DECFSZ BUFER1,F GOTO NET92 MOVF SCREEN8,W ADDWF BUFER1,F MOVF SCREEN7,W ADDWF BUFER1,F MOVF SCREEN6,W ADDWF BUFER1,F MOVF SCREEN5,W ADDWF BUFER1,F MOVF SCREEN4,W ADDWF BUFER1,F MOVF SCREEN3,W ADDWF BUFER1,F MOVF SCREEN2,W ADDWF BUFER1,F MOVF SCREEN1,W ADDWF BUFER1,F MOVLW .1 SUBWF BUFER1,W BTFSC STATUS,Z BSF FLAG4,5 ;------------------------------------------------------------------------------------ ; Уменьшение подобранного числа ;------------------------------------------------------------------------------------ NET110 MOVF SCREEN8,W BTFSS STATUS,Z GOTO NET109 BTFSC TOCHPRIN,7 GOTO NET109 BCF PCLATH,3 ; BCF PCLATH,3 CALL ZDVIG_VLEVO_SCREEN CLRF SCREEN1 BSF PCLATH,3 ; BSF PCLATH,3 BCF STATUS,C RLF TOCHPRIN,F GOTO NET110 NET109 BCF PCLATH,3 ; BCF PCLATH,3 CALL COPIR1 MOVF TOCHPRIN,W MOVWF TOCHVOZ MOVLW .1 MOVWF VOZ1 CALL MINUS1 BSF PCLATH,3 ; BSF PCLATH,3 BTFSS FLAG4,5 ; GOTO NET118 ;------------------------------------------------------------------------------------ ; Еще одна коррекция подобранного числа ;------------------------------------------------------------------------------------ NET111 BTFSC TOCHPRIN,7 GOTO NET118 MOVF SCREEN8,W BTFSS STATUS,Z GOTO NET118 BCF PCLATH,3 ; BCF PCLATH,3 CALL ZDVIG_VLEVO_SCREEN BSF PCLATH,3 ; BSF PCLATH,3 BCF STATUS,C RLF TOCHPRIN,F GOTO NET111 ;************************************************************************************* ; ДЕШИФРАТОР (1000-> 0.001) ;************************************************************************************* NET118 BTFSS FLAG4,3 GOTO NET121 BTFSS TOCHPRIN,7 GOTO NET120 NET119 BCF PCLATH,3 ; BCF PCLATH,3 CALL ZDVIG_VPRAVO_SCREEN BSF PCLATH,3 ; BSF PCLATH,3 DECFSZ DLJACOREN,F GOTO NET119 GOTO NET121 NET120 BCF STATUS,C RLF TOCHPRIN,F DECFSZ DLJACOREN,F GOTO NET118 ; Коррекция - копирование - восстановление NET121 CALL CORRECTIC BTFSS FLAG4,4 GOTO NET122 BSF FLAG,6 BCF PCLATH,3 ; BCF PCLATH,3 CALL COPIR BSF PCLATH,3 ; BSF PCLATH,3 BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVF BUFER8,W BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVWF TOCHPRIN BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVLW 0x2F MOVWF NAHALADRES MOVLW 0x35 MOVWF CONECADRES CALL UNIVERVOST ; Восстановить принятие BCF STATUS,RP0 ; Выбрать банк 0 BCF FLAG2,1 BTFSC FLAG3,7 BSF FLAG2,1 BCF PCLATH,3 ; BCF PCLATH,3 GOTO DINAMICA NET122 BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVF BUFER9,W BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVWF TOCHVOZ BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVLW 0x20 MOVWF NAHALADRES MOVLW 0x26 MOVWF CONECADRES CALL UNIVERVOST ; Восстановить воздействие BCF STATUS,RP0 ; Выбрать банк 0 BCF FLAG2,2 BTFSC FLAG3,7 BSF FLAG2,2 BCF PCLATH,3 ; BCF PCLATH,3 GOTO DINAMICA ;************************************************************************************* ; Анализатор + ШИФРАТОР ;************************************************************************************* ANALIZ BCF FLAG4,3 CLRF BUFER1 ; Замена в SCREEN десяток на нули BCF PCLATH,3 ; BCF PCLATH,3 CALL ZAMSCR10_0 BSF PCLATH,3 ; BSF PCLATH,3 BTFSS FLAG,6 GOTO NET112 MOVF TOCHVOZ,W MOVWF SCHETZAP GOTO NET113 NET112 MOVF TOCHPRIN,W MOVWF SCHETZAP ; Проверить, число на экране больше или меньше одного NET113 MOVF SCREEN8,W BTFSS STATUS,Z RETURN ; Больше, значит выходим BTFSC SCHETZAP,7 GOTO NET114 BCF PCLATH,3 ; BCF PCLATH,3 CALL ZDVIG_VLEVO_SCREEN ; Сдвиг регистров экранной памяти влево BCF STATUS,C RLF SCHETZAP,F CLRF SCREEN1 BSF PCLATH,3 ; BSF PCLATH,3 GOTO NET113 ;------------------------------------------------------------------------------------ ; ШИФРАТОР Превращение отрицательного числа в положительное (0.001 -> 1000) ;------------------------------------------------------------------------------------ NET114 BSF FLAG4,3 ; Указывает что число меньше единицы BCF PCLATH,3 ; BCF PCLATH,3 CALL ZDVIG_VLEVO_SCREEN CLRF SCREEN1 INCF BUFER1,F BSF PCLATH,3 ; BSF PCLATH,3 MOVF SCREEN8,W BTFSC STATUS,Z GOTO NET114 MOVF BUFER1,W MOVWF DLJACOREN NET115 BCF STATUS,C RRF SCHETZAP,F DECFSZ BUFER1,F GOTO NET115 BTFSS FLAG,6 GOTO NET116 MOVF SCHETZAP,W MOVWF TOCHVOZ GOTO NET117 NET116 MOVF SCHETZAP,W MOVWF TOCHPRIN GOTO NET117 ;------------------------------------------------------------------------------------ ; Восстановление регистров PRIN ;------------------------------------------------------------------------------------ VOST_CONST BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVF BUFER12,W BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVWF PRIN1 BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVF BUFER13,W BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVWF PRIN2 BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVF BUFER14,W BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVWF PRIN3 BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVF BUFER15,W BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVWF PRIN4 BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVF BUFER16,W BCF STATUS,RP0 ; ПЕРЕХОД В 0-Й БАНК MOVWF TOCHPRIN RETURN ;************************************************************************************* ; Универсальное сохраняющее устройство ;************************************************************************************* ;************************************************************************************* ; Сохранение регистров в EEPROM памяти ;************************************************************************************* UNIVRSOHR BCF STATUS,RP1 BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVF NAHALADRES,W MOVWF FSR NET126 BSF STATUS,RP1 BCF STATUS,RP0 ; Выбрать банк 2 MOVF FSR,W MOVWF EEADR MOVF INDF,W MOVWF EEDATA BSF STATUS,RP0 ; Выбрать банк 3 BCF EECON1,EEPGD; Выбрать EEPROM память данных BSF EECON1,WREN ; Разрешить запись в EEPROM память данных BCF INTCON,GIE ; Запретить прерывания MOVLW 0x55 MOVWF EECON2 MOVLW 0xAA MOVWF EECON2 BSF EECON1,WR ; Инициализировать запись BCF EECON1,WREN ; Запретить запись в EEPROM память данных NET128 BTFSC EECON1,WR ; Ожидаем завершения записи в EEPROM GOTO NET128 BCF STATUS,RP1 BSF STATUS,RP0 ; Выбрать банк 1 MOVF CONECADRES,W SUBWF FSR,W BTFSC STATUS,Z RETURN INCF FSR,F GOTO NET126 ;------------------------------------------------------------------------------------ ; Восстановление регистров из EEPROM памяти ;------------------------------------------------------------------------------------ UNIVERVOST BSF STATUS,RP0 ; ПЕРЕХОД В 1-Й БАНК MOVF NAHALADRES,W MOVWF FSR NET130 BSF STATUS,RP1 BCF STATUS,RP0 ; Выбрать банк 2 MOVF FSR,W MOVWF EEADR BSF STATUS,RP0 ; Выбрать банк 3 BCF EECON1,EEPGD; Выбрать EEPROM память данных BSF EECON1,RD ; Инициализировать чтение BCF STATUS,RP0 ; Выбрать банк 2 MOVF EEDATA,W MOVWF INDF BCF STATUS,RP1 BSF STATUS,RP0 ; Выбрать банк 1 MOVF CONECADRES,W SUBWF FSR,W BTFSC STATUS,Z RETURN INCF FSR,F GOTO NET130 ;************************************************************************************* ; Закладка предварительных констант (используется для повышения скорости вычисления корня) ;************************************************************************************* ZAKLADKA BTFSC SCHETZAP,0 GOTO NET66 BCF PCLATH,3 ; BCF PCLATH,3 CALL ZDVIG_VPRAVO_SCREEN BCF STATUS,C RRF SCHETZAP,F BSF PCLATH,3 ; BSF PCLATH,3 GOTO ZAKLADKA NET66 BCF PCLATH,3 ; BCF PCLATH,3 CALL OFF_PRIN CALL OFF_VOZ MOVLW .1 MOVWF TOCHPRIN MOVWF TOCHVOZ BSF PCLATH,3 ; BSF PCLATH,3 MOVF SCREEN8,W BTFSS STATUS,Z GOTO NET67 MOVF SCREEN7,W BTFSS STATUS,Z GOTO NET90 MOVF SCREEN6,W BTFSS STATUS,Z GOTO NET91 MOVF CONSTCIFR,W MOVWF PRIN1 MOVWF VOZ1 RETURN NET67 MOVF SCREEN8,W MOVWF VOZ1 MOVLW .30 MOVWF PRIN1 MOVLW .4 MOVWF PRIN2 GOTO NET65 NET90 MOVF SCREEN7,W MOVWF VOZ1 MOVLW .77 MOVWF PRIN1 MOVLW .1 MOVWF PRIN2 GOTO NET65 NET91 MOVF SCREEN6,W MOVWF VOZ1 MOVLW .105 MOVWF PRIN1 NET65 BCF PCLATH,3 ; BCF PCLATH,3 CALL UMNOGENIE CALL NET53 CALL COPIR BSF PCLATH,3 ; BSF PCLATH,3 RETURN END