Examples of PBasic STAMP Programs for Lab 6

(A) multigate chip

' {$STAMP BS2}
' {$PBASIC 2.5}
' Pin assingments: P7=P1 AND P2, P8 = P3 OR P4, P9 = P5 NAND P6
'                  P0 = stop on low
' pins start as inputs by default
' commands HIGH and LOW set their pins to output mode 

DO
  IF (IN1=1 AND IN2=1) THEN HIGH 7 ELSE LOW 7
  IF (IN3=1 OR IN4=1) THEN HIGH 8 ELSE LOW 8
  IF (IN5=1 AND IN6=1) THEN LOW 9 ELSE HIGH 9
LOOP UNTIL (IN0=0)
END

(B) Five switch counter

' {$STAMP BS2}
' {$PBASIC 2.5}
' Pin assingments: P0 = stop on low
' pins 1 to 5 are to be monitored
' pins 8-10 to the 7-seg display (P8 LSB), pins 11-15 for bar chart
' note: 7-seg input D grounded, not from STAMP
cnt VAR Byte
 
DIRH = $FF      ' set pins 8-15 to be outputs
 
DO
cnt = IN1+IN2+IN3+IN4+IN5
SELECT cnt       ' could use IF THEN as well
  CASE 0
    OUTH=cnt
  CASE 1
    OUTH=%1000+cnt
  CASE 2
    OUTH=%11000+cnt
  CASE 3
    OUTH=%111000+cnt
  CASE 4
    OUTH=%1111000+cnt
  CASE 5
    OUTH=%11111000+cnt
ENDSELECT
LOOP UNTIL (IN0=0)

(C) J-K Flip-flop simulator:  Two versions.

One item to note: for reliable operation, a loop for edge-detection should only check the CLK input once per loop.  Since the loop has to compare the current value to the last AND preserve the current value for the next loop iteration, that means that you need to have two variables, as below.

Version one writes out to Q regardless of whether a change is required

' {$STAMP BS2}
' {$PBASIC 2.5}
' Program to mimic a JK flip flop with active low CLK
' Similar to half of a 74112 chip
' Difference: if PRE=CLR=LOW, it won't put Q=Qbar=HIGH
PRE PIN 0       ' give recognizable names to the pins
CLR PIN 1
j   PIN 2
k   PIN 3
CLK PIN 8
CLKnew VAR Bit
CLKold VAR Bit  ' need memory to detect edges
Q VAR Bit   ' will use P5 for Q, P4 for Qbar, based on this
 
q = 0      'actually, a true 74112 can initialize to 0 or 1, seemingly at random
OUTB = %0001
CLKold=0   'put FF into mode where it has just triggered
DO
  CLKnew = CLK
  IF (CLKold=1 AND CLKnew=0) THEN        'CLK has been triggered
    ' j=k=0 mode is not needed, since it is "do nothing"
    IF(j=1) AND (k=0) THEN q = 1
    IF(j=0) AND (k=1) THEN q = 0
    IF(j=1) AND (k=1) THEN q = ~q
  ENDIF
  CLKold = CLKnew         ' update CLK history/status
  IF (CLR=0) THEN q=0  ' these override j&k by being checked afterwards
  IF (PRE=0) THEN q=1  ' note that if clr=pre=0, then I've chosen to make PRE the winner
  OUTB = %0001 << q    ' this is really tricky!
LOOP            ' this program will never end, like a real chip

(C) Version two: doesn't change outputs until receiving a trigger - which isn't necessarily any better, just different

' {$STAMP BS2}
' {$PBASIC 2.5}
' Program to mimic a JK flip flop with active low CLK
' Similar to half of a 74112 chip
PRE PIN 0       ' give recognizable names to the pins
CLR PIN 1
j   PIN 2
k   PIN 3
CLK PIN 8
CLKnew VAR Bit
CLKold VAR Bit  ' need memory to detect edges
QQbar VAR Nib   ' will use P5 for Q, P4 for Qbar, based on this
 
QQbar = %0001   ' start with Q=0
OUTB = QQbar
DO
Clkloop:
  CLKold=CLKnew
  CLKnew=CLK
  IF (CLR=0 OR PRE=0) THEN
    IF (CLR=0) QQbar = %0001 ELSE QQbar = %0010
    IF (CLR=0 AND PRE=0) THEN OUTB = %0011 ELSE OUTB = QQbar
  ENDIF
' inside the parentheses is the condition to trigger
  IF NOT (CLKold=1 AND CLKnew=0 AND PRE=1 AND CLR=1) THEN Clkloop
  IF(j=1) AND (k=0) THEN QQbar = %0010
  IF(j=0) AND (k=1) THEN QQbar = %0001
  IF(j=1) AND (k=1) THEN QQbar = ~QQbar     ' screws up higher bits, but we don't care
  OUTB = QQbar
LOOP           ' this program will never end, like a real chip