;Programváz, általános kiindulás .include "C8051F020.inc" .area RSEG(DATA) ;Adat szegmens (RAM) byte definiálás THREL0= 0xB7 ;Timer HIGH, 8 bit (nem kötelező), változó TLREL0= 0xFF ;Timer LOW, 8 bit (nem kötelező), változó THREL1= 0xB7 ;Timer HIGH, 8 bit (nem kötelező), változó TLREL1= 0xFF ;Timer LOW, 8 bit (nem kötelező), változó .area BIT(DATA) ;Adat szegmens (RAM) bit definiálás .area CSEG(CODE) ;Kód szegmens (ROM) .area HOME(CODE) ajmp start ;A startra ugrunk, a ROM 0x30-as bájtra .area CODE(ABS) .org 0x3 ;A következo utasítások a ROM 0x3-as bájttól kezdodoen íródnak ;mivel ide fog ugrani az INT0 megszakítás acall int0_do reti .area CODE(ABS) .org 0xB ;A következo utasítások a ROM 0xB bájttól kezdodoen íródnak ;mivel ide fog ugrani a Timer0 megszakítás acall timer0_do reti .area CODE(ABS) .org 0x13 ;A következo utasítások a ROM 0x13-as bájttól kezdodoen íródnak ;mivel ide fog ugrani az INT1 megszakítás acall int1_do reti .area CODE(ABS) .org 0x1B ;A következo utasítások a ROM 0x1B bájttól kezdodoen íródnak ;mivel ide fog ugrani a Timer1 megszakítás acall timer1_do reti .area CODE(ABS) .org 0x30 ;A következo utasítások a ROM 0x30-as bájttól kezdodoen íródnak, ;mivel ide már biztos nem fog ugrani általunk megírt megszakítás start: acall init acall clock_init acall timer0_init acall timer1_init acall xbr_init loop: sjmp loop ;Végtelen ciklus! A program legfontosabb része, ;Mindegyik Timer megszakítás innen lép ki, és ide lép vissza! timer0_do: ;Az időzítés lejárta utáni műveletek elvégzése ret timer1_do: ;Az időzítés lejárta utáni műveletek elvégzése ret int0_do: ;External Interrupt 0 feladata ret int1_do: ;External Interrupt 1 feladata ret init: mov WDTCN,#0xDE ;WatchDog kikapcs mov WDTCN,#0xAD ;WatchDog kikapcs mov P74OUT,#0x08 ;Vagy #0b00001000 vagy #0d8 vagy #8 ;P5 port fölso 4 bit (LEDek) PushPull a többi minden OpenDrain mov P4,#0xFF ;Gombok 1 értékuek alapállapotban mov P5,#0x0F ;LED-ek sötétek, gombok 1 értékuek alapállapotban mov P0MDOUT,#0 ;P0 minden lába OpenDrain mov P0,#0xFF ;P0 minden lába logiaki 1 (van rajtuk feszülség), P0 ismert az eszköz által mov P1MDOUT,#0 ;P1 minden lába OpenDrain mov P1,#0xFF ;P1 minden lába logiaki 1 (van rajtuk feszülség), P1 ismert az eszköz által mov P2MDOUT,#0 ;P2 minden lába OpenDrain mov P2,#0xFF ;P2 minden lába logiaki 1 (van rajtuk feszülség), P2 ismert az eszköz által ret clock_init: mov OSCXCN,#0x67 ;Külso oszcillátor beállítása mov R0,#3 ;Késleltetés 3×256 muveletig (~1ms) delay1: clr A delay0: djnz ACC,delay0 djnz R0,delay1 wait: mov A,OSCXCN ;Várakozás a külso órajelre jnb ACC.7,wait ;Az ACC.7 utasítás csak ilyen formában működik!!! Más regiszterekre (1 byte) ez nem működik! mov OSCICN,#0x0B ;Belso órajel kikapcs, helyette külso oszcillátor használata ret timer0_init: ;Timer0 idozítore vonatkozó beállítások szubrutinja ret timer1_init: ;Timer1 idozítore vonatkozó beállítások szubrutinja ret xbr_init: ret