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
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 fontMOV 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