SEROUT Example | SEROUT |
' ------------------------------------------------------------------------- ' Program Description ' ------------------------------------------------------------------------- ' ' Reads a potentiometer with RCTIME and sends the value to a SEETRON ' (www.seetron.com) serial LCD. ' ------------------------------------------------------------------------- ' Device Settings ' ------------------------------------------------------------------------- DEVICE SX28, OSCXT2, TURBO, STACKX, OPTIONX FREQ 4_000_000 ID "SEROUT" ' ------------------------------------------------------------------------- ' IO Pins ' ------------------------------------------------------------------------- PotPin VAR RA.0 ' I/O pin for RCTIME Sout VAR RA.1 ' output to SEETRON 2x16 ' ------------------------------------------------------------------------- ' Constants ' ------------------------------------------------------------------------- Baud CON "N9600" LcdI CON $FE ' instruction LcdCls CON $01 ' clear the LCD LcdHome CON $02 ' move cursor home LcdCrsrL CON $10 ' move cursor left LcdCrsrR CON $14 ' move cursor right LcdDispL CON $18 ' shift chars left LcdDispR CON $1C ' shift chars right LcdDDRam CON $80 ' Display Data RAM control LcdCGRam CON $40 ' Character Generator RAM LcdLine1 CON $80 ' DDRAM address of line 1 LcdLine2 CON $C0 ' DDRAM address of line 2 ' ------------------------------------------------------------------------- ' Variables ' ------------------------------------------------------------------------- analog VAR Byte ' pot value char VAR Byte ' character to send idx VAR Byte ' loop counter line1 VAR Byte(16) ' line 1 buffer line2 VAR Byte(16) ' line 2 buffer tmpB1 VAR Byte ' subroutine work vars tmpB2 VAR Byte tmpW1 VAR Word ' ========================================================================= PROGRAM Start ' ========================================================================= ' ------------------------------------------------------------------------- ' Subroutine DECLARATIONS ' ------------------------------------------------------------------------- TX_BYTE SUB 1, 2 ' transmit a byte DELAY_US SUB 1, 2 ' delay in microseconds DELAY SUB 1, 2 ' delay in milliseconds UPDATE_L1 SUB 0 ' update line 1 of LCD UPDATE_L2 SUB 0 ' update line 2 of LCD UPDATE_LCD SUB 0 ' update both lines ' ------------------------------------------------------------------------- ' Program Code ' ------------------------------------------------------------------------- Start: DELAY 750 ' let LCD initialize TX_BYTE LcdI ' clear screen, home cursor TX_BYTE LcdCls DELAY 1 PUT line1, "POT: " ' initialize LCD buffer PUT line2, " " Main: HIGH PotPin ' charge capacitor DELAY_US 250 ' for 250 usecs RCTIME PotPin, 1, analog, 5 ' read pot (10 us units) Show_Pot: tmpB1 = analog / 100 ' get 100s value tmpB2 = __REMAINDER ' save 10s and 1s tmpB1 = tmpB1 + "0" ' convert 100s to ASCII PUT line1(5), tmpB1 ' move to LCD buffer tmpB1 = tmpB2 / 10 ' get 10s value tmpB2 = __REMAINDER ' save 1s tmpB1 = tmpB1 + "0" ' convert 10s to ASCII PUT line1(6), tmpB1 ' move to LCD buffer tmpB1 = tmpB2 + "0" ' convert 1s to ASCII PUT line1(7), tmpB1 ' move to LCD buffer UPDATE_L1 ' update LCD DELAY 100 ' wait 100 ms GOTO Main ' do it over ' ------------------------------------------------------------------------- ' Subroutines Code ' ------------------------------------------------------------------------- ' Use: TX_BYTE theByte {, repeats } ' -- first parameter is byte to transmit ' -- second (optional) parameter is number of times to send TX_BYTE: tmpB1 = __PARAM1 ' char to send IF __PARAMCNT = 1 THEN ' if no repeats specified tmpB2 = 1 ' - set to 1 ELSE tmpB2 = __PARAM2 ' - save repeats ENDIF DO WHILE tmpB2 > 0 SEROUT Sout, Baud, tmpB1 ' send the character DEC tmpB2 LOOP RETURN ' ------------------------------------------------------------------------- ' Use: DELAY_US us ' -- 'us' is delay in microseconds, 1 - 65535 DELAY_US: IF __PARAMCNT = 1 THEN tmpW1 = __PARAM1 ' save byte value ELSE tmpW1 = __WPARAM12 ' save word value ENDIF PAUSEUS tmpW1 RETURN ' ------------------------------------------------------------------------- ' Use: DELAY ms ' -- 'ms' is delay in milliseconds, 1 - 65535 DELAY: IF __PARAMCNT = 1 THEN tmpW1 = __PARAM1 ' save byte value ELSE tmpW1 = __WPARAM12 ' save word value ENDIF PAUSE tmpW1 RETURN ' ------------------------------------------------------------------------- ' Transfers line 1 buffer to LCD ' -- makes no change in LCD screen position UPDATE_L1: TX_BYTE LcdI ' cursor to line 1, col 0 TX_BYTE LcdLine1 DELAY 1 FOR idx = 0 TO 15 TX_BYTE line1(idx) ' transfer buffer NEXT RETURN ' ------------------------------------------------------------------------- ' Transfers line 2 buffer to LCD ' -- makes no change in LCD screen position UPDATE_L2: TX_BYTE LcdI ' cursor to line 2, col 0 TX_BYTE LcdLine2 DELAY 1 FOR idx = 0 TO 15 TX_BYTE line2(idx) ' transfer buffer NEXT RETURN ' ------------------------------------------------------------------------- ' Updates the LCD with both line buffers UPDATE_LCD: TX_BYTE LcdI TX_BYTE LcdHome DELAY 1 UPDATE_L1 UPDATE_L2 RETURN