; 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