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

📄 lcm6059b12864.h

📁 12864液晶不带字库的各种刷屏显示方式
💻 H
字号:
/****************128*64液晶驱动程序*******************/
/*DEVICE:LM6059BCW  128*64   IC:ST7565P
/*MCU:  AVR  M128    7.3728M(8M)    
/*DATA: 2008.07.23
/*AUTHOR: JOE YUAN   QQ:16693799
/***********************************************************/

#include <iom128v.h>
#include <macros.h>
#include "delay.h"
#include "ascii8x16.h"
#include "HZK_GB16.h"
#include "define.h"
#include "tupian.h"

void Write_Com_12864( unsigned char cmdcode );//写控制字
void Write_Data_12864 ( unsigned char Dispdata );//写数据到LCD
void Clr_Scr_12864(void);//清屏
void Set_Scr_12864(void);//全显示程序
void Hz_Display16_12864//指定位置显示汉字16*16
			(
				unsigned char y, //显示的Y坐标
			  	unsigned char x, //显示的X坐标
			  	unsigned char const *hz_code 
			 );

#define CTRL_PORT_12864 PORTC
	#define CS12864		PC0//片选
	#define RST12864	PC1//复位端
	#define RS12864		PC2//寄存器选择H :数据区 L:控制区
	#define RW12864		PC3//读写选择
	#define E12864		PC4//

	#define CS12864_H	CTRL_PORT_12864 |= BIT(CS12864);
	#define	CS12864_L	CTRL_PORT_12864 &=~ BIT(CS12864);
	#define RST12864_H	CTRL_PORT_12864 |= BIT(RST12864);
	#define RST12864_L	CTRL_PORT_12864 &=~ BIT(RST12864);
	#define RS12864_H	CTRL_PORT_12864 |= BIT(RS12864);
	#define RS12864_L	CTRL_PORT_12864 &=~ BIT(RS12864);
	#define RW12864_H	CTRL_PORT_12864 |= BIT(RW12864);
	#define RW12864_L	CTRL_PORT_12864 &=~ BIT(RW12864);
	#define E12864_H	CTRL_PORT_12864 |= BIT(E12864);
	#define E12864_L	CTRL_PORT_12864 &=~ BIT(E12864);	

#define DATA_PORT_12864 PORTA//输出口
#define DATA_DDR_12864	DDRA//数据口方向
#define DATA_PIN_12864	PINA//输入口


#define DISP_ON 0xAf
#define DISP_OFF 0xAe
#define COL_ADDRESS  0xB0//列首地址
#define PAGE_ADDRESS 0xB0//业首地址
//#define START_LINE 0xc0//启始行 

unsigned char col_address;//列地址
unsigned char page_address;//页地址

unsigned char lcd_ram_12864[8][128];//刷屏缓冲区8*128








/***********************************************************************
/*直接写入lcd12864数据区方式
/**********************************************************************/
void Hz_Display16x16_12864//指定位置显示汉字16*16
			(
				unsigned char y, //显示的Y坐标
			  	unsigned char x, //显示的X坐标
			  	unsigned char const *p
			 )
{
	unsigned char j,i ;
	for(j=0;j<2;j++)
	{
			Write_Com_12864(PAGE_ADDRESS+y+j);//写入汉字显示地址
			Write_Com_12864(0x10|((x&0xf0)>>4));
			Write_Com_12864(0x00|(x&0x0f));
			for(i=0;i<16;i++) 
			{
				Write_Data_12864(p[16*j+i]);
			}
	}
}

void Lcd_Ascii8x16_12864//指定位置显示字符8*16
			(
				unsigned char y, //显示的Y坐标
			  	unsigned char x, //显示的X坐标
			  	unsigned char *p//字符指针 
			 )
{
	unsigned char j=0,i=0,k=0;
	unsigned char sizeb=0,cow_num;
	while(*(p+sizeb) != '\0')//字符串长度
	{
		sizeb++;
	}
	cow_num = sizeb/16+2;
	for(j=0;j<cow_num;j++)//字符高度为16 需要刷新2行
	{
		Write_Com_12864(PAGE_ADDRESS+y+j);//写入显示地址
		Write_Com_12864(0x10|((x&0xf0)>>4));
		Write_Com_12864(0x00|(x&0x0f));
		for(k=0;k<sizeb;k++)//纵向的总的长度
		{
			for(i=0;i<8;i++)//一个字符纵向8 次 
			{
				Write_Data_12864(asciidot8x16[*(p+k)-0x20][8*j+i]);
			}
		}
	}
}
/*************************************************************************/



/*************************************************************************/
/*写入单片机RAM缓冲区刷屏方式
/*************************************************************************/
void Ram_12864(void)//刷屏
{
	unsigned char i,j;
	for(i=0;i<8;i++)
	{
		Write_Com_12864(0X10);//SET COLUMN ADDRESS = 0X00 UPPER-4BIT 
		Write_Com_12864(0X00);//SET COLUMN ADDRESS = 0X00 LOWER-4BIT 
		Write_Com_12864(0xB0|(i&0X0F));
		for(j=0;j<128;j++)
		{
			Write_Data_12864(lcd_ram_12864[i][j]);
		}

	}
}

void Ram_Ascii8x16_12864//指定位置显示字符串8*16 到ram
			(
				unsigned char y, //显示的Y坐标
			  	unsigned char x, //显示的X坐标
			  	unsigned char *p//字符指针 
			 )
{
	unsigned char j=0,i=0,k=0;
	unsigned char sizeb=0,cow_num;
	while(*(p+sizeb) != '\0')//字符串长度
	{
		sizeb++;
	}
	//cow_num = sizeb/16+2;
	for(i=0;i<2;i++)
	{
		for(j=0;j<sizeb;j++)
		{
			for(k=0;k<8;k++)
			{
				lcd_ram_12864[y+i][x+k+8*j] = asciidot8x16[*(p+j)-0x20][k+8*i];
			}
		}
	}
	Ram_12864();
}

void Ram_Hz16x16_12864//指定位置显示汉字16*16 到ram
			(
				unsigned char y, //显示的Y坐标
			  	unsigned char x, //显示的X坐标
			  	unsigned char *p//字符指针 
			 )
{
	unsigned char j=0,i=0,k=0;
	unsigned char sizeb=0,cow_num;
	unsigned char index_num =0;//汉字索引号
	unsigned char const *lcd_p;	
	while(*(p+sizeb) != '\0')//字符串长度
	{
		sizeb++;
	}
	for(i=0;i<sizeb/2;i++)
	{
		while((*(p+2*i) != GB_16[index_num].Index[0]) //查出索引号
			|| (*(p+1+2*i) != GB_16[index_num].Index[1]))
		{
			index_num ++;
		}
		lcd_p = GB_16[index_num].Msk;
		for(j=0;j<2;j++)//刷新先上后下
		{
			for(k=0;k<16;k++)
			{
				lcd_ram_12864[y+j][x+k+16*i] = *(lcd_p+k+16*j);
			}
		}
	}
	Ram_12864();
}

void Reverse_16x16_12864(unsigned char y)//反显示一行
{
	unsigned char j=0,i=0;
	for(i=0;i<2;i++)
	{
		for(j=0;j<128;j++)
		{
			lcd_ram_12864[y+i][j] = ~lcd_ram_12864[y+i][j];
		}
	}
	Ram_12864();
}

void Ram_Bmp_12864(unsigned char const *p)//显示图片
{
	unsigned char j=0,i=0;
	for(i=0;i<8;i++)
	{
		for(j=0;j<128;j++)
		{
			lcd_ram_12864[i][j] = *(p+128*i+j);
		}
	}
	Ram_12864();
}

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


void Write_Com_12864( unsigned char cmdcode )//写控制字
{
	CS12864_H;
	RS12864_L;//写控制字RS = 0 ; RW = 0 ; E :H->L
	RW12864_L;
	Delay_1us();
	CS12864_L;
	DATA_PORT_12864 = cmdcode ;
	Delay_1us();
	E12864_H;
	Delay_1us();
	E12864_L;
	Delay_1us();
	CS12864_H;
}


void Write_Data_12864 ( unsigned char Dispdata )//写数据到LCD
{
	CS12864_H;
	RS12864_H;//写控制字RS = H ; RW = 0 ; E :H->L
	RW12864_L;
	Delay_1us();
	CS12864_L;
	DATA_PORT_12864 = Dispdata ;
	Delay_1us();
	E12864_H;
	Delay_1us();
	E12864_L;
	Delay_1us();
	CS12864_H;
}

void Clr_Scr_12864(void)//清屏
{
	unsigned char col,page; //12864 占据128行8页每页128列
	for(page=0;page<8;page++)
	{
		Write_Com_12864(0X10);//SET COLUMN ADDRESS = 0X00 UPPER-4BIT 
		Write_Com_12864(0X00);//SET COLUMN ADDRESS = 0X00 LOWER-4BIT 
		Write_Com_12864(0xB0|(page&0X0F));
		for(col=0;col<128;col++)
		{
			Write_Data_12864(0x00);
		}
	}
}

void Set_Scr_12864(void)//全显示程序
{
	unsigned char col,page; //12864 占据128行8页每页128列
	for(page=0;page<8;page++)
	{
		Write_Com_12864(0X10);//SET COLUMN ADDRESS = 0X00 UPPER-4BIT 
		Write_Com_12864(0X00);//SET COLUMN ADDRESS = 0X00 LOWER-4BIT 
		Write_Com_12864(0xB0|(page&0X0F));
		for(col=0;col<128;col++)
		{
			Write_Data_12864(0xFF);
		}
	}
}

void Init_12864( void )
{
	RST12864_L;				//复位LCD
	Delay_Us(10);
	RST12864_H;
	Delay_Us(10);
	Write_Com_12864(0XA2);//LCDBIAS = 1/9
	Write_Com_12864(0XA0);//LCDADC = NORMAL
	Write_Com_12864(0XC8);//SHL = REVERSE
	Write_Com_12864(0X40);//初始化LINE=0;
	Write_Com_12864(0X2C);//POWER CONTRAL
	Delay_Ms(100);
	Write_Com_12864(0X2E);
	Delay_Ms(100);
	Write_Com_12864(0X2F);
	Delay_Ms(100);
	Write_Com_12864(0X26);//REGULATOR RESISTOR SELECT
	Write_Com_12864(0X81);//SET REFERENCE VOLATAG MODE
	Write_Com_12864(0X1A);
	Write_Com_12864(0XAF);//DISPLAY ON
	Write_Com_12864(0XB0);//SET PAGE ADDRESS = 0
	Write_Com_12864(0X10);//SET COLUMN ADDRESS = 0X00 UPPER-4BIT 
	Write_Com_12864(0X00);//SET COLUMN ADDRESS = 0X00 LOWER-4BIT 

}

⌨️ 快捷键说明

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