📄 p18lcd_201.c
字号:
#include <p18F452.h>
#include <delays.h>
#include "p18LCD.h"
#define CPU_SPEED 4 // CPU speed is 16 Mhz !!
#define LCD_RS PORTBbits.RB5 // The definition of control pins
// #define LCD_RW PORTBbits.RE1
#define LCD_E PORTBbits.RB4
#define LCD_DATA LATB // RA2 .. RA5 as LCD Data
#define LCD_CTRL LATB
#define DIR_LCD_CTRL TRISB
#define DIR_LCD_DATA TRISB
// LCD Module commands
#define DISP_2Line_8Bit 0b00111000
#define DISP_2Line_4Bit 0b00101000
#define DISP_ON 0x00C // Display on
#define DISP_ON_C 0x00E // Display on, Cursor on
#define DISP_ON_B 0x00F // Display on, Cursor on, Blink cursor
#define DISP_OFF 0x008 // Display off
#define CLR_DISP 0x001 // Clear the Display
#define ENTRY_INC 0x006 //
#define ENTRY_INC_S 0x007 //
#define ENTRY_DEC 0x004 //
#define ENTRY_DEC_S 0x005 //
#define DD_RAM_ADDR 0x080 // Least Significant 7-bit are for address
#define DD_RAM_UL 0x080 // Upper Left coner of the Display
#pragma udata
unsigned char Temp_CMD ;
unsigned char Str_Temp ;
unsigned char Out_Mask ;
#pragma code
void OpenLCD(void)
{
LCD_CTRL = LCD_CTRL & 0b11001111 ; // Set LCD E,R/W,RS to Low
LCD_DATA = LCD_DATA & 0b11110000 ; // LCD DB[4:7] to Low
DIR_LCD_CTRL &= 0b11001111 ; // E,R/,RS are Output pin
DIR_LCD_DATA &= 0b11110000 ; // LCD DB[4:7} are output
LCD_DATA = 0b00000011 ;
LCD_CMD_W_Timing() ;
LCD_L_Delay() ;
LCD_DATA = 0b00000011 ;
LCD_CMD_W_Timing() ;
LCD_L_Delay() ;
LCD_DATA = 0b00000011 ;
LCD_CMD_W_Timing() ;
LCD_L_Delay() ;
LCD_DATA = 0b00000010 ;
LCD_CMD_W_Timing() ;
LCD_L_Delay() ;
WriteCmdLCD(DISP_2Line_4Bit) ;
LCD_S_Delay() ;
WriteCmdLCD(DISP_ON) ;
LCD_S_Delay() ;
WriteCmdLCD(ENTRY_INC) ;
LCD_S_Delay() ;
WriteCmdLCD(CLR_DISP) ;
LCD_L_Delay() ;
}
//*********************************************
// _ ______________________________
// RS _>--<______________________________
// _____
// RW \_____________________________
// __________________
// E ____________/ \___
// _____________ ______
// DB _____________>--------------<______
//***********************************************
// Write Command to LCD module
//
void WriteCmdLCD( unsigned char LCD_CMD)
{
Temp_CMD = (LCD_CMD & 0xF0)>>4 ; // Send high nibble to LCD bus
LCD_DATA= (LCD_DATA & 0xF0)|Temp_CMD ;
LCD_CMD_W_Timing () ;
Temp_CMD = LCD_CMD & 0x0F ; // Send low nibble to LCD bus
LCD_DATA= (LCD_DATA & 0xF0)|Temp_CMD ;
LCD_CMD_W_Timing () ;
LCD_S_Delay() ; // Delay 100uS for execution
}
//***********************************************
// Write Data to LCD module
//
void WriteDataLCD( unsigned char LCD_CMD)
{
Temp_CMD = (LCD_CMD & 0xF0)>>4 ; // Send high nibble to LCD bus
LCD_DATA= (LCD_DATA & 0xF0)|Temp_CMD ;
LCD_DAT_W_Timing () ;
Temp_CMD = LCD_CMD & 0x0F ; // Send low nibble to LCD bus
LCD_DATA= (LCD_DATA & 0xF0)|Temp_CMD ;
LCD_DAT_W_Timing () ;
LCD_S_Delay() ; // Delay 100uS for execution
}
void putcLCD(unsigned char LCD_Char)
{
WriteDataLCD(LCD_Char) ;
}
void LCD_CMD_W_Timing( void )
{
LCD_RS = 0 ; // Set for Command Input
Nop();
// LCD_RW = 0 ;
Nop();
LCD_E = 1 ;
Nop();
Nop();
LCD_E = 0 ;
}
void LCD_DAT_W_Timing( void )
{
LCD_RS = 1 ; // Set for Data Input
Nop();
// LCD_RW = 0 ;
Nop();
LCD_E = 1 ;
Nop();
Nop();
LCD_E = 0 ;
}
//***********************************************
// Set Cursor position on LCD module
// CurY = Line (0 or 1)
// CurX = Position ( 0 to 15)
//
void LCD_Set_Cursor(unsigned char CurY, unsigned char CurX)
{
WriteCmdLCD( 0x80 + CurY * 0x40 + CurX) ;
LCD_S_Delay() ;
}
void SetDDRamAddr (unsigned char DDRamAddr)
{
WriteCmdLCD(DDRamAddr);
LCD_S_Delay();
}
//***********************************************
// Put a ROM string to LCD Module
//
void putrsLCD( far const rom unsigned char *Str )
{
while (1)
{
Str_Temp = *Str ;
if (Str_Temp != 0x00 )
{
WriteDataLCD(Str_Temp) ;
Str ++ ;
}
else
return ;
}
}
//***********************************************
// Put a RAM string to LCD Module
//
void putsLCD( unsigned char *Str)
{
while (1)
{
Str_Temp = *Str ;
if (Str_Temp != 0x00 )
{
WriteDataLCD(Str_Temp) ;
Str ++ ;
}
else
return ;
}
}
void puthexLCD(unsigned char HEX_Val)
{
unsigned char Temp_HEX ;
Temp_HEX = (HEX_Val >> 4) & 0x0f ;
if ( Temp_HEX > 9 )Temp_HEX += 0x37 ;
else Temp_HEX += 0x30 ;
WriteDataLCD(Temp_HEX) ;
Temp_HEX = HEX_Val & 0x0f ;
if ( Temp_HEX > 9 )Temp_HEX += 0x37 ;
else Temp_HEX += 0x30 ;
WriteDataLCD(Temp_HEX) ;
}
// *********************************************************************************
// Delay for atleast 10 ms
// *********************************************************************************
void LCD_L_Delay(void)
{
Delay10KTCYx(CPU_SPEED / 2) ;
}
// *********************************************************************************
// Delay for 100 us
// *********************************************************************************
void LCD_S_Delay(void)
{
Delay100TCYx(CPU_SPEED) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -