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

📄 lcd_12864.h

📁 LCD12864的串行和并行的驱动程序!
💻 H
字号:
#ifndef LCD_12864p_H
#define LCD_12864p_H

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

#define DB P0

sbit RS=P2^7;		 //并行的指令、数据选择信号
sbit RW=P2^6;		 //并行的读、写选择信号
sbit EN=P2^5;		 //并行的使能信号
sbit PSB=P2^4;		 //并行、串行方式的选择
sbit RST=P2^2;		 //复位端口

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 check_busy(void)
{
	DB=0xff;
	EN=0;
	RS=0;
	RW=1;
	while(1)
	{
		delay10us(1);
		EN=1;
		delay10us(3);
		if((0x80&DB==0))	break;
		delay10us(1);
		EN=0;	
	}
	EN=0;				
}

/******************************************************************
           写一个字节的指令
*******************************************************************/
void write_command(uchar command)
{	
	check_busy();
	EN=0;
	RS=0;
	RW=0;
	DB=command;
	delay10us(2);
	EN=1;
	delay10us(3);
	EN=0;
}
/*************************************************************
                 写一个字节的数据
**************************************************************/
void write_data(uchar dat)
{	
	check_busy();
	EN=0;
	RS=1;
	RW=0;
	DB=dat;
	delay10us(2);
	EN=1;
	delay10us(3);
	EN=0;
}
/******************************************************************
                         lcd初始化函数
*******************************************************************/
void init(void)
{
	RST=1;
	PSB=0;					 //串行接法
	delay10us(5);
	delay10us(5);
	write_command(0x30);	 //基本指令集动作
	delay10us(5);
	write_command(0x0c);	 //设置显示状态:整体显示
	delay10us(10);
	write_command(0x01);	 //将DDRAM的内容填满'20H',即显示“空白”
	delay10us(10);
	write_command(0x06);	 //设定游标移动方向
	delay10us(10);
	write_command(0x80);
}
/**************************************************************
                                 设定光标函数
***************************************************************/
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);				//设定DDRAM的地址计数器AC
	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 write_Str(uchar datacode[])
{
	uchar i;
	while(datacode[i]!='\0')
	{
		write_data(datacode[i]);
		i++;
		if(i==0xff)break;
	}	
}

/****************************************************************************************
              在x行y列处显示字符串
*****************************************************************************************/
void Put_Str(uchar row,uchar col,uchar string[])
{
	write_command(0x30);
	Location_XY(row,col);
	write_Str(string);	
}
/**************************************************************************
                      显示全屏图片
***************************************************************************/
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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -