; базовый код отладочной пpогpаммы ; ; 20 регистров CHAN содержат N и Velocity нажатых клавиш ; LIST p=16F84A __config 03FF1h ;слово конфигурации PIC16F84 ; ; Секция заголовка ; ; описание опеpационных pегистpов TMR0 EQU 01h PC EQU 02h STATUS EQU 03h FSR EQU 04h INDF EQU 00h OPTN EQU 01h ;не забудь бит RP! INTCON EQU 0Bh EEDATA EQU 08h ; pегистpы ввода/вывода PORTA EQU 05h PORTB EQU 06h ; ячейки ОЗУ CHAN EQU 0Ch ;всего 20 ячеек CHAN1 EQU 0Dh ;chan+1 MIDCH EQU 20h CNT EQU 21h CNT1 EQU 22h CNT2 EQU 23h OUTBUF EQU 24h KEY EQU 25h KEY1 EQU 26h CIKL EQU 27h LASTPITCH EQU 28h SDVIG EQU 29h FLAGS EQU 2Ah BUF1 EQU 2Bh BUF2 EQU 2Ch BUF3 EQU 2Dh BUF4 EQU 2Eh BUF5 EQU 2Fh PITCH EQU 30h ; биты pегистpа STATUS C EQU 0h DC EQU 1h Z EQU 2h PD EQU 3h TO EQU 4h RP EQU 5h ; биты pегистpа INTCON RTIF EQU 2h RTIE EQU 5h GIE EQU 7h ; биты порта A T0 EQU 0h T1 EQU 1h PA2 EQU 2h PA3 EQU 3h T2 EQU 4h ; биты pегистpа FLAGS PEDAL EQU 0h AUTO EQU 1h TVOICE EQU 2h WEEL2 EQU 3h WEEL1 EQU 4h ; упpавляющие pегистpы TRISA EQU 05h ;не забудь бит RP! TRISB EQU 06h ; слова инициализации для поpтов ввода/вывода INITA EQU B'00010011' INITB EQU 00h ; чувствительность динамики DYN EQU D'120';max 253 ; адреса внешних устройств PORTA KBD EQU 04h BTN EQU 00h ; ; Рабочая секция ; ; ORG 0 GOTO INIT ; ; ОБРАБОТКА ПРЕРЫВАНИЯ ; ORG 04h INTERR BCF INTCON,GIE ;запрет прерываний MOVWF BUF1 ;сохранение W и FSR MOVF FSR,W MOVWF BUF2 MOVF STATUS,W ;сохранение STATUS MOVWF BUF5 MOVLW DYN ;загрузка таймера MOVWF TMR0 ; ; ВЫЧИСЛЕНИЕ ЗНАЧЕНИЙ VELOCITY ; OBRVEL MOVLW CHAN1 MOVWF FSR MOVLW 0Ah MOVWF BUF3 OV01 BTFSS INDF,7 ;проверка ячейки CHAN на "переданность" CALL VEL ;если не передано-вызов обработчика INCF FSR,F ;переход к след.ячейке CHAN INCF FSR,F DECFSZ BUF3,F GOTO OV01 ; BTFSC FLAGS,WEEL2 ;проверка режима 2 GOTO FLSH BTFSC FLAGS,WEEL1 ;проверка режима 1 GOTO FLSH MOVLW B'00001000' XORWF PORTA,F FLSH MOVF BUF5,W ;восстановление STATUS MOVWF STATUS MOVF BUF2,W ;восстановление W и FSR MOVWF FSR MOVF BUF1,W BCF INTCON,RTIF ;сброс флага прерываний RETFIE ;разрешение прерываний ; ; ОБРАБОТЧИК VELOCITY ; VEL MOVF INDF,W MOVWF BUF4 ; SWAPF BUF4,F ;это деление на 16 MOVLW 07h ; ANDWF BUF4,F ; MOVF BUF4,W BTFSS STATUS,Z DECF BUF4,W ;растягивание времени SUBWF INDF,F ;уменьшение VELOCITY на 1/16 RETURN ; ; ; ИНИЦИАЛИЗАЦИЯ ; ; INIT BSF STATUS,RP ;настройка портов MOVLW INITA MOVWF TRISA MOVLW INITB MOVWF TRISB MOVLW B'11010011' ;таймер с предделителем 1:16 MOVWF OPTN ;настройка таймера BCF STATUS,RP MOVLW 80h ;стоп бит MOVWF PORTB CLRF PORTA CALL DEL CALL DEL CALL DEL BSF INTCON,RTIE ;разрешение прерываний RTCC CLRF MIDCH ;MIDI канал 0 CLRF FLAGS ;сброс признаков BSF FLAGS,WEEL2 ;режим WEEL 2 полутона MOVLW 24h ;тональность MOVWF SDVIG CALL INFIND ;очистка CHAN: MOVLW 80h ;признак свободной ячейки IN1 MOVWF INDF ; INCF FSR,F ; MOVWF INDF ; INCF FSR,F ; DECFSZ CNT2,F ; GOTO IN1 MOVLW 20h MOVWF LASTPITCH ;PITCH WEEL=0 CALL INTERR ;загрузка таймера ; ; НАСТРОЙКА МЕХАНИКИ ; BCF PORTA,PA2 ;адрес кнопок MOVLW 90h ;адрес кнопки WEELMODE MOVWF PORTB NOP ;задержка 1uS BTFSS PORTA,T1 GOTO NASTR ; ; ОСНОВНОЙ ОПРОС ; M0 MOVLW 30h ;период опроса кнопок и педали MOVWF CIKL MAIN MOVLW 80h ;адрес начальной клавиши+стоп бит MOVWF PORTB BSF PORTA,PA2 ;адрес клавиатуры MOVLW D'48' ;кол-во клавиш- длина опроса !!! MOVWF KEY1 TR01 BTFSC PORTA,T0 CALL OBR ;если нажато-вызов обработчика INCF PORTB,F ;переход к след.клавише DECFSZ KEY1,F GOTO TR01 ; ; ПРОВЕРКА КЛАВИШ НА ВСЕ ЕЩЕ НАЖАТОСТЬ ; CALL INFIND TR02 BTFSS INDF,7 ;проверка ячейки CHAN на занятость CALL CHECK ;если занято-проверка нажатости INCF FSR,F ;переход к след.ячейке INCF FSR,F DECFSZ CNT2,F GOTO TR02 ; ; ; ПРОВЕРКА ПОЛОЖЕНИЯ PITCH WEEL ; ; MOVLW 07h ;каждый 8 цикл ANDWF CIKL,W ; BTFSC STATUS,Z ; CALL PITCHB ; ; ; ; ПРОВЕРКА ПЕДАЛИ SUSTAIN ; ; DECFSZ CIKL,F GOTO MAIN ;возврат CALL SUST ;опрос педали ; ; ОПРОС КНОПОК ; BUTT BCF PORTA,PA2 ;адрес кнопок MOVLW 90h ;адрес кнопки WEELMODE MOVWF PORTB NOP ;задержка 1uS BTFSS PORTA,T1 GOTO WEELMOD BCF FLAGS,TVOICE;выкл.признака нажатия GOTO M0 ;возврат с перезагрузкой CIKL ; ; ОБРАБОТКА ПЕДАЛИ ; для педали с размыканием ; поменять местами строки on и off ; SUST BCF PORTA,PA2 ;адрес кнопок и педали MOVLW 80h ;адрес педали MOVWF PORTB BTFSS PORTA,T1 GOTO PEDSET ;педаль нажата BTFSC FLAGS,PEDAL ;проверка флага RETURN ;выход BSF FLAGS,PEDAL ;установка флага и передача PEDOFF MOVLW 0B0 ;controller ADDWF MIDCH,W CALL OUT MOVLW 40h ;sustein CALL OUT CLRW ;off CALL OUT RETURN ;выход PEDSET BTFSS FLAGS,PEDAL ;проверка флага RETURN ;выход BCF FLAGS,PEDAL ;сброс флага и передача MOVLW 0B0 ;controller ADDWF MIDCH,W CALL OUT MOVLW 40h ;sustein CALL OUT MOVLW 7F ;on CALL OUT RETURN ; ; ОБРАБОТЧИКИ КНОПОК ; ; ; ОБРАБОТКА КНОПКИ WEELMODE ; ; WEELMOD BTFSC FLAGS,TVOICE;проверка флага первичного нажатия GOTO M0 ;если уже нажато BSF FLAGS,TVOICE;установка флага BTFSC FLAGS,WEEL2 ;проверка режима 2 GOTO W1 BTFSC FLAGS,WEEL1 ;проверка режима 1 GOTO MOD BSF FLAGS,WEEL2 ;установка флага режима 2 BCF PORTA,PA3 ;включение светодиода GOTO M0 ;возврат с перезагрузкой CIKL W1 BSF FLAGS,WEEL1 ;установка флага режима 1 BCF FLAGS,WEEL2 ;выключение флага режима 2 BSF PORTA,PA3 ;включение светодиода GOTO M0 MOD BCF FLAGS,WEEL1 ;выключение флага режима 1 GOTO M0 ; ; ОБРАБОТКА PITCH WEEL ; PITCHB CALL ACP ;оцифровка положения колеса MOVF PITCH,W ; ; НУЛЕВАЯ ЗОНА ; SUBLW 1Dh ;проверка на <1Dh BTFSC STATUS,C GOTO PTCHS MOVF PITCH,W SUBLW 21h ;проверка на >21h BTFSS STATUS,C GOTO PTCHS MOVLW 20h ;центральное положение колеса MOVWF PITCH ; PTCHS MOVF PITCH,W XORWF LASTPITCH,W ;сравнение с предыдущим BTFSC STATUS,Z RETURN ;если PITCH не менялся MOVF PITCH,W MOVWF LASTPITCH ;запоминание нового значения BTFSC FLAGS,WEEL2 ;проверка режима 2 полутона GOTO PTCH2 BTFSC FLAGS,WEEL1 ;проверка режима 1 полутон GOTO PTCH1 ; ; ПЕРЕДАЧА CONTROL CHANGE 1 MODULATION ; VIBR MOVLW 20h SUBWF PITCH,F ;проверка на >1Fh BTFSS STATUS,C RETURN ;возврат если колесо в "-" RLF PITCH,F ;умножение на 2 RLF PITCH,F ;умножение на 2 MOVLW 7Ch ANDWF PITCH,F ;гашение неиспользуемых бит BTFSC PITCH,6 BSF PITCH,1 ;расширение диапазона MOVLW 0B0h ;MIDI команда CONTROL CHANGE ADDWF MIDCH,W ;добавление MIDI канала CALL OUT ;вывод по MIDI MOVLW 01h ;control=1 -модулятор CALL OUT ;вывод по MIDI MOVF PITCH,W CALL OUT ;вывод по MIDI RETURN ; ; ПЕРЕДАЧА PITCH WEEL 1 ПОЛУТОН ; PTCH1 MOVLW 0E0h ;MIDI команда PITCH WEEL ADDWF MIDCH,W ;добавление MIDI канала CALL OUT ;вывод по MIDI CLRW ;младший байт =0 CALL OUT ;вывод по MIDI MOVLW 20h ADDWF PITCH,W CALL OUT ;вывод по MIDI RETURN ; ; ПЕРЕДАЧА PITCH WEEL 2 ПОЛУТОНА ; PTCH2 MOVLW 0E0h ;MIDI команда PITCH WEEL ADDWF MIDCH,W ;добавление MIDI канала CALL OUT ;вывод по MIDI CLRW ;младший байт =0 CALL OUT ;вывод по MIDI RLF PITCH,W ;умножение на 2 ANDLW 7Eh ;гашение неиспользуемых бит BTFSC PITCH,4 IORLW 01h ;расширение диапазона(младший бит) CALL OUT ;вывод по MIDI RETURN ; ; ПРОГРАММА А Ц П ; ACP BCF INTCON,GIE ;запрет прерываний MOVLW B'10100000' ;начальное слово+стоп-бит MOVWF PORTB NOP ;задержка 1uS NOP ;задержка 1uS BTFSC PORTA,T2 ;проверка компаратора BCF PORTB,05 BSF PORTB,04 ;переход к следующему разряду NOP ;задержка 1uS BTFSC PORTA,T2 ;проверка компаратора BCF PORTB,04 BSF PORTB,03 ;переход к следующему разряду NOP ;задержка 1uS BTFSC PORTA,T2 ;проверка компаратора BCF PORTB,03 BSF PORTB,02 ;переход к следующему разряду NOP ;задержка 1uS BTFSC PORTA,T2 ;проверка компаратора BCF PORTB,02 BSF PORTB,01 ;переход к следующему разряду NOP ;задержка 1uS BTFSC PORTA,T2 ;проверка компаратора BCF PORTB,01 BSF PORTB,00 ;переход к следующему разряду NOP ;задержка 1uS BTFSC PORTA,T2 ;проверка компаратора BCF PORTB,00 MOVF PORTB,W ;6 младших бит PORTB-выходные данные ANDLW 3Fh ;гашение неиспользуемых бит MOVWF PITCH ;сохранение RETFIE ; ; НАСТРОЙКА МЕХАНИКИ PITCH WEEL ; NASTR CALL ACP ;оцифровка положения колеса MOVF PITCH,W ; ; НУЛЕВАЯ ЗОНА ; SUBLW 1Dh ;проверка на <1Dh BTFSC STATUS,C GOTO LEDB MOVF PITCH,W SUBLW 21h ;проверка на >21h BTFSS STATUS,C GOTO LEDB BCF PORTA,PA3 ;центральное положение колеса зажечь LED CALL DEL GOTO NASTR LEDB BSF PORTA,PA3 ;погасить LED CALL DEL GOTO NASTR ; ; ОБРАБОТКА НАЖАТОЙ КЛАВИШИ ; OBR MOVF PORTB,W ;номер клавиши MOVWF KEY BCF KEY,7 ;выкл.стоп-bit CALL INFIND TR05 MOVF INDF,W BTFSC INDF,7 ;проверка ячейки CHAN на занятость GOTO TO03 ;если свободна XORWF KEY,W ;сравнение BTFSC STATUS,Z GOTO PRESS ;переход к обработчику дожатия если совпало TO03 INCF FSR,F ;переход к след.ячейке CHAN INCF FSR,F DECFSZ CNT2,F GOTO TR05 CALL INFIND ;если клавиша не записана в CHAN TR06 BTFSC INDF,7 ;поиск свободной ячейки GOTO TO04 INCF FSR,F ;переход к след.ячейке CHAN INCF FSR,F DECFSZ CNT2,F GOTO TR06 RETURN ; TO04 MOVF KEY,W ;запись клавиши в CHAN MOVWF INDF INCF FSR,F MOVLW 7Fh ;запись начального значения VELOCITY MOVWF INDF DECF FSR,F RETURN ; ; ОБРАБОТКА КОНТАКТОВ PRESS ; PRESS INCF FSR,F BTFSC INDF,7 ;проверка на "переданность" GOTO OUTN ;если передано возврат с декрементом FSR BTFSC PORTA,T1 ;проверка на дожатость RETURN ;возврат если не дожато BSF INDF,7 ;установка признака "переданность" DECF FSR,F CALL OUTNON ;передача NOTE ON по MIDI RETURN ; ; ПРОВЕРКА ОТПУЩЕННОСТИ КЛАВИШ ; CHECK MOVF INDF,W IORLW B'10000000' ;стоп бит MOVWF PORTB NOP ;задержка 1uS BTFSC PORTA,T0 ;проверка RETURN ;возврат если не отпущено BSF INDF,7 ;установка признака свободной ячейки INCF FSR,F BTFSS INDF,7 ;проверка признака "переданность" GOTO OUTN ;возврат с декрементом FSR DECF FSR,F CALL OUTNOF ;передача NOTE OFF по MIDI RETURN OUTN DECF FSR,F RETURN ; ; ЗАГРУЗКА ЗНАЧЕНИЙ ДЛЯ ПОИСКА В CHAN ; INFIND MOVLW CHAN MOVWF FSR MOVLW 0Ah MOVWF CNT2 RETURN ; ; ВЫКЛ ВСЕ НОТЫ ; ALNOF CALL INFIND AL1 BTFSS INDF,7 ;проверка ячейки CHAN на занятость CALL OUTNOF ;если занято INCF FSR,F ;переход к след.ячейке CHAN INCF FSR,F DECFSZ CNT2,F GOTO AL1 CALL PEDOFF ;выключение педали RETURN ; ; ВЫВОД NOTE ON ПО MIDI ; OUTNON MOVLW 90h ;NOTE ON ADDWF MIDCH,W CALL OUT MOVF INDF,W ANDLW B'01111111' ;выкл признака занято ADDWF SDVIG,W CALL OUT INCF FSR,F MOVF INDF,W ANDLW B'01111111' ;выкл признака "переданность" CALL OUT DECF FSR,F RETURN ; ; ВЫВОД NOTE OFF ПО MIDI ; OUTNOF MOVLW 80h ;NOTE OFF ADDWF MIDCH,W CALL OUT MOVF INDF,W ANDLW B'01111111' ;выкл признака "переданность" ADDWF SDVIG,W CALL OUT MOVLW 7Fh CALL OUT RETURN ; ; ; ВЫВОД БАЙТА ИЗ W ПО MIDI ; OUT BCF INTCON,GIE ;запрет прерываний BCF PORTB,7 ;старт бит MOVWF OUTBUF MOVLW 08h MOVWF CNT NOP ;выравнивание ; CALL DEL OUT1 BTFSC OUTBUF,0 GOTO SETBIT ;BSF PORTB,7 GOTO CLRBIT ;BCF PORTB,7 OUT2 RRF OUTBUF,F CALL DEL DECFSZ CNT,F GOTO OUT1 BSF PORTB,7 ;стоп биты CALL DEL CALL DEL CALL DEL RETURN SETBIT BSF PORTB,7 GOTO OUT2 CLRBIT BCF PORTB,7 GOTO OUT2 ; DEL MOVLW 05h ;задержка MOVWF CNT1 DEL1 DECFSZ CNT1,F GOTO DEL1 NOP ;выравнивание NOP RETURN ; END ;