; EXPERIMENTAL ; 2 DIGIT 7 SEGMENT LED DRIVER (COMMON CATHODE) ifdef __SASM DEVICE SX28L, OSCHS3, STACKX, OPTIONX IRC_CAL IRC_FAST FREQ 50_000_000 else DEVICE SX28AC, OSCHS, OPTIONX endif DEVICE TURBO RESET Start org $08 value ds 1 columns ds 1 counter ds 1 digit ds 1 digits ds 2 ;------------------------------------------------------------------- ; SUBROUTINE TO CLEAR MEMORY REGISTERS ;------------------------------------------------------------------- ClearData sb fsr.4 Setb fsr.3 clr ind ijnz fsr, ClearData ret ;------------------------------------------------------------------- ; SUBROUTINE RETURNS 7-SEGMENT CODING IN W ; WHEN CALLED WITH A HEXIDECIMAL DIGIT IN W ; ; NOTE: POSITIVE LOGIC - 1-BITS TURN ON THE ASSOCIATED LED ;------------------------------------------------------------------- Decode jmp pc+w ; SEGMENTS ; ; DCGBE.FA retw %11011011 ;0 retw %01010000 ;1 retw %10111001 ;2 retw %11110001 ;3 retw %01110010 ;4 retw %11100011 ;5 retw %11101011 ;6 retw %01010001 ;7 retw %11111011 ;8 retw %11110011 ;9 retw %01111011 ;A retw %11101010 ;b retw %10001011 ;C retw %11111000 ;d retw %10101011 ;E retw %00101011 ;F ;------------------------------------------------ ; MAIN PROGRAM ;------------------------------------------------ org $100 Start clr fsr call ClearData mov !ra, #%1100 ; Outputs for Cathodes (Columns) mov !rc, #%00000000 ; Outputs for Anodes (Segments) Loop mov digits, #$8 mov digits+1, #$A mov counter, #3 ; Number of 7-Seg Displays (+ 1) mov columns, #%0001 ; 1st Column mov w, digits ; SET 1st DIGIT call Decode ; mov digit, w ; :Loop dec counter snz jmp Loop ; JUMP TO OUTER LOOP mov ra, columns mov rc, digit rl columns ; Next Column mov w, digits+1 ; SET 2nd DIGIT call Decode ; mov digit, w ; jmp :Loop ; JUMP TO INNER LOOP