; EXPERIMENTAL ; 2 DIGIT 7 SEGMENT LED DRIVER (COMMON CATHODE) ; DATA SUPPLIED BY 8 BIT DATA BUSS ON RB ifdef __SASM DEVICE SX28L, OSCHS3, STACKX, OPTIONX IRC_CAL IRC_FAST FREQ 4_000_000 else DEVICE SX28AC, OSCHS, OPTIONX endif DEVICE TURBO RESET Start TRIS equ $0f PLP equ $0e WKEN equ $0b WKPND_W equ $09 org $08 Buss ds 1 LocalTemp0 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 ;------------------------------------------------ ; ISR TO UPDATE Data with Buss Status ;------------------------------------------------ org $000 mov LocalTemp0, m mode WKPND_W clr w mov Buss, rb mov !rb, #%00000000 mov m, LocalTemp0 reti ;------------------------------------------------ ; MAIN PROGRAM ;------------------------------------------------ org $100 Start clr fsr clr digits call ClearData ; SET UP LED OUTPUTS mov !ra, #%1100 ; Outputs for Cathodes (Columns) mov !rc, #%00000000 ; Outputs for Anodes (Segments) ; SET UP THE INPUT BUSS (RB) FOR ASYNCHRONOUS INTERUPTS clr Buss mode PLP mov !rb, #%00000000 mode WKPND_W clr w mov !rb, w mode WKEN mov !rb, #%00000000 ; MAIN CODE DRIVES 2 7-SEGMENT HEX DISPLAYS Loop mov digits, Buss ;PRETTY MUCH IDENTICAL mov digits+1, Buss ;TO THE MACRO USED IN swap digits+1 ;PROGRAMMING THE SX MICRO mov counter, #3 ; Number of Columns + 1 mov columns, #%0001 ; 1st COLUMN mov w, digits ; SET 1st DIGIT and w, #%00001111 ; DOESN'T ALLOW VALUES > 15 call Decode ; mov digit, w ; :Loop ; INNER LOOP DRIVES THE LEDS dec counter snz jmp Loop mov ra, columns mov rc, digit rl columns ; NEXT COLUMN mov w, digits+1 ; SET 2nd DIGIT and w, #%00001111 ; DOESN'T ALLOW VALUES > 15 call Decode ; mov digit, w ; jmp :Loop