Timer.A51
; This module services the real time interrupt
;
; Get a Real Time interrupt every One millisecond (using SOF interrupt)
;
; Strobe the Reader Board columns every 25msec so that no flicker is evident
; The circuitry is shown in Figure 6-22 except that Port C is used not Port B
; Pin assignment of Port C is:
; Bit 0 = Clock
; Bit 1 = Data
; Bit 2 = Reset
; Bit 3 = DIR/OE (0 = Write LEDs, 1 = Read Buttons)
ServiceTimerRoutine:
	DJNZ	Msec_counter, Done	; Only need to react every 25msec
	MOV	Msec_counter, #25	; Reinitialize

SetupPointers:
	MOV	R0, #Low(PortC_OUT)	; Will strobe the hardware here
	MOV	R1, #Low(PortA_OUT)	; Will output data to here
        MOV	R2, #0001		; PortC, Code for Clock Hi

	MOV	A, DisplayPosition	; Which column are we currently displaying
	CJNE	A, #39, NextColumn
ReadButtons:				; Before each full scan
	MOV	DPTR, #PortA_OE		; Need to flip Port A
	CLR	A
	MOVX	@DPTR, A 		; Setup Port A for INPUT
	MOV	A, #01100b		; Set DIR and Reset = 1
	MOVX	@R0, A			; Enable hardware to input
	MOV	R1, #Low(PortA_Pins)
	MOVX	A, @R1			; Get Port A data and save for a later Report
        MOV	ButtonsValue, A		; 
	MOV	R1, #Low(PortA_OUT)
	MOV	A, #0010H		; Set DIR and Reset = 0 and Data = 1
	MOVX	@R0, A
	MOV	A, #0FFH
	MOVX	@DPTR, A		; Setup Port A for OUTPUT
	MOV	R2, #0011		; PortC, Code for Data and Clock = 1
	MOV	DisplayPosition, #-1	; Allow for later INC
NextColumn:
	CLR	A			; First clear display to prevent ghosting
	MOVX	@R1, A			; Write to Port A
	MOV	A, R2			; = 00x1, x = Data = 1 on Column 0, else 0
	MOVX	@R0, A			; Set clock HI to select next column
	CLR	A			; Set Data and Clock Low
	MOVX	@R0, A			; Complete strobe of hardware
	INC	DisplayPosition		; Point to next row of dots
	MOV	A, DisplayPosition
	ADD	A, #LEDBuffer		; Index into LED Buffer
	MOV	R0, A
	MOV	A, @R0			; Get the next row of dots
	MOVX	@R1, A			; Update the display
Done:	Ret