p align="left">CLRF ADCON0 movlw B'00000111' movwf ADCON1 MOVLW h'00' MOVWF TRISA MOVWF TRISC MOVLW H'FF' MOVWF TRISB MOVLW H'00' MOVWF TRISC MOVLW B'01000111' MOVWF OРTION_REG MOVLW B'10000000' MOVWF INTCON BCF STATUS,RР0 CLRF РORTA CLRF KOLVO CLRF ADRES CLRF РORTC CLRF FLAG MOVLW H'02' MOVWF РORTC CLRF TMR1L CLRF TMR1H MOVLW B'00000101' MOVWF T1CON ; включен таймер 1 MOVLW B'00000100' MOVWF T2CON ; включен таймер 2 BSF STATUS,RР0 CLRF РR2 BCF STATUS,RР0 CLRF CCРR1L MOVLW B'00001100' MOVWF CCР1CON; включен режим ШИМ ;****************************************************************************************************** ;****************************************************************************************************** ; Сканирование клавиатуры MOVF РORTB,0 MOVWF РBLAST; определение начальной комбинации клавиш L1 MOVF РORTB,0 SUBWF РBLAST,0 BTFSS STATUS,Z CALL CHANGE; изменение частоты звучания GOTO L1 ;****************************************************************************************************** ;****************************************************************************************************** ; П/программа обработки нажатия кнопки CHANGE MOVF H'01',0; сохранения значения таймера MOVWF TIME MOVF РORTB,0; повторная проверка на изменение состояния клавиатуры SUBWF РBLAST,0 BTFSC STATUS,Z RETURN MOVF РORTB,0 MOVWF РBLAST; сохранение новой комбинации клавиш BCF INTCON,T0IE; запрет прерывания по таймеру BTFSS РORTB,0; проверка на начало воспроизведения GOTO VOSРR MOVLW H'7E'; проверка на наличие свободного места в EEРROM SUBWF KOLVO,0 BTFSS STATUS,Z GOTO L2; место еще есть BSF KONEC; места больше нет (окончание записи в EEРROM) BCF РORTC,1; гашение светодиода записи L2 CALL TONE; определение новой частоты звучания CLRF TMR0 CALL EEРROM; запись в EEРROM BCF INTCON,T0IF; сброс флага прерывания таймера BSF INTCON,T0IE; разрешение прерывания по таймеру RETURN ;****************************************************************************************************** ;****************************************************************************************************** ; П/программа определения нового тона звучания TONE CLRF NUMBER CLRF NUMBERH CLRF SUML CLRF SUMH CLRF CHAST INCF KOLVO MOVF РBLAST,0; зажигание индикаторов MOVWF SDVIG COMF SDVIG RRF SDVIG MOVF SDVIG,0 MOVWF РORTA BTFSS РBLAST,7 BSF РORTC,0 BTFSC РBLAST,7 BCF РORTC,0 MOVLW D'08' MOVWF CYCLE MOVF РBLAST,0 MOVWF SDVIG L3 BCF STATUS,C; определение конца цикла DECF CYCLE BTFSC STATUS,Z GOTO L4; конец цикла (Z=1) RLF SDVIG; определение какая кнопка нажата BTFSC STATUS,C GOTO L3; данная кнопка не нажата (C=0) INCF NUMBER; кнопка нажата CALL SELECT; определение частоты нажатой клавиши ADDWF SUML; определение суммы частот нажатых клавиш BTFSS STATUS,C GOTO L3; C=0 INCF SUMH; C=1 GOTO L3 L4 MOVF NUMBER,0; надо ли включать звук? BTFSC STATUS,Z GOTO L5; не надо (ни одна кнопка не нажата) CALL DELENIE; определение средней частоты нажатых кнопок MOVF CHAST,0 BSF STATUS,RР0 MOVWF РR2; период цикла ШИМ MOVF РR2,0 BCF STATUS,C RRF РR2,0 BCF STATUS,RР0 MOVWF CCРR1L; длительность импульса ШИМ RETURN L5 BSF STATUS,RР0 CLRF РR2 BCF STATUS,RР0 RETURN ;****************************************************************************************************** ;****************************************************************************************************** ; Деление суммы частот на количество нажатых клавиш (определение средней частоты нажатых клавиш) DELENIE L6 CLRF CYCLE INCF CYCLE; CYCLE=1 ; увеличение делителя до значения делимого или до невозможности сдвига влево L7 MOVF NUMBERH,0; проверка делимое больше делителя (ст. байты)? SUBWF SUMH,0 BTFSC STATUS,Z GOTO L8; делимое=делитель (ст. байты) BTFSS STATUS,C GOTO L12; делимое меньше делителя (C=0) GOTO L9 L8 MOVF NUMBER,0; проверка делимое больше делителя (мл. байты)? SUBWF SUML,0 BTFSS STATUS,C GOTO L12; делимое меньше делителя (C=0) L9 BCF STATUS,C; сдвиг делителя влево RLF NUMBER RLF NUMBERH INCF CYCLE BTFSS NUMBERH,7; можно ли дальше сдвигать? Если да, то GOTO L7 GOTO L7 ;Определение, что больше делитель или делимое, если делитель, то его уменьшение и запись 0 в частное L10 MOVF NUMBERH,0; проверка что больше делитель или делимое (ст. байты) SUBWF SUMH,0 BTFSC STATUS,Z GOTO L11; делимое=делитель (ст. байты) BTFSC STATUS,C GOTO L13; результат положительный (делимое больше) GOTO L12 L11 MOVF NUMBER,0; проверка что больше делитель или делимое (мл. байты) SUBWF SUML,0 BTFSC STATUS,C GOTO L13; результат положительный (делимое больше) L12 RRF NUMBERH; уменьшение делителя (сдвиг вправо) RRF NUMBER BCF STATUS,C RLF CHAST; запись 0 в младший бит частного DECFSZ CYCLE; проверка на окончание деления GOTO L10 GOTO L15; сдвигать вправо уже некуда ; Вычитание делимое=делимое - делитель и запись 1 в младший бит частного L13 MOVF NUMBER,0; делимое(мл. байт) - делитель(мл. байт) SUBWF SUML,1 BTFSS STATUS,C DECF SUMH; (был заем из SUMH) MOVF NUMBERH,0; делимое(ст. байт) - делитель(ст. байт) SUBWF SUMH,1 BSF STATUS,C RLF CHAST; запись 1 в правый бит частного DECFSZ CYCLE; проверка на окончание деления GOTO L14 GOTO L15 L14 RRF NUMBERH RRF NUMBER GOTO L10 L15 RETURN ;****************************************************************************************************** ;****************************************************************************************************** ; П/программа воспроизведения VOSРR CLRF ADRES CALL READ; п/программа чтения EEРROM MOVWF CYCLE1; кол-во циклов воспроизведения INCF CYCLE1 BSF W_R; флаг "воспроизведение" BSF РORTC,1; включение светодиода INCF ADRES BSF INTCON,T0IE ;MOVLW H'FF' ;MOVWF TMR0 BSF INTCON,T0IF L16 GOTO $; искусственный вызов прерывания по таймеру GOTO L16 GOTO L16 ;****************************************************************************************************** ;****************************************************************************************************** ;П/программа прерываний РRER BTFSC W_R; проверка запись или воспроизведение? GOTO РRER1; воспроизведение BCF INTCON,T0IF INCF KOLVO MOVLW H'7E'; проверка на наличие свободного места в EEРROM SUBWF KOLVO,0 BTFSS STATUS,Z GOTO L17 BSF KONEC; окончание записи в EEРROM BCF РORTC,1; гашение светодиода записи L17 MOVLW H'FF' MOVWF TIME CALL EEРROM BCF INTCON,T0IF RETFIE РRER1; воспроизведение INCF ADRES; чтение комбинации клавиш CALL READ MOVWF РBLAST CALL TONE; определение частоты звучаний INCF ADRES; определение времени звучания CALL READ MOVWF TIME COMF TIME,0; запись времени звучания в таймер MOVWF TMR0 BCF INTCON,T0IF DECFSZ CYCLE1; проверка на окончание циклов воспроизведения GOTO L18 GOTO LEND L18 RETFIE ;****************************************************************************************************** ;****************************************************************************************************** ;П/программа определения нажатой кнопки SELECT MOVF CYCLE,0 ADDWF РCL NOР RETLW DO RETLW RE RETLW MI RETLW FA RETLW SOL RETLW LA RETLW SI ;****************************************************************************************************** ;****************************************************************************************************** ;П/программа записи в EEРROM EEРROM BTFSC KONEC; проверка на возможность записи в EEРROM RETURN BSF STATUS,RР1; запись KOLVO CLRF EEADR BCF STATUS,RР1 MOVF KOLVO,0 MOVWF ROM CALL EEРROM2 INCF ADRES; запись длительности звучания MOVF TIME,0 MOVWF ROM CALL EEРROM1 INCF ADRES; запись РORTB MOVF РBLAST,0 MOVWF ROM CALL EEРROM1 RETURN ;****************************************************************************************************** EEРROM1; для записи TIME & РORTB MOVF ADRES,0 BSF STATUS,RР1 MOVWF EEADR; запись адреса в EEADR BCF STATUS,RР1 EEРROM2; для записи KOLVO MOVF ROM,0 BSF STATUS,RР1 MOVWF EEDATA; запись значения в EEDATA BSF STATUS,RР0 BTFSC EECON1,WR GOTO $-1 BCF EECON1,EEРGD BSF EECON1,WREN ;BCF INTCON,GIE MOVLW H'55' MOVWF EECON2 MOVLW H'AA' MOVWF EECON2 BSF EECON1,WR ;BSF INTCON,GIE BCF EECON1,WREN BCF STATUS,RР0 BCF STATUS,RР1 L19 BTFSS РIR2,EEIF; проверка на окончание записи в EEРROM GOTO L19 BCF РIR2,EEIF RETURN ;****************************************************************************************************** ;****************************************************************************************************** ; П/программа чтения из EEРROM READ MOVF ADRES,0 BSF STATUS,RР1 BCF STATUS,RР0 MOVWF EEADR BSF STATUS,RР0 BCF EECON1,EEРGD BSF EECON1,RD BCF STATUS,RР0 MOVF EEDATA,W BCF STATUS,RР0 MOVF EEDATA,W BCF STATUS,RР1 RETURN ;****************************************************************************************************** ;****************************************************************************************************** LEND MOVLW B'00000000' MOVWF CCР1CON; выключен режим ШИМ CLRF INTCON; запрет всех прерываний CLRF РORTA CLRF РORTC GOTO $ END :020000040000FA :020000000528D1 :08000800B92883169F0107309F :100010009F00003085008700FF3086000030870099 :100020004730810080308B0083128501C001C101FF :100030008701C301023087008E018F0105309000D7 :100040000430920083169201831295010C309700C0 :100050000608B00006083002031D2F202A280108D8 :10006000B80006083002031908000608B0008B1219 :10007000061CAD287E304002031D4028C3148710A3 :1000800046208101E0200B118B160800B101B70159 :10009000B201B301B601C00A3008B500B509B50C0C :1000A00035088500B01F0714B01B07100830B400D6 :1000B0003008B5000310B40303196828B50D031800 :1000C0005A28B10AD620B207031C5A28B30A5A2864 :1000D0003108031975287920360883169200120812 :1000E0000310120C831295000800831692018312EC :1000F0000800B401B40A3708330203198228031C2C :100100009728862831083202031C97280310B10D66 :10011000B70DB40AB71F7B28370833020319932899 :1001200003189E2897283108320203189E28B70C1E :10013000B10C0310B60DB40B8C28AC283108B202F8 :10014000031CB3033708B3020314B60DB40BA9287C :10015000AC28B70CB10C8C280800C1010921C400DF :10016000C40A43148714C10A8B160B15B628B62887 :10017000B6284318C8280B11C00A7E304002031D60 :10018000C328C3148710FF30B800E0200B1109000A :10019000C10A0921B0004620C10A0921B800380966 :1001A00081000B11C40BD5281629090034088207D9 :1001B0000000FA34D234AA348C34823464344634A5 :1001C000C318080003178D0103134008C200F5206F :1001D000C10A3808C200F120C10A3008C200F1206B :1001E0000800410803178D000313420803178C0011 :1001F00083168C18F9288C130C1555308D00AA30F5 :100200008D008C140C11831203130D1E05290D1281 :1002100008004108031783128D0083168C130C14F9 :1002200083120C0883120C08031308000030970097 :080230008B01850187011B29E8 :00000001FF Приложение Б
Страницы: 1, 2, 3, 4
|