please dont rip this site


Name: Mr. Ken Mathis
Company: ASC
Web Site:

;Date:June 16, 2004
;Programmer:Ken Mathis
;Purpose of this program is to control several seven segment displays using the MAX7219
;seven segment display driver IC. The seven segment displays are multiplexed with the
;7219 and are commone cathode type displays.

;This test code controls only 3 seven segment displays. The code can easily be expanded
;for the max7219 to control up to 8 seven segment displays while consuming only 3 SX
;output pins
;Where appropriate, explanations are provided to account for more than 3 seven segment displays

;This configuration uses the SX internal oscillator as the timimg for shifting data
;out is not critical
;-----[Assembler directives]---------------------------------------
ifdef __SASM
 FREQ 4_000_000

;-----[Define variables and constants]------------------------------
org $07  ;$07 is first free variable space
Decode ds 2 ;assign 2 bytes of space for Decode - 7 & 8
ShtDn ds 2 ;assign 2 bytes of space for Shutdown - 9 & A
ScnLmt ds 2 ;assign 2 bytes of space for Scan Limit - B & C
Inten ds 2 ;assign 2 bytes of space for Intensity - D & E
bitcnt ds 1 ;assign 1 byte of space for bit counter - F

;dig0, dig1, & dig2 represent three 7 segment displays with a common cathode and
;dig0 is the least significant display
dig0 ds 2 ;assign 2 bytes of space for Digit 0 - 10 & 11
dig1 ds 2 ;assign 2 bytes of space for Digit 1 - 12 & 13
dig2 ds 2 ;assign 2 bytes of space for Digit 2 - 14 & 15
;To display more digits variable manes MUST be added here sequentially
;after dig2 for the code to properly work.

; !!! IF 8 SEVEN SEGMENT DISPLAYS ARE USED, there will be no more room
;for the word counter (wrdcnt) in bank one. To avoid switching banks in
;this circumstance, the upper or lower byte of any of the initialization
;words (Decode, ShtDn, ScnLmt, or Inten) can be reused/reloaded with
;the appropriate value after the initialization if finished. A comment
;will be shown where to reload Decode if needed

wrdcnt ds 1 ;assign 1 byte of space for word counter - 16

;----[Define symbolic pin names]---------------------------------------

data EQU rb.1 ;data pin connects to pin 1 of 7219
clock EQU rb.2 ;clock pin connects to 13 of 7219
load EQU rb.3 ;load pin connects to 12 of 7219

;-----[calls should be placed on first page between org $000 and org $100]--
org $000

;5uS delay - generated using the delay code generator at
 jmp $+1
 jmp $+1
 jmp $+1
 jmp $+1

;sub to shift out msbit of each byte into carry
 rl ind ;move msbit into carry
 jc high ;if carry is high jump to high
 clrb data ;if carry is low ensure data pin is low
 jmp $+2 ;jump 2 lines
 setb data ;make data pin high
 nop  ;no operation

;clock pulse generation to shift data out of SX into max 7219
 call del_5uS ;5 uS set-up time
 setb clock ;make clock (rb.2) high
 call del_5uS ;5 uS hold time
 clrb clock ;make clock low
 ret  ;return

;-----[MAIN PROGRAM]------------------------------------------------------------
org $100

Start   ;reset point 

;-------[I/O port setting]------------------------------------------------------
 mode $0f ;set mode for port direction
 mov w,#$0
 mov !ra,w ; all ra ports output
 mov w,#$00
 mov !rb,w ;all rb ports output

;-------[prepare variables for initialization of max7219]-----------------------
;mov w,#$XX loads the w register with hex value
;mov NAME,w loads value of w into variable name
;Later in this program the initiazation is explained in detail
 mov w,#$09
 mov Decode,w
 mov Inten+1,w
 mov w,#$0f
 mov Decode+1,w
 mov w,#$10
 mov bitcnt,w
 mov w,#$0c
 mov shtdn,w
 mov w,#$01
 mov shtdn+1,w
 mov dig0,w
 mov w,#$0b
 mov scnlmt,w
 mov w,#$02
 mov scnlmt+1,w
 mov dig1,w
 mov w,#$0a
 mov inten,w
 mov w,#$03
 mov dig2,w
 mov w,#$04
 mov wrdcnt,w

;point to first register that will hold data to shift out which
;is Decode at address $07. NOTE that this is a SX18 and does not have an RC
 mov w,#$07 
 mov fsr,w

;-------[The program currently causes display to load 4 to each digit. To test a
;different value, change four to any digit 0 to 9. Your actual program will load
;dig0+1, dig1+1 and dig2+1 with some dynamic data.
 mov w,#$04
 mov dig0+1,w
 mov dig1+1,w
 mov dig2+1,w

;------[MAX7219 Operation]----------------------------------------------------
;The 7219 must first be initialized. Initialization is done by sending serial
;data to the IC. Four 16 bit values sent will complete the initialization.

;To send a 16 bit value load is brought LOW, then each of 16 bits (msb 1st) is
;clocked into the IC, and load is then brought HIGH to complete the shifting
;of 16 bits into the device

;For each word sent to the IC, the most significant byte is the address and the
;lower byte sets the option for each particular function.
;For the descriptions that follow values will be shown as $Xx. The upper case x
;represents the upper nibble and the value is "don't care"

;DECODE MODE - Address $X9
;Options $X0 = No decoding
;  $X1 = Decode digit 0 (BCD)
;  $XF = Decode digits 0-3
;  $FF = Decode digits 0-7
;Sending $090F sets decode mode to enable digits 0-3 and unstucts that the least
;sig nibble is BCD

;Options $X0 = Shutdown
;  $X1 = Normal Operation
;Sending $0C01 sets the IC for normal operation

;SCANLIMIT - Address $XB
;Options $Xx where the least significant nibble sets the number of digits
;  to enable. digit 0, x = 0. digits 0 & 1 x = 1. digits 0, 1, & 2 x = 2
;Sending $0B02 enbables digts 0, 1 & 2
;Sending $0B07 enables all 8 digits

;INTENSITY - Address $XA
;Options $00 = minimum intensity
;  $FF = maximum intensity
;  See MAX7219 data sheet for resistor selection and current

;----[set up SX controll pins]--------------------------------------------------------
 clrb data  ;make data pin low
 clrb clock  ;make clock pin low
 setb load  ;make load pin high
 call del_5uS  ;wait 5 uS

;----[Start of routine to send out first 16 bits]-------------------------------------
 clrb load  ;enable 7219 to start accepting serial data.
 call rotate  ;call routine to move msbit into carry and set data pin
    ;high or low depending on state of bit carried out
 call shiftout ;call routine to shift data bit to 7219
 dec bitcnt  ;decrement bit counter
 cjne bitcnt,#8,j2 ;check if 8 bits have been sent out
 inc fsr  ;if 8 bits were sent, increment fsr to point to next
 jmp $-8  ;move back up to call rotate
 cja bitcnt,#0,j1 ;check of bit counter is at zero (16 bits shifted out?)
 setb load  ;if 16 bits shifted out, load them into the 7219
 dec wrdcnt  ;check if the 4 initialization words shifted out
 cja wrdcnt,#0,j3 ;if word counter is above 0, jump to j3
 jmp $+5  ;if the 4 initialization words shifted out jump down 5 lines
 mov w,#$10  ;reload bit counter with 16
 mov bitcnt,w ;reload bit counter with 16
 inc fsr  ;increment fsr to point to the next register
 jmp $-$18  ;jump up to the "clrb load" instruction to start another
    ;sequence of shifting out 16 more bits

;-----[shift actual data into max7219]---------
;Data is sent to the 7219 in the same manner as the initialization described above.
;load is brought LOW, 16 bits clocked into device and load is brought HIGH to complete
;the loading of one digit.

;For each digit, the upper byte of 16 bits is the address of the digit and the lower
;byte is the value sent to the 7 segment. This value is either BCD or the "word" to control
;each of the 8 segments (decimal point). Remember that DECODE MODE determines how to
;use the lower byte

;For digit 0 the address is $01
; digit 1 the address is $02
; digit 2 the address is $03

;If decode mode was selected sending the 16 bit value of $0207 will tell the IC that
;digit number 1 gets a value of 7

 mov w,#$10
 mov fsr,w  ;point to first address of digit 0 holding the most sig byte
 mov bitcnt,w ;load the bit counter with 16

;If using 8 seven segment displays as decribed above, comment out the next two lines
 mov w,#$03  ;since three digits are used in this example, wrdcnt is loaded w/3
 mov wrdcnt,w
;Use these next two lines if 8 seven segments are used.
; mov w,#$08
; mov Decode,w

;----[Start of routine to send out first 16 bits of TEST data]-------------------------------------
;The rest of this code is exactly the same as the initialization code, so no comments added here.
;see initialzation above for comments.
 clrb load  
 call rotate
 call shiftout
 dec bitcnt
 cjne bitcnt,#8,j5
 inc fsr
 jmp $-8
 cja bitcnt,#0,j4
 setb load
;If using 8 seven segment displays as decribed above, comment out the next two lines
 dec wrdcnt
 cja wrdcnt,#0,j6

;Use these next two lines
; dec Decode
; cja Decode,#0,j6

 jmp $+5
 mov w,#$10
 mov bitcnt,w
 inc fsr
 jmp $-$18

 setb load


file: /Techref/member/KM-AAA-31/index.htm, 16KB, , updated: 2005/4/28 12:53, local time: 2023/9/29 06:10, owner: KM-AAA-31,

 ©2023 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions?
Please DO link to this page! Digg it! / MAKE!

<A HREF=""> Member Homepage for KM-AAA-31</A>

After you find an appropriate page, you are invited to your to this massmind site! (posts will be visible only to you before review) Just type a nice message (short messages are blocked as spam) in the box and press the Post button. (HTML welcomed, but not the <A tag: Instead, use the link box to link to another page. A tutorial is available Members can login to post directly, become page editors, and be credited for their posts.

Link? Put it here: 
if you want a response, please enter your email address: 
Attn spammers: All posts are reviewed before being made visible to anyone other than the poster.
Did you find what you needed?