Смекни!
smekni.com

Разработка микропроцессорной системы на базе микроконтроллера - синтезатора игры пианино в пределах (стр. 5 из 5)

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


Приложение Б