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

📄 lcd.c

📁 FM12864液晶驱动,单片机为ATMEGA48,GCC编译器开发,其中包含ADC和串口程序.
💻 C
字号:
#include "atmega.h"
#include <avr/io.h>
#include <util/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
//#include "wordlib.h"

#define pgm_read_byte(address_short) pgm_read_byte_near(address_short)
#define pgm_read_word_near(address_short) __LPM_word((uint16_t)(address_short))
#define data_port PORTD
#define data_direction DDRD
#define data_pin PIND
/*******************************************/
void set_data_port_output()
{
	data_direction = 0xff;
}
/*******************************************/
void set_data_port_input()
{
	data_direction = 0x00;
}
/*******************************************/
//左半屏写命令
unsigned char write_left_command(unsigned char cmd)
{
	unsigned char Buffer = 0;
	set_data_port_input();
	left_display_enable();//使能左半屏
	right_display_disable();//禁用右半屏
	set_reg_data_operation();//设置为寄存器操作
	set_read();//设置为读
	while((Buffer&0x80)!=0)
	{
		set_enable_high();
		Buffer = data_pin;
		set_enable_low();
	}
	set_data_port_output();
	set_write();
	data_port = cmd;
	set_enable_high();
	set_enable_low();
	return 1;
}
/*******************************************/
//左半屏写命令
unsigned char write_right_command(unsigned char cmd)
{
	unsigned char Buffer = 0;
	set_data_port_input();
	right_display_enable();//使能右半屏
	left_display_disable();//禁用左半屏
	set_reg_data_operation();//设置为寄存器操作
	set_read();//设置为读
	while((Buffer&0x80)!=0)
	{
		set_enable_high();
		Buffer = data_pin;
		set_enable_low();
	}
	set_data_port_output();
	set_write();
	data_port = cmd;
	set_enable_high();
	set_enable_low();
	return 1;
}
/*******************************************/
unsigned char write_left_data(unsigned int Data)
{
	unsigned char Buffer = 0;
	set_data_port_input();
	left_display_enable();//使能左半屏
	right_display_disable();//禁用右半屏
	set_reg_data_operation();//设置为寄存器操作
	set_read();//设置为读
	while((Buffer&0x80)!=0)
	{
		set_enable_high();
		Buffer = data_pin;
		set_enable_low();
	}
	set_data_port_output();
	set_display_data_operation();//设置为显示数据操作
	set_write();
	data_port = Data;
	set_enable_high();
	set_enable_low();
	return 1;
}
/*******************************************/
unsigned char write_right_data(unsigned int Data)
{
	unsigned char Buffer = 0;
	set_data_port_input();
	right_display_enable();//使能右半屏
	left_display_disable();//使能左半屏
	set_reg_data_operation();//设置为寄存器操作
	set_read();//设置为读
	while((Buffer&0x80)!=0)
	{
		set_enable_high();
		Buffer = data_pin;
		set_enable_low();
	}
	set_data_port_output();
	set_display_data_operation();//设置为显示数据操作
	set_write();
	data_port = Data;
	set_enable_high();
	set_enable_low();
	return 1;
}
/*******************************************/
void display_image(unsigned int *ptr)
{
	unsigned char loop;
	unsigned char page_buffer;
	write_left_command(0xc0);
	write_right_command(0xc0);//设置为第一行
	for(page_buffer=0xb8;page_buffer<0xc0;page_buffer++)
	{
		write_left_command(page_buffer);
		write_right_command(page_buffer);//设置为第一页
		for(loop=0;loop<32;loop++)
		{
			write_left_data((unsigned char)pgm_read_word_near(ptr));
			write_left_data((unsigned char)(pgm_read_word_near(ptr)>>8));
			ptr ++;
		}
		for(loop=0;loop<32;loop++)
		{
			write_right_data((unsigned char)pgm_read_word_near(ptr));
			write_right_data((unsigned char)(pgm_read_word_near(ptr)>>8));
			ptr ++;
		}
	}
}
/*******************************************/
void clear_lcd(void)
{
	unsigned char loop = 0;
	unsigned char page_buffer = 0;
	write_left_command(0xc0);
	write_right_command(0xc0);//设置为第一行
	for(page_buffer=0xb8;page_buffer<=0xc0;page_buffer++)
	{
		write_left_command(page_buffer);
		write_right_command(page_buffer);//设置为第一页
		for(loop=0;loop<64;loop++)
		{
			write_left_data(0x00);
		}
		for(loop=0;loop<64;loop++)
		{
			write_right_data(0x00);
		}
	}
	
}
/*******************************************/
u8_t  display_character_int(u8_t line,u8_t tier,u16_t *ptr,u8_t choice)
{
	u8_t loop1,loop2;
	ptr = ptr+choice*16;
	if((line>4)||(line==0))return 1;
	if((tier>8)||(tier==0))return 1;
	if(line==1)
	{
		line = 0;
	}
	else
	{
		line = line * 2 - 2;
	}
	tier = tier - 1;
	if(tier<4)
	{
		for(loop1=0;loop1<2;loop1++)
		{
			write_left_command(0x40|(tier*16));//设置列
			write_left_command(0xb8|line);
			write_right_command(0x40|(tier*16));//设置列
			write_right_command(0xb8|line);
			for(loop2=0;loop2<8;loop2++)
			{
				write_left_data((unsigned char)pgm_read_word_near(ptr));
				write_left_data((unsigned char)(pgm_read_word_near(ptr)>>8));
				ptr++;
			}
			line++;
		}
	}
	else
	{
		tier = tier - 4;
		for(loop1=0;loop1<2;loop1++)
		{
			write_left_command(0x40|(tier*16));//设置列
			write_left_command(0xb8|line);
			write_right_command(0x40|(tier*16));//设置列
			write_right_command(0xb8|line);
			for(loop2=0;loop2<8;loop2++)
			{
				write_right_data((unsigned char)pgm_read_word_near(ptr));
				write_right_data((unsigned char)(pgm_read_word_near(ptr)>>8));
				ptr++;
			}
			line++;
		}
	}
	return 0;
}

/*******************************************/
u8_t display_character_char(u8_t line,u8_t tier,u16_t *ptr,u8_t choice)
{
	u8_t loop1,loop2;
	ptr = ptr + choice*8;
	if((line>4)||(line==0))return 1;
	if((tier>16)||(tier==0))return 1;
	if(line==1)
	{
		line = 0;
	}
	else
	{
		line = line * 2 - 2;
	}
	tier = tier - 1;
	if(tier<8)
	{
		for(loop1=0;loop1<2;loop1++)
		{
			write_left_command(0x40|(tier*8));//设置列
			write_left_command(0xb8|line);
			write_right_command(0x40|(tier*8));//设置列
			write_right_command(0xb8|line);
			for(loop2=0;loop2<4;loop2++)
			{
				write_left_data((unsigned char)pgm_read_word_near(ptr));
				write_left_data((unsigned char)(pgm_read_word_near(ptr)>>8));
				ptr++;
			}
			line++;
		}
	}
	else
	{
		tier = tier - 8;
		for(loop1=0;loop1<2;loop1++)
		{
			write_left_command(0x40|(tier*8));//设置列
			write_left_command(0xb8|line);
			write_right_command(0x40|(tier*8));//设置列
			write_right_command(0xb8|line);
			for(loop2=0;loop2<4;loop2++)
			{
				write_right_data((unsigned char)pgm_read_word_near(ptr));
				write_right_data((unsigned char)(pgm_read_word_near(ptr)>>8));
				ptr++;
			}
			line++;
		}
	}
	return 0;
}

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



void init_lcd(void)
{
	colse_back_light();//关闭液晶背光
	reset_lcd();//复位液晶
	write_left_command(0x3f);//打开显示
	write_right_command(0x3f);
	write_left_command(0xc0);//显示起始行设置为1行
	write_right_command(0xc0);
	write_left_command(0xb8);//页面地址设置为0
	write_right_command(0xb8);
	write_left_command(0x40);//列地址设置为0
	write_right_command(0x40);
	clear_lcd();
	_delay_ms(1000);
	open_back_light();
/*	display_image(image);
	display_character_int(1,1,character,0);
	display_character_int(1,2,character,1);
	display_character_char(1,5,symbol,0);
	display_character_char(1,6,symbol,1);
	display_character_char(1,7,symbol,0);
	display_character_char(1,8,symbol,1);
	display_character_char(1,9,symbol,0);*/
}


⌨️ 快捷键说明

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