lcd_12864.h

来自「LCD12864的串行和并行的驱动程序!」· C头文件 代码 · 共 205 行

H
205
字号
#ifndef LCD_12864_H
#define LCD_12864_H

#include<reg52.h>
#include"redefine.h" 

sbit CS=P1^0;		 //串行的片选信号
sbit SID=P1^1;		 //串行的数据口
sbit SCLK=P1^2;		 //串行的同步时钟
sbit PSB=P1^3;		 //并串接口选择
sbit RST=P1^5;		 //复位端口

uchar code position_TABLE[]={				  //坐标编码
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,};

/****************************************************************	 											  
              发送一个字节
*****************************************************************/
void send_byte(uchar Dbyte)
{
	uchar i;
	for(i=0;i<8;i++)
	{
		SCLK=0;
		Dbyte=Dbyte<<1;
		SID=CY;
		SCLK=1;
		SCLK=0;	
	}
}
/**********************************************************
              接收一个字节
***********************************************************/
uchar receive_byte(void)
{
	uchar i,temp1,temp2;
	temp1=temp2=0;
	for(i=0;i<8;i++)
	{
		temp1=temp1<<1;
		SCLK=0;
		SCLK=1;
		SCLK=0;
		if(SID)							   //当SID为0时,temp1移位,低位补0,相当于记录了SID=0;
			temp1++;					   //当SID为1,temp1移位后加一,相当于低位赋1,即记录了SID=1
	}
	for(i=0;i<8;i++)
	{
		temp2=temp2<<1;
	 	SCLK=0;
		SCLK=1;
		SCLK=0;
		if(SID)
			temp2++;	
	}
	return((temp1&0xf0)+(temp2&0x0f));			   //读完一个字节的数据
}
/****************************************************************
                      检查忙状态
******************************************************************/
void check_busy(void)
{
	do send_byte(0xfc);			   //11111,RW(1),RS(0),0
	while(0x80&receive_byte());			
}
/******************************************************************
           写一个字节的指令
*******************************************************************/
void write_command(uchar command)
{	
	CS=1;
	check_busy();
	send_byte(0xf8);			//11111,RW(0),RS(0),0
	send_byte(0xf0&command);
	send_byte(0xf0&command<<4);
	CS=0;
}
/*************************************************************
                 写一个字节的数据
**************************************************************/
void write_data(uchar dat)
{	
	CS=1;
	check_busy();
	send_byte(0xfa);		 //11111,RW(0),RS(1),0
	send_byte(0xf0&dat);
	send_byte(0xf0&dat<<4);
	CS=0;
}
/******************************************************************
                         lcd初始化函数
*******************************************************************/
void init(void)
{
	RST=1;
	PSB=0;					 //串行接法
	write_command(0x30);	 //基本指令集动作
	write_command(0x0c);	 //设置显示状态:整体显示
	write_command(0x01);	 //将DDRAM的内容填满'20H',即显示“空白”
	write_command(0x06);	 //设定游标移动方向
}
/**************************************************************
                                 设定光标函数
***************************************************************/
void Location_XY(uchar x,uchar y)
{
	switch(x)
	{
		case 0: x=0x80; break;
		case 1: x=0x90; break;
		case 2: x=0x88; break;
		case 3: x=0x98; break;
		default:x=0x80;	
	}
	y=y&0x07;
	write_command(0x30);
	write_command(y+x);					
	write_command(y+x);	
}
/***********************************************************************************
                  清除文本
************************************************************************************/
void Clear_text()
{	
	uchar i;
	write_command(0x30);
	write_command(0x80);
	for(i=0;i<64;i++)				//汉字是两个字节的编码
		write_data(0x20);
	Location_XY(0,0);	
}
/**************************************************************************************
                   清除图片
*****************************************************************************************/
void Clear_picture()
{
	uchar i,j;
	write_command(0x34);			  //扩充指令集动作
	write_command(0x36);			  //打开绘图显示
	for(i=0;i<32;i++)				  //由于在画图时,Y方向是以一个bit为单位的
	{
		write_command(0x80|i);		 //定行
		write_command(0x80);		 //定列
		for(j=0;j<32;j++)			 //列的32行,由12864的制造结构所决定
		write_data(0);		
	}
}
/****************************************************************************************
                      显示字符串
*****************************************************************************************/
void Put_Str(uchar row,uchar col,uchar *puts)
{
	write_command(0x30);
	write_command(position_TABLE[8*row+col]);
	while(*puts!='\0')
	{
		if(col==8)
		{
			col=0;
			row++;
		}
		if(row==4)
			row=0;
		write_command(position_TABLE[8*row+col]);
		write_data(*puts);						   //此行写汉字编码的两个字节中的第一个字节
		puts++;									   //此行使AC指向汉字编码的两个字节中的第二个字节
		if(*puts!='\0')
		{
			write_data(*puts);
			col++;
			puts++;
		}
	}	
}
/**************************************************************************
                      显示全屏图片
***************************************************************************/
void Put_picture(uchar *puts)
{          
	uint x=0,y=0;
	uchar i,j;			  				//循环变量
	write_command(0x34);				 //扩充指令集
	write_command(0x36);				 //开绘图显示
	for(i=0;i<32;i++)  			
	{
		write_command(0x80|i);	   	//此行用来定义“行”
		write_command(0x80);  		//此行用来定义“列”
		for(j=0;j<16;j++)    			//液晶的上半部分画图
		{                     
			write_data(puts[x]); 
			x++;
		}
		y=x-16; 
		for(j=0;j<16;j++)    			 //液晶的下半部分画图
		{                    
			write_data(puts[y+512]);	 	 
			y++;
		}
	}  
}

#endif

⌨️ 快捷键说明

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