PDA

View Full Version : Hserin/Hserout question



Philley
- 3rd May 2007, 23:44
What I'm trying to do is use Hyperterminal to send keys pressed from the computer keyboard to the Lab x-1 LCD but only on the first line of the LCD and to hyperterminal, also send the keys from the Lab x-1 keyboard to Hyperterminal and also to line 2 of the LCD. The code I have below does that but I want to be able to see all the keys I've been pressing and not have them be cleared each time I press a key on either keyboard so in other words have them saved on their corresponding lines. Any help or pointing in the right direction would be helpful.


Define LOADER_USED 1

' Define LCD registers and bits
Define LCD_DREG PORTD
Define LCD_DBIT 4
Define LCD_RSREG PORTE
Define LCD_RSBIT 0
Define LCD_EREG PORTE
Define LCD_EBIT 1


char var byte ' Storage for serial character
col var byte ' Keypad column
row var byte ' Keypad row
key var byte ' Key value
lastkey var byte ' Last key storage


ADCON1 = 7 ' Set PORTA and PORTE to digital
Low PORTE.2 ' LCD R/W line low (W)
Pause 500 ' Wait for LCD to startup

OPTION_REG.7 = 0 ' Enable PORTB pullups

key = 0 ' Initialize vars
lastkey = 0


Lcdout $fe, 1 ' Initialize and clear display

loop: Hserin 1, tlabel, [char] ' Get a char from serial port
LCDOUT $fe, $80, char ' Send char to display
HSEROUT [char] ' Send char to Hyperterminal
tlabel: Gosub getkey ' Get a keypress if any
If (key != 0) and (key != lastkey) Then
LCDOUT $fe, $C0, key ' Send key out serial port
HSEROUT [key] 'Send key to hyperterminal
Endif
lastkey = key ' Save last key value
Goto loop ' Do it all over again

' Subroutine to get a key from keypad
getkey:
key = 0 ' Preset to no key
For col = 0 to 3 ' 4 columns in keypad
PORTB = 0 ' All output pins low
TRISB = (dcd col) ^ $ff ' Set one column pin to output
row = PORTB >> 4 ' Read row
If row != $f Then gotkey ' If any keydown, exit
Next col

Return ' No key pressed

gotkey: ' Change row and column to ASCII key number
key = (col * 4) + (ncd (row ^ $f)) + "0"
Return ' Subroutine over

End

mat janssen
- 4th May 2007, 17:27
You forgot to define hserin and hserout.
like this !
DEFINE HSER_TXSTA 20H
DEFINE HSER_RCSTA 90H
DEFINE HSER_SPBRG 4
DEFINE HSER_CLROERR 1

Philley
- 6th May 2007, 15:32
Sorry but why would I need to use those defines when it's already sending and receiving from the Hyperterminal and the keys on the LabX-1 with the code I've displayed in the first post? Unless that will help my situation of savin gthe keys pressed on the LCD instead of them being cleared each time I press another key.

skimask
- 6th May 2007, 18:27
Sorry but why would I need to use those defines when it's already sending and receiving from the Hyperterminal and the keys on the LabX-1 with the code I've displayed in the first post? Unless that will help my situation of savin gthe keys pressed on the LCD instead of them being cleared each time I press another key.

I'm guessing here, but I'd bet the 'DEFINE LOADER_USER 1' might have already set up the serial port for use with the bootloader. Check your .asm & .lst file for anything relating to setting the serial port registers. Either that or PBP used some default values for the serial port, kinda like a 'run home to momma' mode.

mister_e
- 6th May 2007, 23:06
NOPE... nothing to do with the Bootloader, if you use HSERIN/HSEROUT without DEFINEs, it use the default setting : 2400 Baud

mister_e
- 6th May 2007, 23:16
LCDOUT $FE, $C0
sure, this always set the cursor at the begining of the 2nd line. You could use another variable to keep the current LCD position offset and increment it each time you have a successful keypress.


If (key != 0) and (key != lastkey) Then
LCDOUT $fe, ($C0+Line2Position), key ' Send key out serial port
HSEROUT [key] 'Send key to hyperterminal
Line2Position=Line2Position+1
If Line2Position=17 then
Line2Position = 0
LCDOUT $FE,$C0,rep " "\16 ' clear line 2
HSEROUT [13,10]
ENDIF

Endif

skimask
- 7th May 2007, 03:47
NOPE... nothing to do with the Bootloader, if you use HSERIN/HSEROUT without DEFINEs, it use the default setting : 2400 Baud

Well, the reason I mentioned the Bootloader doing the setup for the serial port registers was that when I start up HyperTerminal, it comes up at 9600/8/N/1, Xon/Xoff. I know the HSerIn/Out defaults are 2400, but that would mean that you'd have to change the HyperTerminal settings. The original poster never mentioned anything about baud rate or anything on either side, so I'm just guessing...

Philley
- 7th May 2007, 13:17
Thanks mister_e I'll try that out and get back to ya on my progress.