kod 1 – gama
ljmp start
P5 equ 0F8H
P7 equ 0DBH
#define LINE_1 0x7f ; 0111 1111
#define LINE_2 0xbf ; 1011 1111
#define LINE_3 0xdf ; 1101 1111
#define LINE_4 0xef ; 1110 1111
ORG 000BH ; Obsługa przerwania Timer 0
cpl P3.2 ; Ruch membraną brzęczyka
push ACC
mov A, R6 ; Przeładowanie TH0
mov TH0, A
mov A, R7 ; Przeładowanie TL0
mov TL0, A
pop ACC
reti
ORG 0100H
; Tablica przekodowania klawisze - dźwięki w XRAM
keymuz:
mov dptr, #8077H \ mov a, #89H \ movx @dptr, a
mov dptr, #807BH \ mov a, #0F4H \ movx @dptr, a
mov dptr, #807DH \ mov a, #5AH \ movx @dptr, a
mov dptr, #807EH \ mov a, #0B9H \ movx @dptr, a
mov dptr, #80B7H \ mov a, #13H \ movx @dptr, a
mov dptr, #80BBH \ mov a, #68H \ movx @dptr, a
mov dptr, #80BDH \ mov a, #0B9H \ movx @dptr, a
mov dptr, #80BEH \ mov a, #04H \ movx @dptr, a
mov dptr, #80D7H \ mov a, #4CH \ movx @dptr, a
mov dptr, #80DBH \ mov a, #90H \ movx @dptr, a
mov dptr, #80DDH \ mov a, #0CFH \ movx @dptr, a
mov dptr, #80DEH \ mov a, #0CH \ movx @dptr, a
mov dptr, #80E7H \ mov a, #45H \ movx @dptr, a
mov dptr, #80EBH \ mov a, #7AH \ movx @dptr, a
mov dptr, #80EDH \ mov a, #0ADH \ movx @dptr, a
mov dptr, #80EEH \ mov a, #0DDH \ movx @dptr, a
mov dptr, #8177H \ mov a, #0F8H \ movx @dptr, a
mov dptr, #817BH \ mov a, #0F8H \ movx @dptr, a
mov dptr, #817DH \ mov a, #0F9H \ movx @dptr, a
mov dptr, #817EH \ mov a, #0F9H \ movx @dptr, a
mov dptr, #81B7H \ mov a, #0FAH \ movx @dptr, a
mov dptr, #81BBH \ mov a, #0FAH \ movx @dptr, a
mov dptr, #81BDH \ mov a, #0FAH \ movx @dptr, a
mov dptr, #81BEH \ mov a, #0FBH \ movx @dptr, a
mov dptr, #81D7H \ mov a, #0FBH \ movx @dptr, a
mov dptr, #81DBH \ mov a, #0FBH \ movx @dptr, a
mov dptr, #81DDH \ mov a, #0FBH \ movx @dptr, a
mov dptr, #81DEH \ mov a, #0FCH \ movx @dptr, a
mov dptr, #81E7H \ mov a, #0FCH \ movx @dptr, a
mov dptr, #81EBH \ mov a, #0FCH \ movx @dptr, a
mov dptr, #81EDH \ mov a, #0FCH \ movx @dptr, a
mov dptr, #81EEH \ mov a, #0FCH \ movx @dptr, a
ret
start:
acall keymuz
mov TMOD, #01H ; Timer 0 w trybie 1 (16-bitowym)
mov IE, #82H ; Odblokowanie przerwań globalnych i Timer 0
graj:
mov r4, #00H ; Wyczyszczenie rejestru poprzedniego klawisza
clr TR0 ; Zatrzymanie dźwięku, gdy brak wciśniętego klawisza
key_1:
mov r0, #LINE_1 \ mov a, r0 \ mov P5, a \ mov a, P7 \ anl a, r0 \ mov r2, a
clr c \ subb a, r0 \ jz key_2
mov a, r2 \ clr c \ subb a, r4 \ jz key_1
mov a, r2 \ mov r4, a
mov dph, #81h \ mov dpl, a \ movx a, @dptr \ mov R6, a \ mov TH0, a
mov a, r2 \ mov dph, #80h \ mov dpl, a \ movx a, @dptr \ mov R7, a \ mov TL0, a
setb TR0 \ jmp key_1
key_2:
mov r0, #LINE_2 \ mov a, r0 \ mov P5, a \ mov a, P7 \ anl a, r0 \ mov r2, a
clr c \ subb a, r0 \ jz key_3
mov a, r2 \ clr c \ subb a, r4 \ jz key_2
mov a, r2 \ mov r4, a
mov dph, #81h \ mov dpl, a \ movx a, @dptr \ mov R6, a \ mov TH0, a
mov a, r2 \ mov dph, #80h \ mov dpl, a \ movx a, @dptr \ mov R7, a \ mov TL0, a
setb TR0 \ jmp key_2
key_3:
mov r0, #LINE_3 \ mov a, r0 \ mov P5, a \ mov a, P7 \ anl a, r0 \ mov r2, a
clr c \ subb a, r0 \ jz key_4
mov a, r2 \ clr c \ subb a, r4 \ jz key_3
mov a, r2 \ mov r4, a
mov dph, #81h \ mov dpl, a \ movx a, @dptr \ mov R6, a \ mov TH0, a
mov a, r2 \ mov dph, #80h \ mov dpl, a \ movx a, @dptr \ mov R7, a \ mov TL0, a
setb TR0 \ jmp key_3
key_4:
mov r0, #LINE_4 \ mov a, r0 \ mov P5, a \ mov a, P7 \ anl a, r0 \ mov r2, a
clr c \ subb a, r0 \ jz dalej
mov a, r2 \ clr c \ subb a, r4 \ jz key_4
mov a, r2 \ mov r4, a
mov dph, #81h \ mov dpl, a \ movx a, @dptr \ mov R6, a \ mov TH0, a
mov a, r2 \ mov dph, #80h \ mov dpl, a \ movx a, @dptr \ mov R7, a \ mov TL0, a
setb TR0 \ jmp key_4
dalej:
jmp graj
end start
kod 2
ljmp start
; --- DEFINICJE ADRESÓW I LINII LCD (Z TWOJEGO PROGRAMU) ---
LCDstatus equ 0FF2EH ; adres do odczytu gotowosci LCD
LCDcontrol equ 0FF2CH ; adres do podania bajtu sterujacego LCD
LCDdataWR equ 0FF2DH ; adres do podania kodu ASCII na LCD
#define HOME 0x80
#define INITDISP 0x38
#define HOM2 0xc0
#define LCDON 0x0e
#define CLEAR 0x01
; --- REJESTRY I LINIE KLAWIATURY (Z PROGRAMU ORGANKÓW) ---
P5 equ 0F8H
P7 equ 0DBH
#define LINE_1 0x7f ; 0111 1111
#define LINE_2 0xbf ; 1011 1111
#define LINE_3 0xdf ; 1101 1111
#define LINE_4 0xef ; 1110 1111
; --- OBSŁUGA PRZERWANIA TIMER 0 ---
ORG 000BH
cpl P3.2 ; ruch membraną brzęczyka
push ACC
mov A, R6 ; przeładowanie stałej timera
mov TH0, A
mov A, R7
mov TL0, A
pop ACC
reti
ORG 0100H
; --- MAKRA OBSŁUGI LCD (Z TWOJEGO PROGRAMU) ---
LCDcntrlWR MACRO x
LOCAL loop
loop: MOV DPTR,#LCDstatus
MOVX A,@DPTR
JB ACC.7,loop
MOV DPTR,#LCDcontrol
MOV A, x
MOVX @DPTR,A
ENDM
LCDcharWR MACRO
LOCAL tutu
PUSH ACC
tutu: MOV DPTR,#LCDstatus
MOVX A,@DPTR
JB ACC.7,tutu
MOV DPTR,#LCDdataWR
POP ACC
MOVX @DPTR,A
ENDM
init_LCD MACRO
LCDcntrlWR #INITDISP
LCDcntrlWR #CLEAR
LCDcntrlWR #LCDON
ENDM
; --- PODPROGRAMY POMOCNICZE LCD ---
putcharLCD:
LCDcharWR
ret
; Podprogram wypisujący nazwę nuty na podstawie kodu skaningowego z R2
POKAZ_NOTE:
push dph
push dpl
push acc
push b
; Czyszczenie ekranu przed wyświetleniem nowej nuty
LCDcntrlWR #CLEAR
LCDcntrlWR #HOME
mov a, r2
acall GET_INDEX ; zamiana kodu skaningowego na indeks 0-15
cjne a, #0FFH, POKAZ_OK
sjmp POKAZ_KONIEC
POKAZ_OK:
mov b, #5 ; każda nazwa w tabeli zajmuje dokładnie 5 bajtów
mul ab
mov dptr, #NOTE_NAMES
add a, dpl
mov dpl, a
mov a, b
addc a, dph
mov dph, a
PRINT_LOOP:
clr a
movc a, @a+dptr
jz POKAZ_KONIEC
; Zabezpieczenie DPTR przed nadpisaniem przez makro LCD (zgodnie z Twoim programem)
push dph
push dpl
acall putcharLCD
pop dpl
pop dph
inc dptr
sjmp PRINT_LOOP
POKAZ_KONIEC:
pop b
pop acc
pop dpl
pop dph
ret
; Konwersja kodu skaningowego (ACC) na indeks liczbowy (0-15)
GET_INDEX:
cjne A, #77H, I_7B \ mov A, #0 \ ret
I_7B: cjne A, #7BH, I_7D \ mov A, #1 \ ret
I_7D: cjne A, #7DH, I_7E \ mov A, #2 \ ret
I_7E: cjne A, #7EH, I_B7 \ mov A, #3 \ ret
I_B7: cjne A, #B7H, I_BB \ mov A, #4 \ ret
I_BB: cjne A, #BBH, I_BD \ mov A, #5 \ ret
I_BD: cjne A, #BDH, I_BE \ mov A, #6 \ ret
I_BE: cjne A, #BEH, I_D7 \ mov A, #7 \ ret
I_D7: cjne A, #D7H, I_DB \ mov A, #8 \ ret
I_DB: cjne A, #DBH, I_DD \ mov A, #9 \ ret
I_DD: cjne A, #DDH, I_DE \ mov A, #10 \ ret
I_DE: cjne A, #DEH, I_E7 \ mov A, #11 \ ret
I_E7: cjne A, #E7H, I_EB \ mov A, #12 \ ret
I_EB: cjne A, #EBH, I_ED \ mov A, #13 \ ret
I_ED: cjne A, #EDH, I_EE \ mov A, #14 \ ret
I_EE: cjne A, #EEH, I_ERR \ mov A, #15 \ ret
I_ERR: mov A, #0FFH \ ret
; --- TABLICA PRZEKODOWANIA KLAWISZE - DŹWIĘKI W XRAM ---
keymuz:
mov dptr, #8077H \ mov a, #89H \ movx @dptr, a
mov dptr, #807BH \ mov a, #0F4H \ movx @dptr, a
mov dptr, #807DH \ mov a, #5AH \ movx @dptr, a
mov dptr, #807EH \ mov a, #0B9H \ movx @dptr, a
mov dptr, #80B7H \ mov a, #13H \ movx @dptr, a
mov dptr, #80BBH \ mov a, #68H \ movx @dptr, a
mov dptr, #80BDH \ mov a, #0B9H \ movx @dptr, a
mov dptr, #80BEH \ mov a, #04H \ movx @dptr, a
mov dptr, #80D7H \ mov a, #4CH \ movx @dptr, a
mov dptr, #80DBH \ mov a, #90H \ movx @dptr, a
mov dptr, #80DDH \ mov a, #0CFH \ movx @dptr, a
mov dptr, #80DEH \ mov a, #0CH \ movx @dptr, a
mov dptr, #80E7H \ mov a, #45H \ movx @dptr, a
mov dptr, #80EBH \ mov a, #7AH \ movx @dptr, a
mov dptr, #80EDH \ mov a, #0ADH \ movx @dptr, a
mov dptr, #80EEH \ mov a, #0DDH \ movx @dptr, a
mov dptr, #8177H \ mov a, #0F8H \ movx @dptr, a
mov dptr, #817BH \ mov a, #0F8H \ movx @dptr, a
mov dptr, #817DH \ mov a, #0F9H \ movx @dptr, a
mov dptr, #817EH \ mov a, #0F9H \ movx @dptr, a
mov dptr, #81B7H \ mov a, #0FAH \ movx @dptr, a
mov dptr, #81BBH \ mov a, #0FAH \ movx @dptr, a
mov dptr, #81BDH \ mov a, #0FAH \ movx @dptr, a
mov dptr, #81BEH \ mov a, #0FBH \ movx @dptr, a
mov dptr, #81D7H \ mov a, #0FBH \ movx @dptr, a
mov dptr, #81DBH \ mov a, #0FBH \ movx @dptr, a
mov dptr, #81DDH \ mov a, #0FBH \ movx @dptr, a
mov dptr, #81DEH \ mov a, #0FCH \ movx @dptr, a
mov dptr, #81E7H \ mov a, #0FCH \ movx @dptr, a
mov dptr, #81EBH \ mov a, #0FCH \ movx @dptr, a
mov dptr, #81EDH \ mov a, #0FCH \ movx @dptr, a
mov dptr, #81EEH \ mov a, #0FCH \ movx @dptr, a
ret
; --- PROGRAM GŁÓWNY ---
start:
acall keymuz
init_LCD ; Inicjalizacja LCD za pomocą Twojego makra
MOV TMOD, #01H ; konfiguracja timera
MOV IE, #82H ; przerwania wlacz
graj:
MOV r4, #00H ; dotychczasowy klawisz
CLR TR0 ; timer stop
key_1:
mov r0, #LINE_1
mov a, r0
mov P5, a
mov a, P7
anl a, r0
mov r2, a
clr c
subb a, r0
jz key_2
mov a, r2
clr c
subb a, r4
jz key_1
mov a, r2
mov r4, a
acall POKAZ_NOTE ; Wyświetlenie znaku na LCD przy nowym kliknięciu
mov dph, #81h
mov dpl, a
movx a,@dptr
mov R6, a
mov TH0, a
mov a, r2
mov dph, #80h
mov dpl, a
movx a,@dptr
mov R7, a
mov TL0, a
setb TR0
jmp key_1
key_2:
mov r0, #LINE_2
mov a, r0
mov P5, a
mov a, P7
anl a, r0
mov r2, a
clr c
subb a, r0
jz key_3
mov a, r2
clr c
subb a, r4
jz key_2
mov a, r2
mov r4, a
acall POKAZ_NOTE ; Wyświetlenie znaku na LCD
mov a, r2
mov dph, #81h
mov dpl, a
movx a,@dptr
mov R6, a
mov TH0, a
mov a, r2
mov dph, #80h
mov dpl, a
movx a,@dptr
mov R7, a
mov TL0, a
setb TR0
jmp key_2
key_3:
mov r0, #LINE_3
mov a, r0
mov P5, a
mov a, P7
anl a, r0
mov r2, a
clr c
subb a, r0
jz key_4
mov a, r2
clr c
subb a, r4
jz key_3
mov a, r2
mov r4, a
acall POKAZ_NOTE ; Wyświetlenie znaku na LCD
mov dph, #81h
mov dpl, a
movx a,@dptr
mov R6, a
mov TH0, a
mov a, r2
mov dph, #80h
mov dpl, a
movx a,@dptr
mov R7, a
mov TL0, a
setb TR0
jmp key_3
key_4:
mov r0, #LINE_4
mov a, r0
mov P5, a
mov a, P7
anl a, r0
mov r2, a
clr c
subb a, r0
jz dalej
mov a, r2
clr c
subb a, r4
jz key_4
mov a, r2
mov r4, a
acall POKAZ_NOTE ; Wyświetlenie znaku na LCD
mov dph, #81h
mov dpl, a
movx a,@dptr
mov R6, a
mov TH0, a
mov a, r2
mov dph, #80h
mov dpl, a
movx a,@dptr
mov R7, a
mov TL0, a
setb TR0
jmp key_4
dalej:
jmp graj
; --- TABELA NAZW NUT (DOPASOWANA DO FORMATU 5 BAJTÓW NA TEKST) ---
NOTE_NAMES:
db "C1 ",00
db "CIS1",00
db "D1 ",00
db "DIS1",00
db "E1 ",00
db "F1 ",00
db "FIS1",00
db "G1 ",00
db "GIS1",00
db "A1 ",00
db "B1 ",00
db "H1 ",00
db "C2 ",00
db "CIS2",00
db "D2 ",00
db "DIS2",00
end start
kod 3
ljmp start
; --- DEFINICJE ADRESÓW I LINII LCD (Z TWOJEGO PROGRAMU) ---
LCDstatus equ 0FF2EH ; adres do odczytu gotowosci LCD
LCDcontrol equ 0FF2CH ; adres do podania bajtu sterujacego LCD
LCDdataWR equ 0FF2DH ; adres do podania kodu ASCII na LCD
#define HOME 0x80
#define INITDISP 0x38
#define HOM2 0xc0
#define LCDON 0x0e
#define CLEAR 0x01
; --- REJESTRY I LINIE KLAWIATURY (Z PROGRAMU ORGANKÓW) ---
P5 equ 0F8H
P7 equ 0DBH
#define LINE_1 0x7f
#define LINE_2 0xbf
#define LINE_3 0xdf
#define LINE_4 0xef
; --- OBSŁUGA PRZERWANIA TIMER 0 ---
ORG 000BH
cpl P3.2 ; ruch membraną brzęczyka
push ACC
mov A, R6 ; przeładowanie stałej TH0
mov TH0, A
mov A, R7 ; przeładowanie stałej TL0
mov TL0, A
pop ACC
reti
ORG 0100H
; --- MAKRA OBSŁUGI LCD (Z TWOJEGO PROGRAMU) ---
LCDcntrlWR MACRO x
LOCAL loop
loop: MOV DPTR,#LCDstatus
MOVX A,@DPTR
JB ACC.7,loop
MOV DPTR,#LCDcontrol
MOV A, x
MOVX @DPTR,A
ENDM
LCDcharWR MACRO
LOCAL tutu
PUSH ACC
tutu: MOV DPTR,#LCDstatus
MOVX A,@DPTR
JB ACC.7,tutu
MOV DPTR,#LCDdataWR
POP ACC
MOVX @DPTR,A
ENDM
init_LCD MACRO
LCDcntrlWR #INITDISP
LCDcntrlWR #CLEAR
LCDcntrlWR #LCDON
ENDM
; --- PODPROGRAMY POMOCNICZE ---
putcharLCD:
LCDcharWR
ret
; --- CENTRALNA PROCEDURA ODTWARZANIA I TRANSPOZYCJI ---
; Wejście: R2 - oryginalny kod skaningowy wciśniętego klawisza
ZAGRAJ_Z_TRANSP:
mov A, R2
clr c
subb A, R4
jz KONIEC_ZAGRAJ ; Jeśli to ten sam klawisz, kontynuuj granie bez zmian
mov A, R2
mov R4, A ; Zapisz aktualny klawisz bazowy
; 1. Pobierz bazowy indeks nuty (0-15)
mov A, R2
acall GET_INDEX
; 2. Dodaj wartość transpozycji zapisaną w R3
add A, R3
; Zabezpieczenie przed wyjściem ponad najwyższą dostępną nutę (indeks 15)
clr c
mov R5, A ; R5 przechowuje ostateczny, przesunięty indeks nuty
subb A, #16
jc INDEKS_OK
mov R5, #15 ; Jeśli przekroczy zakres, utnij do najwyższej nuty DIS2
INDEKS_OK:
; 3. Wyświetlenie przetransponowanej nuty na LCD przy użyciu Twojego makra
acall POKAZ_NOTE_PO_INDEKSIE
; 4. Konwersja indeksu z R5 z powrotem na kod skaningowy potrzebny do XRAM
mov A, R5
mov dptr, #SCAN_CODES
movc A, @A+dptr
mov R1, A ; R1 = nowy, przetransponowany kod skaningowy
; 5. Ładowanie wartości Timera z XRAM przy użyciu przetransponowanego kodu w R1
mov dph, #81h
mov dpl, R1
movx A, @dptr
mov R6, A
mov TH0, A
mov dph, #80h
mov dpl, R1
movx A, @dptr
mov R7, A
mov TL0, A
setb TR0 ; Uruchomienie brzmienia
KONIEC_ZAGRAJ:
ret
; --- WYŚWIETLANIE NUTY NA PODSTAWIE INDEKSU Z R5 ---
POKAZ_NOTE_PO_INDEKSIE:
push dph
push dpl
push acc
push b
LCDcntrlWR #CLEAR
LCDcntrlWR #HOME
mov A, R5
mov b, #5 ; każda nazwa w tabeli zajmuje dokładnie 5 bajtów
mul ab
mov dptr, #NOTE_NAMES
add a, dpl
mov dpl, a
mov a, b
addc a, dph
mov dph, a
PRINT_LOOP:
clr a
movc a, @a+dptr
jz POKAZ_KONIEC
; Zabezpieczenie rejestru DPTR przed nadpisaniem przez makro LCD
push dph
push dpl
acall putcharLCD
pop dpl
pop dph
inc dptr
sjmp PRINT_LOOP
POKAZ_KONIEC:
pop b
pop acc
pop dpl
pop dph
ret
; Konwersja kodu skaningowego (ACC) na indeks liczbowy (0-15)
GET_INDEX:
cjne A, #77H, I_7B \ mov A, #0 \ ret
I_7B: cjne A, #7BH, I_7D \ mov A, #1 \ ret
I_7D: cjne A, #7DH, I_7E \ mov A, #2 \ ret
I_7E: cjne A, #7EH, I_B7 \ mov A, #3 \ ret
I_B7: cjne A, #B7H, I_BB \ mov A, #4 \ ret
I_BB: cjne A, #BBH, I_BD \ mov A, #5 \ ret
I_BD: cjne A, #BDH, I_BE \ mov A, #6 \ ret
I_BE: cjne A, #BEH, I_D7 \ mov A, #7 \ ret
I_D7: cjne A, #D7H, I_DB \ mov A, #8 \ ret
I_DB: cjne A, #DBH, I_DD \ mov A, #9 \ ret
I_DD: cjne A, #DDH, I_DE \ mov A, #10 \ ret
I_DE: cjne A, #DEH, I_E7 \ mov A, #11 \ ret
I_E7: cjne A, #E7H, I_EB \ mov A, #12 \ ret
I_EB: cjne A, #EBH, I_ED \ mov A, #13 \ ret
I_ED: cjne A, #EDH, I_EE \ mov A, #14 \ ret
I_EE: cjne A, #EEH, I_ERR \ mov A, #15 \ ret
I_ERR: mov A, #0FFH \ ret
; --- TABLICA PRZEKODOWANIA KLAWISZE - DŹWIĘKI W XRAM ---
keymuz:
mov dptr, #8077H \ mov a, #89H \ movx @dptr, a
mov dptr, #807BH \ mov a, #0F4H \ movx @dptr, a
mov dptr, #807DH \ mov a, #5AH \ movx @dptr, a
mov dptr, #807EH \ mov a, #0B9H \ movx @dptr, a
mov dptr, #80B7H \ mov a, #13H \ movx @dptr, a
mov dptr, #80BBH \ mov a, #68H \ movx @dptr, a
mov dptr, #80BDH \ mov a, #0B9H \ movx @dptr, a
mov dptr, #80BEH \ mov a, #04H \ movx @dptr, a
mov dptr, #80D7H \ mov a, #4CH \ movx @dptr, a
mov dptr, #80DBH \ mov a, #90H \ movx @dptr, a
mov dptr, #80DDH \ mov a, #0CFH \ movx @dptr, a
mov dptr, #80DEH \ mov a, #0CH \ movx @dptr, a
mov dptr, #80E7H \ mov a, #45H \ movx @dptr, a
mov dptr, #80EBH \ mov a, #7AH \ movx @dptr, a
mov dptr, #80EDH \ mov a, #0ADH \ movx @dptr, a
mov dptr, #80EEH \ mov a, #0DDH \ movx @dptr, a
mov dptr, #8177H \ mov a, #0F8H \ movx @dptr, a
mov dptr, #817BH \ mov a, #0F8H \ movx @dptr, a
mov dptr, #817DH \ mov a, #0F9H \ movx @dptr, a
mov dptr, #817EH \ mov a, #0F9H \ movx @dptr, a
mov dptr, #81B7H \ mov a, #0FAH \ movx @dptr, a
mov dptr, #81BBH \ mov a, #0FAH \ movx @dptr, a
mov dptr, #81BDH \ mov a, #0FAH \ movx @dptr, a
mov dptr, #81BEH \ mov a, #0FBH \ movx @dptr, a
mov dptr, #81D7H \ mov a, #0FBH \ movx @dptr, a
mov dptr, #81DBH \ mov a, #0FBH \ movx @dptr, a
mov dptr, #81DDH \ mov a, #0FBH \ movx @dptr, a
mov dptr, #81DEH \ mov a, #0FCH \ movx @dptr, a
mov dptr, #81E7H \ mov a, #0FCH \ movx @dptr, a
mov dptr, #81EBH \ mov a, #0FCH \ movx @dptr, a
mov dptr, #81EDH \ mov a, #0FCH \ movx @dptr, a
mov dptr, #81EEH \ mov a, #0FCH \ movx @dptr, a
ret
; --- PROGRAM GŁÓWNY ---
start:
acall keymuz
init_LCD ; Inicjalizacja LCD za pomocą Twojego makra
mov TMOD, #01H ; Konfiguracja timera
mov IE, #82H ; Przerwania włącz
mov R3, #0 ; Domyślne przesunięcie interwału = 0 (brak transpozycji)
graj:
mov R4, #00H ; Wyczyszczenie rejestru poprzedniego klawisza
clr TR0 ; Wyłączenie dźwięku, gdy żaden klawisz klawiatury nie jest wciśnięty
pętla_główna:
; Sprawdzanie przycisków zmiany brzmienia na porcie P3
jb P3.3, spr_p34
mov R3, #0 ; Klawisz P3.3 wciśnięty -> oryginalne brzmienie (+0 półtonów)
sjmp key_1
spr_p34:
jb P3.4, spr_p35
mov R3, #4 ; Klawisz P3.4 wciśnięty -> przesunięcie o tercję (+4 półtony)
sjmp key_1
spr_p35:
jb P3.5, spr_p36
mov R3, #7 ; Klawisz P3.5 wciśnięty -> przesunięcie o kwintę (+7 półtonów)
sjmp key_1
spr_p36:
jb P3.6, key_1
mov R3, #12 ; Klawisz P3.6 wciśnięty -> przesunięcie o oktawę (+12 półtonów)
; --- SEKCJA SKANOWANIA KLAWIATURY MATRYCOWEJ ---
key_1:
mov r0, #LINE_1 \ mov a, r0 \ mov P5, a \ mov a, P7 \ anl a, r0 \ mov r2, a
clr c \ subb a, r0
jz key_2
acall ZAGRAJ_Z_TRANSP
jmp key_1
key_2:
mov r0, #LINE_2 \ mov a, r0 \ mov P5, a \ mov a, P7 \ anl a, r0 \ mov r2, a
clr c \ subb a, r0
jz key_3
acall ZAGRAJ_Z_TRANSP
jmp key_2
key_3:
mov r0, #LINE_3 \ mov a, r0 \ mov P5, a \ mov a, P7 \ anl a, r0 \ mov r2, a
clr c \ subb a, r0
jz key_4
acall ZAGRAJ_Z_TRANSP
jmp key_3
key_4:
mov r0, #LINE_4 \ mov a, r0 \ mov P5, a \ mov a, P7 \ anl a, r0 \ mov r2, a
clr c \ subb a, r0
jz dalej
acall ZAGRAJ_Z_TRANSP
jmp key_4
dalej:
jmp graj
; --- TABELA MAPOWANIA ZWROTNEGO: INDEKS (0-15) -> KOD SKANINGOWY ---
SCAN_CODES:
db 77H, 7BH, 7DH, 7EH
db B7H, BBH, BDH, BEH
db D7H, DBH, DDH, DEH
db E7H, EBH, EDH, EEH
; --- TABELA NAZW NUT (PO 5 BAJTÓW NA WPIS) ---
NOTE_NAMES:
db "C1 ",00
db "CIS1",00
db "D1 ",00
db "DIS1",00
db "E1 ",00
db "F1 ",00
db "FIS1",00
db "G1 ",00
db "GIS1",00
db "A1 ",00
db "B1 ",00
db "H1 ",00
db "C2 ",00
db "CIS2",00
db "D2 ",00
db "DIS2",00
end start