' LED_7SEG.Bas (PICAXE-18X)
'
' Sequentially displays a three digit value on a single 7-segment LED using
' a 74HC595 shift register with a decimal point between the second and third digits.
' Thus, the quantity 728 is displayed as 7 followed by 2 followed by .8

'
'  PICAXE			                74HC595 (16-pin DIP)
'
'  Output 2 (term 8) ----------------- Latch (term 12)
'  Output 1 (term 7) ----------------- Clk (term 11)
'  Output 0 (term 6) ----------------- Dat (term 14)
'
' On 74HC595;
'
'   +5 VDC  on Vcc (term 16)
'   GRD on GRD (term 8)
'
'   GRD on OE (term 13)
'   +5 VDC on RESET (term 10)
'
' Connect common anode LED such that DP is connected to QH (term 7), segment g to QG (term 6),
' etc.  Be sure to limit currect in any LED segment to 10 mA max.  Usually, a series 330 Ohm
' resistor.
'
' Use a common anode LED display such as Jameco Part #24740.  This LED has a left hand decimal point.
'
' Might be used with a Dallas DS18B20 or an LM34DZ temperature sesnor to sequentially display a
' temperature.
'
' Uses 130 bytes of 2048.
'
' copyright, Charise Byers, Peter H Anderson, Baltimore, MD, April, '04

Symbol SCK = 0
Symbol DAT =  1
Symbol LATCH = 2

Symbol Val = W0	' variables used in main

Symbol Digit = B2	' variables used in DisplayVal
Symbol DecPoint = B3

Symbol Patt = B4
Symbol N = B5

 	Low Latch
	Low SCK
	Low DAT

Top:
	Val = 728	' this may the result of a temperature measurement
    GoSub DisplayVal
	Pause 5000
    Goto Top:

DisplayVal:		' displays value in the form of xxx as xx.x sequntially on 7-seg LED

	Digit= Val/100	' strip off the hundreds
    DecPoint = 0
	Gosub DisplayDigit
    Pause 1000

	Val = Val % 100	' obtain remainder
	Digit = Val/10	' tens
    DecPoint = 0
	Gosub DisplayDigit
	Pause 1000

	Val = Val % 10	' units
	Digit = Val
	DecPoint = 1	' display a dec point
	Gosub DisplayDigit
    Pause 1000
    Return

DisplayDigit:
                    ' 0  1   2   3   4   5   6   7   8   9
      Lookup Digit,($C0,$F9,$A4,$B0,$99,$92,$83,$F8,$80,$90), Patt
       					'lights decimal
      If DecPoint = 0 Then DisplayDigit_1	' no decimal point
      Patt = Patt & $7f	' insert a zero in the most sig bit to light dec point
DisplayDigit_1:
	  GoSub Shift
      Return

Shift:
     For N= 1 to 8
        ' set Dat output to value of most sig bit
	  If Patt >= 128 then Shift_1	' most sig bit
	  Low DAT
	  Goto Shift_2

Shift_1:
	  High DAT
	  Goto Shift_2

Shift_2:
	  High SCK		' clock pulse
 	  Low SCK
	  Patt = Patt * 2	' next bit in most sig bit position

     Next N

     High Latch		' transfer shift register to latch
     Low Latch
     Return