HD44780模块LCD接口例程

2022-12-27  

/***************************************************************************/

/* Lcd.c LCD interface routines */

/* Version : 2.1. for PIC16F87x */

/* J. Winpenny 1/8/2000 */

/* Mode : HD44780 type LCD displays */

/* Notes : Updated version */

/* to allow greater adaptability to different displays */

/***************************************************************************/

#include "lcd873b.h"

/* Definitions for the LCD interface */

#define LCD_SEL 3 /* Port A bit 3 ( Enables LCD ) */

#define LCD_WR 2 /* Port A bit 2 ( Logic 0 = Write ) */

#define LCD_RS 0 /* Port A bit 1 ( Register select ) */

#define LCD_DATA PORTB

#define LCD_CONTROL PORTA

#define BUSY_BIT 7

#define BUSY_MASK 0x80

#define LCD_DATA_4 4 /* LCD BIT 0 */

#define LCD_DATA_5 5 /* LCD BIT 1 */

#define LCD_DATA_6 6 /* LCD BIT 2 */

#define LCD_DATA_7 7 /* LCD BIT 3 */

char ModeFlags;

char LCD_gp;

/***********************************/

/* Setup the lcd device */

/***********************************/

void LCDSetup(void)

{

/* Reset the LCD */

ModeFlags = 0; /* Default to Function Mode */

Write_8_Bit( system_set_4_bit ); /* This sequence resets the LCD */

delay_ms(5);

Write_8_Bit( system_set_4_bit );

delay_ms(1);

Write_8_Bit( system_set_4_bit );

delay_ms(1);

LcdWrite( system_set_4_bit );

LcdWrite( display_on );

LcdWrite( clear_lcd );

LcdWrite( entry_mode );

LcdWrite( set_dd_ram );

ModeFlags = 1; /* Data Mode */

}

/***********************************/

/* Put LCD in Function Mode */

/***********************************/

void FunctionMode(void)

{

BIT_CLEAR( ModeFlags, 0 ); /* Save Mode */

#asm BCF LCD_CONTROL, LCD_RS #endasm

Delaylcd();

}

/***********************************/

/* Put LCD in Data Mode */

/***********************************/

void DataMode(void)

{

BIT_SET( ModeFlags, 0 ); /* Save Mode */

#asm BSF LCD_CONTROL, LCD_RS #endasm

Delaylcd();

}

/***********************************/

/* Write a single byte to the LCD */

/* 8 Bit Mode */

/***********************************/

void Write_8_Bit( char dh )

{

#asm BCF LCD_CONTROL, LCD_WR #endasm

#asm BCF LCD_CONTROL, LCD_RS #endasm

#asm BCF LCD_CONTROL, LCD_SEL #endasm

//LCD_CONTROL = 0;

delay_ms(1);

LCD_DATA = dh; /* Setup data */

BIT_SET( LCD_CONTROL, LCD_SEL ); /* Select LCD */

Delaylcd();

BIT_CLEAR( LCD_CONTROL, LCD_SEL ); /* de-select LCD */

Delaylcd();

}

/***********************************/

/* Write a single byte to the LCD */

/* 4 Bit Mode */

/***********************************/

void LcdWrite(char dl )

{

char e;

e = dl; /* Save lower 4 bits */

/*********************************** Output Upper 8 bits ******************************/

BIT_CLEAR( LCD_CONTROL, LCD_WR ); /* Write mode */

if ( ( ModeFlags & 0x01 ) == 0 )

BIT_CLEAR( LCD_CONTROL, LCD_RS ); /* Function mode */

else

BIT_SET( LCD_CONTROL, LCD_RS ); /* Data mode */

BIT_CLEAR( LCD_CONTROL, LCD_SEL);

LCD_DATA = dl; /* Setup data */

BIT_SET( LCD_CONTROL, LCD_SEL); /* Select LCD */

Delaylcd();

BIT_CLEAR( LCD_CONTROL, LCD_SEL ); /* de-select LCD */

dl = e; /* Restore lower 4 bits */

dl <<= 4;

/*********************************** Output Lower 8 bits ******************************/

BIT_CLEAR( LCD_CONTROL, LCD_WR ); /* Write mode */

if ( ( ModeFlags & 0x01 ) == 0 )

BIT_CLEAR( LCD_CONTROL, LCD_RS ); /* Function mode */

else

BIT_SET( LCD_CONTROL, LCD_RS ); /* Data mode */

BIT_CLEAR( LCD_CONTROL, LCD_SEL);

LCD_DATA = dl; /* Setup data */

BIT_SET( LCD_CONTROL, LCD_SEL); /* Select LCD */

Delaylcd();

BIT_CLEAR( LCD_CONTROL, LCD_SEL ); /* de-select LCD */

Delaylcd();

}

/***********************************/

/* LCD timing delay */

/* Adjust for your LCD Display */

/***********************************/

void Delaylcd(void)

{

delay_ms(2);

}

/***********************************/

/* Clear LCD Screen */

/***********************************/

void Clear(void)

{

FunctionMode();

LcdWrite(clear_lcd);

DataMode();

}

/***********************************/

/* Set the cursor position */

/***********************************/

void SetPos(char Pos)

{

FunctionMode();

LcdWrite( Pos );

DataMode();

}

/***********************************/

/* Set Position to line 1 */

/***********************************/

void Line1(void)

{

FunctionMode();

LcdWrite( set_dd_line1 );

DataMode();

}

/***********************************/

/* Set Position to line 2 */

/***********************************/

void Line2(void)

{

FunctionMode();

LcdWrite( set_dd_line2 );

DataMode();

}

/*******************************************/

/* Clear Line 1 */

/*******************************************/

void ClearLine1(void)

{

Line1();

for( LCD_gp = 0; LCD_gp < 16; LCD_gp++ )

{

LcdWrite(' ');

}

Line1();

}


/*******************************************/

/* Clear Line 2 */

/*******************************************/

void ClearLine2(void)

{

Line2();

for( LCD_gp = 0; LCD_gp < 16; LCD_gp++ )

{

LcdWrite(' ');

}

Line2();

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。