T1_H EQU 0DCh
T1_L EQU 000h
INIT: MOV SP,#STACK-1 ; zaladowanie wskaznika stosu
MEM: MOV R0,#127
MEM1: MOV @R0,#0
DJNZ R0,MEM1
MOV IE,#0 ; wylacz uklad przerwan
MOV IE,#10001010B ; wlacz uklad przerwan i przerwanie T0 i T1
MOV TMOD,#00010001B ; T0 w trybie 1, T1 w trybie 1
MOV TH0,#T0_H ; zaladowanie wartosci
MOV TL0,#T0_L ; pocz dla licznika
MOV TH1,#T1_H
MOV TL1,#T1_L
SETB TR0 ; uruchomienie licznika T0
CLR TR1 ; zatrzymanie T1
MOV REFRESH,#0
LCALL LCD_INIT
MOV R0,#(SEK+1)
CLR END_F
T0_SERV: PUSH ACC ;obsluga przerwania zegarowego
PUSH B
PUSH PSW
MOV TH0,#T0_H
MOV A,KEYS
MOV C,ACC.0
JNC ZEROW
MOV C,ACC.1
JNC SKOK
SETB SETT_F
CLR TR0
SETB TR1
JMP OUT
SKOK: LJMP OBSLUG
ZEROW: MOV C,ACC.1
JNC OBSLUG
JB NORM_F,UST
CLR END_F
LCALL KASOWANIE
AJMP GO_KEY
UST: CLR END_F
LCALL USTAWIANIE
OBSLUG: JNB NORM_F,OB_1
LCALL NOR
LCALL WIN_N
OB_1: JNB PRZEW_F,GO_KEY
LCALL PRZ_CZ
LCALL WIN_P
GO_KEY: LCALL GET_KEY
OUT: POP PSW
INC REFRESH
MOV A,REFRESH
CJNE A,#33,OUD
MOV REFRESH,#0
SETB F0
OUD: POP B
POP ACC
RETI
Tu masz fragmenty programu (konfiguracja proca i obsługa przerwania. Pochodzą z działającego programu (urządzenie działa dobrze).
PS. Zapomniałem, przerwanie jest co 10ms.