
        .equ    OUTPIN,P2.1
        .equ    basecount,021h

          .org  0000h
          SJMP  MAIN

          .org  000bh           ;Use timer0
          LJMP  TIMER_ROUT

          .org  0070h

MAIN:     MOV   SP,#050H

          MOV   TMOD,#01H       ;initialise timer 0 in 16 bit mode

          mov   IP,#02h         ;give priority to timer0

          mov   TH0,#0ech       ;5ms timer count loaded
          mov   TL0,#078h       ;for 12 Mhz crystal

          ;The formula for deciding count is like
          ;(65535 - 5000) = 60535 here 5000 count for 5ms timer
          ;if you want to generate 1 ms timer then your formula should be
          ;(65525 - 1000) = 64535 and so on.
          ;So here we get count for 5ms timer = 60535D = EC78H =TH0TL0

          setb  TR0             ;turns on timer0
main1:
          MOV   IE,#082H        ;1000 0010 Enables timer0 interrupt

          sjmp  main1

TIMER_ROUT:

;After Every 5ms time the timer interrupt jumps here

          mov   TH0,#0ech       ;Reload timer count
          mov   TL0,#078h

          inc   basecount
          mov   a,basecount
          cjne  a,#50,skipchangestatus  

          cpl   OUTPIN          ;after every 50 * 5 = 250 ms compliment the OutputPin status
                                ;So you get 2 low 2 high output status in 1 sec i.e 2 Hz freq.
          mov   basecount,#0    ;reset the base count

skipchangestatus:
          reti                  ;return from timer interrupt

