'**************************************************************** '* Name : UNTITLED.BAS * '* Author : [select VIEW...EDITOR OPTIONS] * '* Notice : Copyright (c) 2004 [select VIEW...EDITOR OPTIONS] * '* : All Rights Reserved * '* Date : 10/30/2004 * '* Version : 1.0 * '* Notes : * '* : * '**************************************************************** INCLUDE "modedefs.bas" DEFINE OSC 4 define LCD_LINES 1 define LCD_DREG PORTC DEFINE LCD_DBIT 4 DEFINE LCD_RSREG PORTB DEFINE LCD_RSBIT 1 DEFINE LCD_EREG PORTB DEFINE LCD_EBIT 0 DEFINE LCD_BITS 4 INPUT PORTC.0 INPUT PORTC.1 INPUT PORTC.2 OUTPUT PORTC.3 ROT1 VAR BIT ROT2 VAR BIT OLD1 VAR BIT OLD2 VAR BIT CHANGE VAR BYTE TALLY VAR BYTE X VAR BYTE SHOW VAR BIT NUM VAR BYTE SWITCH VAR BIT OLDSWITCH VAR BIT OK VAR BIT flipped var WORD CHUNK VAR WORD TEST1 var byte TEST2 VAR BYTE TEST3 VAR BYTE SCROLLSPEED CON 4 ' lower = slower LETTERS VAR BYTE[16] LETTER VAR BYTE LETTER = 0 ' See ' http://list.picbasic.com/forum/messages/4011/4333.html?1029989225 pause 500 LCDOUT $FE,1,"Hello James!" TALLY = 0 OLD1 = PORTC.1 OLD2 = PORTC.2 main: FOR x = 1 TO 5 GOSUB getswitch NEXT x GOSUB getchange GOSUB makechunk IF SHOW = 1 THEN 'GOSUB grammar GOSUB LCD SHOW = 0 ENDIF goto main getchange: SWITCH = PORTC.0 ROT1 = PORTC.1 ROT2 = PORTC.2 IF ((ROT1 <> OLD1) OR (ROT2 <> OLD2)) AND SWITCH = 0 THEN IF OLD1 = 0 and OLD2 = 0 AND ROT1 = 0 AND ROT2 = 1 THEN CHANGE = -1 ENDIF IF OLD1 = 0 and OLD2 = 1 AND ROT1 = 1 AND ROT2 = 1 THEN CHANGE = -1 ENDIF IF OLD1 = 1 and OLD2 = 0 AND ROT1 = 0 AND ROT2 = 0 THEN CHANGE = -1 ENDIF IF OLD1 = 1 and OLD2 = 1 AND ROT1 = 1 AND ROT2 = 0 THEN CHANGE = -1 ENDIF IF OLD1 = 0 and OLD2 = 0 AND ROT1 = 1 AND ROT2 = 0 THEN CHANGE = 1 ENDIF IF OLD1 = 0 and OLD2 = 1 AND ROT1 = 0 AND ROT2 = 0 THEN CHANGE = 1 ENDIF IF OLD1 = 1 and OLD2 = 1 AND ROT1 = 0 AND ROT2 = 1 THEN CHANGE = 1 ENDIF IF OLD1 = 1 and OLD2 = 0 AND ROT1 = 0 AND ROT2 = 1 THEN CHANGE = 1 ENDIF CHANGE = CHANGE * SCROLLSPEED TALLY = TALLY + CHANGE LETTERS[LETTER] = TALLY / 10 gosub grammar 'IF OK = 0 THEN ' LETTERS[LETTER] = LETTERS[LETTER] + 1 ' TALLY = LETTERS[LETTER] * 9 ' GOSUB check 'ENDIF OLD1 = ROT1 OLD2 = ROT2 CHANGE = 0 SHOW = 1 ENDIF return getswitch: SWITCH = PORTC.0 IF SWITCH = 1 AND OLDSWITCH = 1AND FLIPPED > 500 THEN 'lcdout $fe,1,"yo" HIGH PORTC.3 pause 1000 goto freeze ENDIF IF SWITCH = 0 AND OLDSWITCH = 1 THEN HIGH PORTC.3 LETTER = LETTER + 1 LETTERS[LETTER] = 0 CHANGE = SCROLLSPEED gosub grammar TALLY = 0 gosub LCD ELSE LOW PORTC.3 ENDIF if switch = 1 and oldswitch = 1 then flipped = flipped + 1 else flipped = 0 endif OLDSWITCH = SWITCH pause 1 RETURN LCD: LCDOUT $FE,1 FOR x = 0 to LETTER IF LETTERS[LETTER] < 26 THEN LCDOUT (LETTERS[x]+97) ENDIF next x 'LCDOUT " ", BIN CHUNK RETURN grammar: OK = 1 HIGH PORTC.3 IF LETTER > 0 THEN failed: OK = 1 GOSUB check2 if LETTER > 1 THEN GOSUB check3 endif IF OK = 0 THEN TALLY = TALLY + CHANGE LETTERS[LETTER] = TALLY / 10 GOTO failed ELSE LOW PORTC.3 SHOW = 1 GOSUB LCd ENDIF ENDIF RETURN makechunk: CHUNK = 0 TEST1 = letters[letter] CHUNK.Bit0 = TEST1.bit0 CHUNK.Bit1 = TEST1.bit1 CHUNK.Bit2 = TEST1.bit2 CHUNK.Bit3 = TEST1.bit3 CHUNK.Bit4 = TEST1.bit4 IF LETTER > 0 THEN TEST2 = letters[letter-1] CHUNK.Bit5 = TEST2.bit0 CHUNK.Bit6 = TEST2.bit1 CHUNK.Bit7 = TEST2.bit2 CHUNK.Bit8 = TEST2.bit3 CHUNK.Bit9 = TEST2.bit4 ENDIF IF LETTER > 1 THEN TEST3 = letters[letter-2] CHUNK.Bit10 = TEST3.bit0 CHUNK.Bit11 = TEST3.bit1 CHUNK.Bit12 = TEST3.bit2 CHUNK.Bit13 = TEST3.bit3 CHUNK.Bit14 = TEST3.bit4 ENDIF RETURN freeze: goto freeze check2: SELECT CASE LETTERS[LETTER-1] CASE 1 SELECT CASE LETTERS[LETTER] CASE 16,23,25 OK = 0 END SELECT CASE 2 SELECT CASE LETTERS[LETTER] CASE 1,5,6,9,15,21,22,23 OK = 0 END SELECT CASE 3 SELECT CASE LETTERS[LETTER] CASE 23 OK = 0 END SELECT CASE 5 SELECT CASE LETTERS[LETTER] CASE 10,12,13,16,21,23,25 OK = 0 END SELECT CASE 6 SELECT CASE LETTERS[LETTER] CASE 2,10,16,21,23 OK = 0 END SELECT CASE 7 SELECT CASE LETTERS[LETTER] CASE 9,21,23,25 OK = 0 END SELECT CASE 9 SELECT CASE LETTERS[LETTER] CASE 0,4,8,14,20 CASE ELSE OK = 0 END SELECT CASE 10 SELECT CASE LETTERS[LETTER] CASE 16,21,23,25 OK = 0 END SELECT CASE 11 SELECT CASE LETTERS[LETTER] CASE 23,25 OK = 0 END SELECT CASE 12 SELECT CASE LETTERS[LETTER] CASE 6,9,10,23,25 OK = 0 END SELECT CASE 15 SELECT CASE LETTERS[LETTER] CASE 16,21,23,25 OK = 0 END SELECT CASE 16 SELECT CASE LETTERS[LETTER] CASE 20 CASE ELSE OK = 0 END SELECT CASE 17 SELECT CASE LETTERS[LETTER] CASE 23 OK = 0 END SELECT CASE 18 SELECT CASE LETTERS[LETTER] CASE 23,25 OK = 0 END SELECT CASE 19 SELECT CASE LETTERS[LETTER] CASE 16,21,23 OK = 0 END SELECT CASE 21 SELECT CASE LETTERS[LETTER] CASE 0,4,8,14,17,20,21,24 CASE ELSE OK = 0 END SELECT CASE 22 SELECT CASE LETTERS[LETTER] CASE 9,16,21,23 OK = 0 END SELECT CASE 23 SELECT CASE LETTERS[LETTER] CASE 3,9,10,12,13,17,21,23,25 OK = 0 END SELECT CASE 24 SELECT CASE LETTERS[LETTER] CASE 16,21,24 OK = 0 END SELECT CASE 25 SELECT CASE LETTERS[LETTER] CASE 0,4,8,11,12,14,15,20,21,22,24,25 CASE ELSE OK = 0 END SELECT CASE ELSE OK = 1 END SELECT RETURN check3: RETURN