help me check my code, from keypad to lcd
Carpark
Posts: 11
' {$STAMP BS2} ' {$PBASIC 2.5} ' ========== Program Description ========== ' This program demonstrates using a Hitachi-compatible Parallel LCD Display ' to interface with a 4 x 4 keypad, outputing it to the LCD display ' This code works with the BS2, and is in the language of pbasic. ' ========== I/O Definitions ========== 'RW gnd ' R/W Pin For LCD E PIN 0 ' Enable Pin For LCD RS PIN 1 ' LCD Register Select LDR1 PIN 2 LDR2 PIN 3 TX1 PIN 4 TX2 PIN 5 SEL_KP PIN 6 SEL_LCD PIN 7 KP_IN1 PIN 8 KP_IN2 PIN 9 KP_IN3 PIN 10 KP_IN4 PIN 11 KP_LCD1 PIN 12 KP_LCD2 PIN 13 KP_LCD3 PIN 14 KP_LCD4 PIN 15 ' ========== Variables ========== char VAR Byte ' Character To Send To LCD inst VAR char ' Induction To Send To LCD index VAR Word ' Character Pointer temp VAR Byte ' Temp Variable cnt VAR Byte db VAR Bit ' Debounce bit for use by keyScan. press VAR Bit ' Flag to indicate keypress. key VAR Nib ' Key number 0-15. keychar VAR CHAR row VAR Nib ' Counter used in scanning keys. cols VAR INC ' Input states of pins P8-P11. ' ========== EEPROM Data ========== DATA "Mobile Number" ' Message To Send To LCD ' ========== Initialization ========== Initialize: OUTS = %0000000000000000 ' Set All Output Low DIRS = %1111000011110011 ' Set I/O Direction GOSUB Init_Lcd ' Initialize The LCD Display ' ========== Program Code ========== Main: FOR temp = 0 TO 31 ' 32 = 2 x 16 Characters IF temp = 15 THEN ' Check For End Of Line GOSUB Next_Line ' Jump To Next Line ENDIF READ temp, char ' Read Next Character From EEPROM GOSUB Send_Text ' Send Character To LCD Display NEXT HIGH SEL_LCD 'select LCD PAUSE 100 LOW SEL_KP PAUSE 100 LOW SEL_LCD 'select LCD PAUSE 100 HIGH SEL_KP PAUSE 100 LOW SEL_LCD 'select LCD PAUSE 100 HIGH RS PAUSE 100 OUTD = %0011 ' Send High Nibble PULSOUT E,1 PAUSE 10 OUTD = %0011 ' Send Low Nibble PULSOUT E,1 HIGH SEL_LCD 'select LCD PAUSE 100 keypad1: GOSUB keyScan IF press = 0 THEN keypad1 DEBUG "key pressed = ", HEX key,CR ' LOW SEL_LCD 'select LCD ' PAUSE 100 ' LOW RS ' Inst = %00000001 ' Reset The LCD ' GOSUB Send_Inst 'DEBUG "lcd cleared" 'HIGH RS 'keychar=keychar+$30 'keychar.LOWNIB = key GOSUB Send_Num PAUSE 50 press = 0 FOR cnt = 1 TO 7 keypad2: GOSUB keyScan HIGH SEL_KP PAUSE 100 IF press = 0 THEN keypad2 DEBUG "key pressed = ",HEX key,CR 'keychar = key+$30 LOW SEL_LCD 'select LCD PAUSE 100 HIGH RS 'keychar.HIGHNIB = %0011 'keychar.LOWNIB = key GOSUB Send_Num PAUSE 50 press = 0 NEXT GOTO Main END '========== Subroutines ========== Init_Lcd: LOW SEL_LCD 'select LCD PAUSE 100 OUTH = %00000001 ' Reset The LCD PULSOUT E,1 PAUSE 10 OUTH = %00101000 ' Set To 4-bit Operation PULSOUT E,1 Inst = %00001110 ' Turn On Cursor GOSUB Send_Inst Inst = %00000110 ' Set Auto-Increment GOSUB Send_Inst Inst = %00000001 ' Clears LCD GOSUB Send_Inst HIGH SEL_LCD 'select LCD PAUSE 100 RETURN Send_Inst: LOW SEL_LCD 'select LCD PAUSE 100 LOW RS ' Set Instruction Mode OUTD = Inst.HIGHNIB ' Send High Nibble PULSOUT E,1 OUTD = Inst.LOWNIB ' Send Low Nibble PULSOUT E,1 HIGH RS ' Set LCD Back To Text Mode HIGH SEL_LCD 'select LCD PAUSE 100 RETURN Send_Text: LOW SEL_LCD 'select LCD PAUSE 100 OUTD = Char.HIGHNIB ' Send High Nibble PULSOUT E,1 PAUSE 10 OUTD = char.LOWNIB ' Send Low Nibble PULSOUT E,1 HIGH SEL_LCD 'select LCD PAUSE 100 RETURN Next_Line: Inst = 128+64 ' Move Cursor To Line 2 GOSUB Send_Inst RETURN Send_Num: LOW SEL_LCD 'select LCD PAUSE 100 OUTD = $3 ' Send High Nibble PULSOUT E,1 PAUSE 10 OUTD = keychar.LOWNIB ' Send Low Nibble PULSOUT E,1 HIGH SEL_LCD 'select LCD PAUSE 100 RETURN keyScan: LOW SEL_KP PAUSE 100 FOR row = 12 TO 15 ' Scan rows one at a time. LOW row ' Output a 0 on current row. 'OUTH = row 'PAUSE 5 key = ~cols ' Get the inverted state of column bits. key = NCD key ' Convert to bit # + 1 with NCD. IF key <> 0 THEN HIGH SEL_KP PAUSE 100 LOW SEL_LCD 'select LCD PAUSE 100 HIGH RS PAUSE 100 OUTD = %0000 ' Send High Nibble PULSOUT E,1 PAUSE 10 OUTD = %0000 ' Send Low Nibble PULSOUT E,1 PAUSE 10 HIGH SEL_LCD 'select LCD PAUSE 100 LOW SEL_KP PAUSE 100 IF db = 1 THEN done ' Already responded to this press, so done. db = 1: press = 1 ' Set debounce and keypress flags. key = (key-1)+(row*4) ' Add column (0-3) to row x 4 (0,4,8,12). ' Key now contains 0-15, mapped to this arrangement: ' 0 1 2 3 ' 4 5 6 7 ' 8 9 10 11 ' 12 13 14 15 ' A lookup table is translates this to match the actual ' markings on the key caps. LOOKUP key,[noparse][[/noparse]1,2,3,10,4,5,6,11,7,8,9,12,14,0,15,13],key done: INPUT row ' Disconnect output on row. HIGH SEL_KP PAUSE 100 RETURN ENDIF ' push ' No high on cols? No key pressed. INPUT row ' Disconnect output on row. NEXT ' Try the next row. db = 0 ' Reset the debounce bit. HIGH SEL_KP PAUSE 100 RETURN ' Return to program. ' push: ' IF db = 1 THEN done ' Already responded to this press, so done. ' db = 1: press = 1 ' Set debounce and keypress flags. ' key = (key-1)+(row*4) ' Add column (0-3) to row x 4 (0,4,8,12). ' Key now contains 0-15, mapped to this arrangement: ' 0 1 2 3 ' 4 5 6 7 ' 8 9 10 11 ' 12 13 14 15 ' A lookup table is translates this to match the actual ' markings on the key caps. ' LOOKUP key,[noparse][[/noparse]1,2,3,10,4,5,6,11,7,8,9,12,14,0,15,13],key ' done: ' INPUT row ' Disconnect output on row. 'HIGH SEL_KP 'PAUSE 100 ' RETURN ' Return to program.
it cant seems to work ):
im using a SN54LS244J, its attached
pdf
198K