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
Приложение Б