' ========================================================================= ' ' File...... Ex29 - Change Counter - MC14489.BS2 ' Purpose... Controlling 7-segment displays with MC14489 ' Author.... Parallax, Inc. ' Copyright (C) 2001 - 2004, All Rights Reserved ' E-mail.... support@parallax.com ' Started... ' Updated... 01 JUN 2004 ' ' {$STAMP BS2} ' {$PBASIC 2.5} ' ' ========================================================================= ' -----[ Program Description ]--------------------------------------------- ' This program is a coin counter -- it will count nickels, dimes, quarters, ' and dollars using pushbutton inputs. The "bank" is displayed on four ' 7-segment LED displays that are controlled with a MC14489. ' -----[ Revision History ]------------------------------------------------ ' 01 JUN 2004 - Ported program from MAX7219 multiplexer to the MC14489 ' * uses PBASIC 2.5 syntax ' * reduced button inputs for NX-1000-24/40 compatibility ' -----[ I/O Definitions ]------------------------------------------------- SData PIN 7 ' Data In (MC14489.12) SClock PIN 6 ' Clock (MC14489.11) Enable PIN 5 ' Enable\ (MC14489.10) Coins VAR INA ' coin inputs (P0 - P3) ' -----[ Constants ]------------------------------------------------------- FullValue CON 500 ' bank full = $5.00 ' -----[ Variables ]------------------------------------------------------- money VAR Word ' current money count idx VAR Nib ' loop counter deposit VAR Nib ' coins deposited nickel VAR deposit.BIT0 ' bit values of deposit dime VAR deposit.BIT1 quarter VAR deposit.BIT2 dollar VAR deposit.BIT3 config VAR Byte ' decode configuration dpCtrl VAR Nib ' decimal point control brCtrl VAR dpCtrl.BIT3 ' dim/bright control segs5 VAR Nib ' segs - digit 5 segs4 VAR Nib segs3 VAR Nib segs2 VAR Nib segs1 VAR Nib ' segs - digit 1 ' -----[ EEPROM Data ]----------------------------------------------------- ' -----[ Initialization ]-------------------------------------------------- Reset: HIGH Enable ' disable MC14489 config = %00110001 ' use 3 digits, hex mode GOSUB Update_Cfg GOSUB Show_The_Money ' initialize display segs ' -----[ Program Code ]---------------------------------------------------- Main: DO DO GOSUB Get_Coins ' wait for coins LOOP UNTIL (deposit > 0) money = money + (nickel * 5) ' add coins money = money + (dime * 10) money = money + (quarter * 25) money = money + (dollar * 100) GOSUB Show_The_Money ' update the display PAUSE 250 LOOP UNTIL (money >= FullValue) END ' -----[ Subroutines ]----------------------------------------------------- ' Scan and debounce P0 - P3 Get_Coins: deposit = %1111 ' enable all coin inputs FOR idx = 1 TO 10 deposit = deposit & ~Coins ' test inputs PAUSE 5 ' delay between tests NEXT RETURN ' Display money value until that value meets or ' exceeds the bank limit. Show_The_Money: IF (money < FullValue) THEN ' show money count dpCtrl = %1011 ' display bright, show DP segs5 = 0 ' blank segs4 = 0 ' blank segs3 = money DIG 2 ' dollar digit segs2 = money DIG 1 ' tens digit segs1 = money DIG 0 ' ones digit GOSUB Update_Segs ELSE ' show "FULL" config = 0 GOSUB Update_Cfg ' blank display config = %11101111 ' setup for "FULL" dpCtrl = %1000 ' display bright, no DPs segs5 = 0 ' blank segs4 = $F ' F segs3 = 10 ' U (Special Decode) segs2 = 5 ' L (Special Decode) segs1 = 5 ' L (Special Decode) GOSUB Update_Segs ' show message GOSUB Update_Cfg ' display on ENDIF RETURN ' Update MC14489 configuration register Update_Cfg: LOW Enable ' enable MC14489 SHIFTOUT SData, SClock, MSBFIRST, [config] ' send config register HIGH Enable ' disable MC14489 RETURN ' Update MC14489 decimal point control and segments registers Update_Segs: LOW Enable SHIFTOUT SData, SClock, MSBFIRST, [dpCtrl\4, segs5\4, segs4\4, segs3\4, segs2\4, segs1\4] HIGH Enable RETURN