> Please check from your link map, if you have _LCDINIT,
> but no _lcdinit. The C language has case-sensitive symbols,
> the two symbols above *are* different.
Thanks for reminding me - thats how lazy I get after programming in
Delphi for a few years!
However, thats not the case I typed the example in lowercase, but in
fact the void statement was in the correct case.
Unless someone reports the fix, I will advise when/if I sort it.
Thanks,
Al.
Reply by Bo●June 21, 20062006-06-21
"Tauno Voipio" <tauno.voipio@INVALIDiki.fi> wrote in message
news:V1gmg.263$9O5.152@read3.inet.fi...
> Alistair George wrote:
>> Hi its been ages since I brushed the dust of Hi-Tech compiler. Now I go
>> to use it have a wee problem.
>> Can MAKE OK. Paths and correct source file list are defined but when I go
>> to COMPILE there are errors relating to:
>>
>> extern void lcdinit(void);
>>
>> lcdinit();
>>
>> error 'undefined symbol'
>> _lcdinit <myprogram.obj>
>>
>> Anyone advise what this could be - The error perhaps is caused by main
>> looking for lcdinit rather than _lcdinit in the source below. However
>> make works well so Im stimied
>> Can anyone advise how to do a successful compile?
>>
>> Here's my LCDINIT code:
>>
>> psect text,class=CODE
>> global _LCDINIT,_LCDCMD,_CHAROUT
>
> (-- clip clip --)
>> ;initialize the LCD
>>
>> _LCDINIT:
>> MOV A,#67 ;pause for 15ms
>
> Please check from your link map, if you have _LCDINIT,
> but no _lcdinit. The C language has case-sensitive symbols,
> the two symbols above *are* different.
>
> --
>
> Tauno Voipio
> tauno voipio (at) iki fi
Or it could be that a specific declaration is needed,
ie it thinks lcdinit() is not the extern'd lcdinit() because there is a
mismatch somewhere in the declaration and definition? Some compilers will
assume you are returning an int unless you specifically declare/define
return as void????
Just a thought...
Bo
Reply by Tauno Voipio●June 21, 20062006-06-21
Alistair George wrote:
> Hi its been ages since I brushed the dust of Hi-Tech compiler. Now I go
> to use it have a wee problem.
> Can MAKE OK. Paths and correct source file list are defined but when I
> go to COMPILE there are errors relating to:
>
> extern void lcdinit(void);
>
> lcdinit();
>
> error 'undefined symbol'
> _lcdinit <myprogram.obj>
>
> Anyone advise what this could be - The error perhaps is caused by main
> looking for lcdinit rather than _lcdinit in the source below. However
> make works well so Im stimied
> Can anyone advise how to do a successful compile?
>
> Here's my LCDINIT code:
>
> psect text,class=CODE
> global _LCDINIT,_LCDCMD,_CHAROUT
(-- clip clip --)
> ;initialize the LCD
>
> _LCDINIT:
> MOV A,#67 ;pause for 15ms
Please check from your link map, if you have _LCDINIT,
but no _lcdinit. The C language has case-sensitive symbols,
the two symbols above *are* different.
--
Tauno Voipio
tauno voipio (at) iki fi
Reply by James Beck●June 21, 20062006-06-21
In article <4498c1de@news.orcon.net.nz>, noname@xtra.co.nz says...
> ;initialize the LCD
>
> _LCDINIT:
> MOV A,#67 ;pause for 15ms
>
I do not use the Hi-Tech compiler, but my best guess would be that your
function name may be case sensitive.
maybe something like this :
_lcdinit:
Look in the documentation on how to make an assembly language routine a
callable 'C' function.
Jim
Reply by Neil●June 21, 20062006-06-21
Alistair George wrote:
> Hi its been ages since I brushed the dust of Hi-Tech compiler. Now I go
> to use it have a wee problem.
> Can MAKE OK. Paths and correct source file list are defined but when I
> go to COMPILE there are errors relating to:
>
> extern void lcdinit(void);
>
> lcdinit();
>
> error 'undefined symbol'
> _lcdinit <myprogram.obj>
>
> Anyone advise what this could be - The error perhaps is caused by main
> looking for lcdinit rather than _lcdinit in the source below. However
> make works well so Im stimied
> Can anyone advise how to do a successful compile?
>
>
>
> Here's my LCDINIT code:
>
> psect text,class=CODE
> global _LCDINIT,_LCDCMD,_CHAROUT
> LCD_PORT EQU P0 ;4 bit interface/control
>SNIP<
Not sure, I assume you included it in the project. Thy the HiTech Forum
if you do not get an answer here.
Reply by Alistair George●June 21, 20062006-06-21
Hi its been ages since I brushed the dust of Hi-Tech compiler. Now I go
to use it have a wee problem.
Can MAKE OK. Paths and correct source file list are defined but when I
go to COMPILE there are errors relating to:
extern void lcdinit(void);
lcdinit();
error 'undefined symbol'
_lcdinit <myprogram.obj>
Anyone advise what this could be - The error perhaps is caused by main
looking for lcdinit rather than _lcdinit in the source below. However
make works well so Im stimied
Can anyone advise how to do a successful compile?
Here's my LCDINIT code:
psect text,class=CODE
global _LCDINIT,_LCDCMD,_CHAROUT
LCD_PORT EQU P0 ;4 bit interface/control
for Hitachi LCD (2 line)
LCD_E EQU P2.7
R_MASK EQU 00000000B ;register access
S_MASK EQU 00001000B ;DD/CG RAM access
LOW_MASK EQU 11110000B ;mask out low nybble
CLS EQU 00000001B
D_SET EQU 00001000B ;display on/off control
E_SET EQU 00000100B ;entry mode control
F_SET EQU 00100000B ;function set
D_D_ON EQU 00000100B ;display on
D_D_OFF EQU 00000000B ;display off
D_C_ON EQU 00000010B ;cursor on
D_C_OFF EQU 00000000B ;cursor off
D_B_ON EQU 00000001B ;blink on (blinking solid
box)
D_B_OFF EQU 00000000B ;blink off (solid
underscore)
E_S_NO EQU 00000000B ;entry mode--don't shift
E_S_YES EQU 00000001B ;entry mode--shift
display
E_C_INC EQU 00000010B ;cursor move right
E_C_DEC EQU 00000000B ;cursor move left
F_8BIT EQU 00010000B ;8-bit interface
F_4BIT EQU 00000000B ;4-bit interface (D7-D0)
F_2LINE EQU 00001000B ;2-line display
F_1LINE EQU 00000000B ;1-line display
F_8FONT EQU 00000000B ;font for 5x8 matrix
F_11FONT EQU 00000100B ;font for 5x11 matrix
CG_ADDR EQU 01000000B
DD_ADDR EQU 10000000B
;initialize the LCD
_LCDINIT:
MOV A,#67 ;pause for 15ms
lcall LWAIT
MOV A,#(F_SET OR F_8BIT) ;set 8-bit mode
lcall LCD_OUT ;send to LCD
MOV A,#18 ;pause for 4.1ms
lcall LWAIT
MOV A,#(F_SET OR F_8BIT) ;set 8-bit mode
lcall LCD_OUT ;send to LCD
MOV A,#1 ;pause for 100us
lcall LWAIT
MOV A,#(F_SET OR F_8BIT) ;set 8-bit mode
lcall LCD_OUT ;send to LCD
MOV A,#18 ;pause for 4.1ms
lcall LWAIT
MOV A,#(F_SET OR F_4BIT) ;set 4-bit mode
lcall LCD_OUT ;send to LCD
lcall LWAIT_40U ;pause for 40us
MOV A,#(F_SET OR F_4BIT)
ORL A,#(F_2LINE OR F_8FONT)
lcall _LCDCMDA ;set 4-bit, 2-line,
5x8 font
MOV A,#(D_SET OR D_D_OFF)
ORL A,#(D_C_OFF OR D_B_OFF)
lcall _LCDCMDA ;display, cursor,
blink off
MOV A,#(D_SET OR D_D_ON)
ORL A,#(D_C_ON OR D_B_OFF)
lcall _LCDCMDA ;display, underscore
cursor on
MOV A,#(E_SET OR E_S_NO)
ORL A,#E_C_INC
lcall _LCDCMDA ;cursor moves right,
no shift
RET ;initialization complete
;transmit nybble to LCD
LCD_OUT:
MOV LCD_PORT,A ;set up data and RS lines
SETB LCD_E ;toggle Enable pin
CLR LCD_E
RET
;send command in ACC to LCD
_LCDCMD:
MOV A,R5
_LCDCMDA:
PUSH ACC ;store the byte
ANL A,#LOW_MASK ;mask out low nybble
ORL A,#R_MASK ;set RS=0
lcall LCD_OUT ;send high order nybble of
command
POP ACC ;get low order nybble
SWAP A ;move to high nybble
ANL A,#LOW_MASK ;mask out low nybble
ORL A,#R_MASK ;set RS=0
lcall LCD_OUT ;send low order nybble of
command
lcall LWAIT ;100us_40U ;pause
for 40us
RET
;send character in ACC to
LCD
_CHAROUT:
CLR A
MOV A,R5
CJNE A,#8,_BS
MOV A,#10000B
SJMP _LCDCMDA
_BS: PUSH ACC ;store the byte
ANL A,#LOW_MASK ;mask out low nybble
ORL A,#S_MASK ;set RS=1
lcall LCD_OUT ;send high order nybble of
char
POP ACC ;get low order nybble
MOV B,A
PUSH ACC
MOV A,B
SWAP A ;move to high nybble
ANL A,#LOW_MASK ;mask out low nybble
ORL A,#S_MASK ;set RS=1
lcall LCD_OUT ;send low order nibble of
char
lcall LWAIT_40U ;pause for 40us
POP ACC
RET
;40 microsecond delay,
assumes 12MHz clock
;12MHz/(12clocks/instr)=1
machine cycle per microsecond
LWAIT_40U:
MOV R3,#20 ;20 DJNZ instr = 40us
DJNZ R3,$
RET
; ACC*100us delay, assumes
12MHz clock
LWAIT:
MOV R3,#50 ;DJNZ instr = 100us
DJNZ R3,$
DJNZ ACC,LWAIT
RET
END