⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wg128_64.c

📁 使用MPLAB-C18来控128*64 LCD MODULE,提供电路图及范例程式
💻 C
字号:
// crystal 4MHz
#include "p18f452.h"
#include "type_define.h"
#include "picture_display.h"

#define E_EL		PORTCbits.RC2	//output
#define DI			LATCbits.LATC3//PORTCbits.RC3	//output
#define E			LATCbits.LATC4//PORTCbits.RC4	//output
#define RW			LATCbits.LATC5//PORTCbits.RC5	//output

#define DB0			PORTDbits.RD0	//input/output
#define DB1			PORTDbits.RD1	//input/output
#define DB2			PORTDbits.RD2	//input/output
#define DB3			PORTDbits.RD3	//input/output
#define DB4			PORTDbits.RD4	//input/output
#define DB5			PORTDbits.RD5	//input/output
#define DB6			PORTDbits.RD6	//input/output
#define DB7			PORTDbits.RD7	//input/output

#define CS1			LATEbits.LATE0//PORTEbits.RE0	//output
#define CS2			LATEbits.LATE1//PORTEbits.RE1	//output
#define RES			PORTEbits.RE2	//output
#define LCD_DATA	LATD

#define LCD_LEFT	1
#define LCD_RIGHT	2
#define LCD_ON	1
#define LCD_OFF	0

void mcu_io_init(void);
void lcd_on_off(uns8);
void send_command_to_lcd(uns8);
void check_lcd_state(void);
void display_full_screen(const rom uns8 *);
void set_lcd_line(uns8);
void set_lcd_column(uns8);
void write_byte_to_lcd(uns8);
void set_lcd_start_line(uns8);
void init_lcd(void);
void select_screen(uns8);
void clear_screen(uns8);
uns8 read_byte_from_lcd(void);

void main(void)
{
	mcu_io_init();
	init_lcd();
	display_full_screen(set_screen);
}

void mcu_io_init(void)
{
//I/O setting
	// PORTA setting
	PORTA=0x00;
	LATA=0x00;
	TRISA=0xff;
	// PORTB setting
	PORTB=0x00;
	LATB=0x00;
	TRISB=0xff;
	// PORTC setting
	PORTC=0x40;
	LATC=0x40;
	TRISC=0b11000011;
	// PORTD setting
	PORTD=0x00;
	LATD=0x00;
	TRISD=0x00;
	// PORTE setting
	PORTE=0x00;
	LATE=0x00;
	TRISE=0b11111000;
}

void lcd_on_off(uns8 on_off)
{
	on_off=0x3e | on_off;	//0011 111x
	send_command_to_lcd(on_off);
}

void send_command_to_lcd(uns8 command)
{
	check_lcd_state();
	RW=0;
	LCD_DATA=command;
	E=1;
	E=0;
}

void check_lcd_state(void)
{
	uns8 temp8;
	DI=0;
	RW=1;
	TRISD=0xff;
	do
	{
		E=1;
		temp8=PORTD;//LCD_DATA;
		E=0;
		temp8=0x90 & temp8;		//must BUSY->Ready RESET->Normal
	}while(!(temp8==0x00));
	TRISD=0x00;	//output
}

void display_full_screen(const rom uns8 *p)
{
	uns8 i,j,k;
	for(i=0;i<8;i++)
	{
		for(k=0;k<2;k++)
		{
			if(k==0)
				select_screen(LCD_LEFT);
			else
				select_screen(LCD_RIGHT);
			set_lcd_line(i);
			set_lcd_column(0);
			for(j=0;j<64;j++)
			{
				write_byte_to_lcd(*p++);
			}
		}
	}
}

void set_lcd_line(uns8 line)
{
	line=line & 0x07;	//0<=line<=7
	line=line | 0xb8;	//1011 1xxx
	send_command_to_lcd(line);
}

void set_lcd_column(uns8 column)
{
	column=column & 0x3f;	//0<=column<=63
	column=column | 0x40;	//01xx xxxx
	send_command_to_lcd(column);
}

void write_byte_to_lcd(uns8 dat)
{
	check_lcd_state();
	DI=1;
	RW=0;
	//TRISD=0x00;
	LCD_DATA=dat;
	E=1;
	E=0;
}

void set_lcd_start_line(uns8 startline)	//0-63
{
	startline=startline & 0x07;
	startline=startline | 0xc0;	//1100 0000
	send_command_to_lcd(startline);
}

void init_lcd(void)
{
	RES=0;
	RES=1;
	select_screen(LCD_LEFT);
	set_lcd_column(0);
	set_lcd_line(0);
	set_lcd_start_line(0);
	lcd_on_off(LCD_ON);
	select_screen(LCD_RIGHT);
	set_lcd_column(0);
	set_lcd_line(0);
	set_lcd_start_line(0);
	lcd_on_off(LCD_ON);
	clear_screen(LCD_LEFT);
	clear_screen(LCD_RIGHT);
	select_screen(LCD_LEFT);
}

void select_screen(uns8 screen)
{
	if(screen==LCD_LEFT)
	{
		CS1=1;
		CS2=0;
	}
	else
	{
		CS1=0;
		CS2=1;
	}
}

void clear_screen(uns8 screen)
{
	uns8 i,j;
	select_screen(screen);
	for(i=0;i<8;i++)
	{
		set_lcd_line(i);
		for(j=0;j<64;j++)
		{
			write_byte_to_lcd(0x00);
		}
	}
}

uns8 read_byte_from_lcd(void)
{
	uns8 read_dat;
	check_lcd_state();
	DI=1;
	RW=1;
	TRISD=0xff;
	E=1;
	read_dat=PORTD;
	E=0;
	TRISD=0x00;	//output
	return(read_dat);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -