Chciałbym jeszcze zrobić aby po wprowadzeniu prawidłowego kodu włączał się buzzer. Proszę o pomoc w zrealizowaniu tego i sprawdzeniu kodu żródłowego.Przy skompilowaniu przez program edsim51 wywala mi błąd w linii TIM0 EQU T0_M+T0_C*4+T0_G*8
Kod: Zaznacz cały
T0_G EQU 0
T0_C EQU 0
T0_M EQU 1
TIM0 EQU T0_M+T0_C*4+T0_G*8
T1_G EQU 0
T1_C EQU 0
T1_M EQU 1
TIM1 EQU T1_M+T1_C*4+T1_G*8
TMOD_SET EQU TIM0+TIM1*16
TH0_SET EQU 0
TL0_SET EQU 0
TH1_SET EQU 0
TL1_SET EQU 0
row1 EQU P3.3
row2 EQU P3.4
row3 EQU P3.5
row4 EQU P3.7
col1 EQU P3.0
col2 EQU P3.1
col3 EQU P3.2
SDA EQU P1.4
SCL EQU P1.5
PRG EQU PSW.1
LJMP START
ORG 0BH
LJMP TIMER0
ORG 40H
MOV SP,#19H
TIMER0: ;CZEKAJ OK 18S
MOV TH0,#TH0_SET
DJNZ B,NO_1
MOV B,#0
LCALL KON2
NO_1:
RETI
PROG:
CLR P1.2
SETB PRG
AJMP START1
START: ;INICJALIZACJA ZAMKA
MOV P1,#11111111B ;ZAPISZ USTAWIENIA POCZATKOWE
MOV TH0,#TH0_SET
MOV TMOD,#TMOD_SET
MOV R2,#20
MOV R3,#20
MOV R4,#20
MOV R5,#20
MOV R6,#20
MOV R7,#20
MOV B,#0
MOV A,#0
CLR F0 ;ZERUJ FLAGE WPROWADZANIA KODU
CLR PRG ;ZERUJ FLAGE PROGRAMOWANIA
SETB EA ;WLACZ PRZERWANIA
SETB ET0 ;WLACZ PRZERWANIE OD TIMERA0
CLR P1.2 ;ZAPAL DIODE
ACALL I2C_START ;SPRAWDZ CZY ZAPROGRAMOWANY EEPROM
MOV A,#168 ;JESLI POD ADRESEM 0 JEST 184 TZN
ACALL I2C_WRITE ;ZE JEST ZAPROGRAMOWANY
MOV A,#0 ;JESLI NIE, TO PRZEJDZ DO TRYBU
ACALL I2C_WRITE ;PROGRAMOWANIA NOWEGO KODU
ACALL I2C_START
MOV A,#169
ACALL I2C_WRITE
SETB C
ACALL I2C_READ
ACALL I2C_STOP
CJNE A,#184,PROG
ACALL I2C_START
MOV A,#168
ACALL I2C_WRITE
MOV A,#1
ACALL I2C_WRITE
ACALL I2C_START
MOV A,#169
ACALL I2C_WRITE
SETB C
ACALL I2C_READ
ACALL I2C_STOP
MOV 10H,A ;UMIESC KOD KLAWISZA Z PAMIECI EEPROM W PAMIECI
;RAM
ACALL I2C_START
MOV A,#168
ACALL I2C_WRITE
MOV A,#2
ACALL I2C_WRITE
ACALL I2C_START
MOV A,#169
ACALL I2C_WRITE
SETB C
ACALL I2C_READ
ACALL I2C_STOP
MOV 11H,A ;UMIESC KOD KLAWISZA Z PAMIECI EEPROM W PAMIECI
;RAM
ACALL I2C_START
MOV A,#168
ACALL I2C_WRITE
MOV A,#3
ACALL I2C_WRITE
ACALL I2C_START
MOV A,#169
ACALL I2C_WRITE
SETB C
ACALL I2C_READ
ACALL I2C_STOP
MOV 12H,A ;ITD...
ACALL I2C_START
MOV A,#168
ACALL I2C_WRITE
MOV A,#4
ACALL I2C_WRITE
ACALL I2C_START
MOV A,#169
ACALL I2C_WRITE
SETB C
ACALL I2C_READ
ACALL I2C_STOP
MOV 13H,A
ACALL I2C_START
MOV A,#168
ACALL I2C_WRITE
MOV A,#5
ACALL I2C_WRITE
ACALL I2C_START
MOV A,#169
ACALL I2C_WRITE
SETB C
ACALL I2C_READ
ACALL I2C_STOP
MOV 14H,A
ACALL I2C_START
MOV A,#168
ACALL I2C_WRITE
MOV A,#6
ACALL I2C_WRITE
ACALL I2C_START
MOV A,#169
ACALL I2C_WRITE
SETB C
ACALL I2C_READ
ACALL I2C_STOP
MOV 15H,A
SETB P1.2 ;ZGAS DIODE
START1:
ACALL GETKBD ;CZEKAJ NA KLAWISZ
JZ START1
ACALL CHECK ;JESLI COS WCISNIETO, SPRAWDZ
SJMP START1
D333:
AJMP D33
GETKBD: ;PROCEDURA ODCZYTUJACA KLAWIATURE MATRYCOWA
MOV P3,#0FFH ;KODY KLAWISZY:
MOV A, #0 ;1: 1
;2: 2
CLR row1 ;3: 3
JB col1, D1 ;4: 4
MOV A,#1 ;5: 5
ACALL DELAY ;6: 6
D50: ;7: 7
JB col1,D333 ;8: 8
SJMP D50 ;9: 9
D1: ;0: 12
JB col2, D2 ;ENTER: 10
MOV A,#2 ;#: 11
ACALL DELAY
D51:
JB col2,D333
SJMP D51
D2:
JB col3, D3
MOV A,#3
ACALL DELAY
D52:
JB col3,D333
SJMP D52
D3:
SETB row1
CLR row2
JB col1, D11
MOV A,#4
ACALL DELAY
D4:
JB col1,D33
SJMP D4
D11:
JB col2, D21
MOV A,#5
ACALL DELAY
D41:
JB col2,D33
SJMP D41
D21:
JB col3, D31
MOV A,#6
ACALL DELAY
D42:
JB col3,D33
SJMP D42
D31:
SETB row2
CLR row3
JB col1, D12
MOV A,#7
ACALL DELAY
D43:
JB col1,D33
SJMP D43
D12:
JB col2, D22
MOV A,#8
ACALL DELAY
D44:
JB col2,D33
SJMP D44
D22:
JB col3, D32
MOV A,#9
ACALL DELAY
D45:
JB col3,D33
SJMP D45
D32:
SETB row3
CLR row4
JB col1, D13
MOV A,#10
ACALL DELAY
D46:
JB col1,D33
SJMP D46
D13:
JB col2, D23
MOV A,#12
ACALL DELAY
D47:
JB col2,D33
SJMP D47
D23:
JB col3, D33
MOV A,#11
ACALL DELAY
D48:
JB col3,D33
SJMP D48
D33:
SETB row4
SETB row3
SETB row2
SETB row1
ACALL DELAY
RET
DELAY: ;OPOZNIENIE
MOV R0,#0
MOV R1,#80
L1:
INC R0
CJNE R0,#0,L1
L2:
INC R1
CJNE R1,#0,L1
RET
CHECK: ;PROCEDURA SPRAWDZAJACA NACISKANE KLAWISZE
JNB P1.7,GAS ;JESLI OTWARTE SKOCZ DO GAS
CJNE A,#11,C1 ;JESLI # TZN POCZATEK PODAWANIA KODU
SETB F0 ;USTAW FLAGE
SETB TR0 ;WLACZ TIMER
SJMP KON1
C1:
JNB F0,KON1 ;JESLI FLAGA NIE USTAWIONA TO WYJDZ
CJNE A,#10,DALEJ7 ;CZY ENTER? JESLI TAK TO SPRAWDZ KOD
SJMP SPRAWDZ
DALEJ7:
CJNE R7,#20,KON2 ;CZY WSZYSTKIE CYFRY KODU PODANO?
CJNE R6,#20,DALEJ5
CJNE R5,#20,DALEJ4
CJNE R4,#20,DALEJ3
CJNE R3,#20,DALEJ2
CJNE R2,#20,DALEJ
MOV R2,A ;ZAPISZ W R2 PIERWSZA CYFRE
SJMP KON1
DALEJ:
MOV R3,A ;ZAPISZ W R3 DRUGA CYFRE
SJMP KON1
DALEJ2:
MOV R4,A
SJMP KON1
DALEJ3:
MOV R5,A
SJMP KON1
DALEJ4:
MOV R6,A
SJMP KON1
DALEJ5:
MOV R7,A
SJMP KON1
SPRAWDZ:
JB PRG,ZAPIS ;JESLI USTAWIONA FLAGA, TO PRZEJDZ DO ZAPISU EEPROM
MOV A,R2
CJNE A,10H,KON2 ;POROWNAJ KOD WPROWADZONY Z ZAPISANYM W ADRESACH
MOV A,R3 ;10H - 15H (WCZYTANY Z PAMIECI EEPROM)
CJNE A,11H,KON2
MOV A,R4
CJNE A,12H,KON2
MOV A,R5
CJNE A,13H,KON2
MOV A,R6
CJNE A,14H,KON2
MOV A,R7
CJNE A,15H,KON2
CLR P1.7 ;JESLI WSZYSTKIE CYFRY DOBRE TO OTWORZ
KON2:
MOV R2,#20 ;PRZYPISZ WARTOSCI POCZATKOWE REJESTROM
MOV R3,#20
MOV R4,#20
MOV R5,#20
MOV R6,#20
MOV R7,#20
MOV TH0,#TH0_SET
MOV B,#0
CLR TR0 ;WYLACZ TIMER
CLR F0 ;SKASUJ FLAGE
KON1:
RET
GAS: ;JESLI WCISNIETO 9 TO ZAMKNIJ I PRZEJDZ
CJNE A,#9,GAS1 ;DO TRYBU PROGRAMOWANIA NOWEGO KODU
SETB P1.7 ;ZAPAL DIODE
LJMP PROG
GAS1:
SETB P1.7 ;ZAMKNIJ
RET
ZAPIS: ;PROCEDURA ZAPISUJACA NOWY KOD DO PAMIECI EEPROM
CLR TR0 ;WYLACZ ZEGAR
CLR F0 ;SKASUJ FLAGE
MOV TH0,#TH0_SET
CJNE R7,#20,ZP ;SPRAWDZ CZY WPROWADZONO WSZYSTKIE CYFRY KODU
LJMP START1 ;JESLI NIE, TO WYJDZ
ZP:
CJNE R6,#20,ZP1
LJMP START1
ZP1:
CJNE R5,#20,ZP2
LJMP START1
ZP2:
CJNE R4,#20,ZP3
LJMP START1
ZP3:
CJNE R3,#20,ZP4
LJMP START1
ZP4:
CJNE R2,#20,ZP5
LJMP START1
ZP5:
ACALL I2C_START ;ZAPISZ 184 DO 0 KOMORKI (ZNAK ZE PAMIEC ZAWIERA KOD)
MOV A,#168
ACALL I2C_WRITE
MOV A,#0
ACALL I2C_WRITE
MOV A,#184
ACALL I2C_WRITE
ACALL I2C_STOP
ACALL DELAY
ACALL I2C_START ;ZAPISZ DO EEPROM PIERWSZA CYFRE KODU
MOV A,#168
ACALL I2C_WRITE
MOV A,#1
ACALL I2C_WRITE
MOV A,R2
ACALL I2C_WRITE
ACALL I2C_STOP
ACALL DELAY
ACALL I2C_START ;ZAPISZ DO EEPROM DRUGA CYFRE KODU
MOV A,#168
ACALL I2C_WRITE
MOV A,#2
ACALL I2C_WRITE
MOV A,R3
ACALL I2C_WRITE
ACALL I2C_STOP
ACALL DELAY
ACALL I2C_START ;ITD...
MOV A,#168
ACALL I2C_WRITE
MOV A,#3
ACALL I2C_WRITE
MOV A,R4
ACALL I2C_WRITE
ACALL I2C_STOP
ACALL DELAY
ACALL I2C_START
MOV A,#168
ACALL I2C_WRITE
MOV A,#4
ACALL I2C_WRITE
MOV A,R5
ACALL I2C_WRITE
ACALL I2C_STOP
ACALL DELAY
ACALL I2C_START
MOV A,#168
ACALL I2C_WRITE
MOV A,#5
ACALL I2C_WRITE
MOV A,R6
ACALL I2C_WRITE
ACALL I2C_STOP
ACALL DELAY
ACALL I2C_START
MOV A,#168
ACALL I2C_WRITE
MOV A,#6
ACALL I2C_WRITE
MOV A,R7
ACALL I2C_WRITE
ACALL I2C_STOP
ACALL DELAY
CLR PRG ;SKASUJ FLAGE PROGRAMOWANIA
SETB P1.2 ;ZGAS DIODE
AJMP START ;WYJDZ DO START (PONOWNA INICJALIZACJA)
;********** OBSLUGA I2C ************
I2C_READ: ;PROCEDURA ODCZYTU Z I2C
CLR SCL
ACALL I2C_TAKT
PUSH 04H
MOV R4,#8
I2R:
RLC A
ACALL I2C_TAKT
SETB SCL
ACALL I2C_TAKT
MOV C, SDA
ACALL I2C_TAKT
CLR SCL
DJNZ R4, I2R
RLC A
ACALL I2C_TAKT
MOV SDA,C
ACALL I2C_TAKT
SETB SCL
ACALL I2C_TAKT
CLR SCL
POP 04H
RET
I2C_WRITE: ;PROCEDURA ZAPISU DO I2C
CLR SCL
PUSH 04H
MOV R4,#8
ACALL I2C_TAKT
I2W:
RLC A
MOV SDA,C
ACALL I2C_TAKT
SETB SCL
ACALL I2C_TAKT
CLR SCL
ACALL I2C_TAKT
DJNZ R4,I2W
SETB SDA
ACALL I2C_TAKT
SETB SCL
ACALL I2C_TAKT
MOV C,SDA
ACALL I2C_TAKT
CLR SCL
ACALL I2C_TAKT
POP 04H
RET
I2C_START: ;GENERACJA SEKWENCJI START
SETB SDA
ACALL I2C_TAKT
SETB SCL
ACALL I2C_TAKT
CLR SDA
ACALL I2C_TAKT
CLR SCL
RET
I2C_STOP: ;GENERACJA SEKWENCJI STOP
CLR SDA
ACALL I2C_TAKT
SETB SCL
ACALL I2C_TAKT
SETB SDA
ACALL I2C_TAKT
RET
I2C_TAKT: ;OPOZNIENIE
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET