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

📄 lcd12864.c

📁 一个关于lcd12864并行的驱动程序
💻 C
字号:
//注意:忙检测在LCD12864并行接口时不能使用,暂时未找到原因
////////////////////////////////////////////////////////////////////
/////////****************LCD12864并行驱动******************/////////
/////////++++++++++++++   LCD12864.c   ++++++++++++++++++++/////////  
/////////基本功能:静态字符,汉字显示,静态图片显示等     //////////
/////////系统晶振:11.0582MHz						      //////////
/////////程序编写:东冬(dqing0625)				      //////////
/////////修改时间:2009年03月24日	  				      //////////
////////////////////////////////////////////////////////////////////

#include "stc89c52rc.h"
#include <intrins.h>
#include "MyType.h"
#include "LCD12864.h"
#include "Delaytime.h"

//======串口模式=======
sbit LCD12864_RS = P2^1;   	//片选信号输入
sbit LCD12864_RW = P2^2;  	//串行数据输入
sbit LCD12864_EN = P2^4; 	//串行移位脉冲输入
sbit LCD12864_PSB = P2^5;  	//串并模式选择 0:串口,1:并口
sbit LCD12864_RST = P1^3; 	//lcd12864复位

#define LCD12864_DATA  P0	//数据指令传输并行接口
/******************************************************************
名称:void LCD12864_Wbyte(uchar byte)
功能:向12864写入8位数据
指令:12M晶振,如果用22.1184或者24M晶振,延时要加倍
调用:
返回:无
/******************************************************************/
void LCD12864_Wbyte(uchar byte)
{
	
	LCD12864_RW = 0;	//RW(0)写字节
	_nop_();
	_nop_();
	LCD12864_EN = 1;
	_nop_();
	LCD12864_DATA = byte;		//写字节 	
	_nop_();
	_nop_();
    _nop_();
	_nop_();
	LCD12864_EN = 0;
	_nop_();
    _nop_();
	LCD12864_RW = 1;

}
/******************************************************************
名称:uchar LCD12864_Rbyte(void)
功能:从12864读出8位数据
指令:
调用:无
返回:sdat
/******************************************************************/
uchar LCD12864_Rbyte(void)
{
	uchar sdat;
	LCD12864_RW = 0;
	_nop_();
	LCD12864_RW = 1;	//RW(1)读字节
	_nop_();
	_nop_();
	LCD12864_EN = 1;
	_nop_();
	sdat = LCD12864_DATA;		//读出状态 ,
	_nop_();
	_nop_();	
	LCD12864_EN = 0 ;
	_nop_();
	_nop_();
	LCD12864_RW = 0;	//RW(1)读字节
	    
	return sdat;  
}
/******************************************************************
名称:void LCD12864_busy( void )
功能:读忙状态,
指令:
调用:
返回:无
/******************************************************************/
void LCD12864_busy( void )
{
	LCD12864_RS = 1;

	while(LCD12864_Rbyte()&0x80)//读BF,直到BF == 0*/
		{
		LCD12864_RS = 0;
		}
}
/******************************************************************
名称:void LCD12864_W(bit dat_com,uchar byte)
功能:dat_com=0写指令,dat_com=1写数据
指令:
调用:LCD12864_Wbyte();LCD12864_busy();
返回:无
/******************************************************************/
void LCD12864_W (bit dat_com,uchar byte)
{
//	LCD12864_busy();		//LCD忙检测

	LCD12864_RS = dat_com;
	 
	LCD12864_Wbyte(byte);	//写入字节

    LCD12864_RS = !dat_com;

}
/******************************************************************
名称:void LCD12864_Init(void)
功能:LCD12864初始化
指令:
调用:LCD12864_W();
返回:无
/******************************************************************/
void LCD12864_Init(void)
{
	
	LCD12864_PSB = 1;	//选择并口模式
	LCD12864_RST = 1;	//禁止复位
	LCD12864_W(LCD12864_COM,LCD12864_COM_BASIC);	//基本指令功能.
	LCD12864_W(LCD12864_COM,LCD12864_PLACE_ROLL);	//允许输入卷动位址
	LCD12864_W(LCD12864_COM,LCD12864_REST_OFF);		//脱离随眠状态,显示打开,关光标,反白关.
	LCD12864_W(LCD12864_COM,LCD12864_CLEAR);		//清屏指令.
	LCD12864_W(LCD12864_COM,LCD12864_CURSOR_RRF);	//AC自动加一,光标右移,整体显示不移动
}
/******************************************************************
名称:void LCD12864_Clear(void)
功能:LCD12864清屏
指令:
调用:LCD12864_W();
返回:无
/******************************************************************/
void LCD12864_Clear(void)
{
	LCD12864_W(LCD12864_COM,LCD12864_COM_BASIC);//基本指令功能.
	LCD12864_W(LCD12864_COM,LCD12864_CLEAR);	//清屏指令.
}
/******************************************************************
名称:void LCD12864_Wbmp(uchar *puts)
功能:LCD12864绘图
指令: 
调用:LCD12864_W();
返回:无
/******************************************************************/
void LCD12864_Wbmp(uchar *puts)
{
	uint x = 0;
	uchar i,j;

	LCD12864_W(LCD12864_COM,LCD12864_COM_PLOT_OFF);	//扩展指令集动作,绘图显示OFF

	for(i=0;i<32;i++)
		{
		LCD12864_W(LCD12864_COM,0x80|i);	//列32行,双屏结构中上半屏 
		LCD12864_W(LCD12864_COM,0x80);		//X地址坐标,自动加1.

		for(j=0;j<16;j++) 			//16*8=256
			LCD12864_W(LCD12864_DAT,puts[x++]);
		}

	for(i=0;i<32;i++)
		{
		LCD12864_W(LCD12864_COM,0x80|i);
		LCD12864_W(LCD12864_COM,0x88); //下半屏

		for(j=0;j<16;j++)
			LCD12864_W(LCD12864_DAT,puts[x++]);
		}
	LCD12864_W(LCD12864_COM,LCD12864_COM_PLOT_ON);	//扩展指令集动作,绘图显示ON

}
/******************************************************************
名称:void LCD12864_BMP_Clear( void )
功能:LCD12864清图像
指令:
调用:LCD12864_W();
返回:无
/******************************************************************/
void LCD12864_BMP_Clear( void )
{
     uchar i,j;

     LCD12864_W(LCD12864_COM,LCD12864_COM_PLOT_OFF);	//扩展指令集动作,绘图显示OFF
 
     for(i=0;i<32;i++)            //12864实际为256x32
		{
		LCD12864_W (LCD12864_COM,0x80|i);	//行位置
		LCD12864_W (LCD12864_COM,0x80);      //列位置

		for (j=0;j<32;j++)		//256/8=32 byte
			LCD12864_W(LCD12864_DAT,0);	//全部写入0即清除图像
		}
	LCD12864_W(LCD12864_COM,LCD12864_COM_PLOT_ON);		//扩展指令集动作,绘图显示ON
}
/******************************************************************
名称:void LCD12864_WPoss(uchar x,uchar y,uchar *buff)
功能:LCD12864字符位置自定义显示
指令:
调用:LCD12864_W();
返回:无
/******************************************************************/
void LCD12864_WPoss(uchar x,uchar y,uchar *buff)
{
	uchar addr,i=0;
	switch (x)
		{
		case 0:addr=0x80;break;
		case 1:addr=0x90;break;
		case 2:addr=0x88;break;
		case 3:addr=0x98;break;
		} 
	addr=addr+y;

	LCD12864_W(LCD12864_COM,LCD12864_COM_BASIC);	//8BitMCU,基本指令集合
	LCD12864_W(LCD12864_COM,addr);					//显示在自定义位置

	while(buff[i]!='\0')
		{	
		LCD12864_W(LCD12864_DAT,buff[i++]);
		if(++y==16)
			{
			y=0;
			if(++x==4) x=0;

			switch (x)
				{
				case 0:addr=0x80;break;
				case 1:addr=0x90;break;
				case 2:addr=0x88;break;
				case 3:addr=0x98;break;
				} 
			addr=addr+y;
			LCD12864_W(LCD12864_COM,addr);
			}
	
		}
}
/******************************************************************
名称:void LCD12864_TXT_Clear( void )
功能:LCD12864清文本
指令:
调用:LCD12864_W();
返回:无
/******************************************************************/
void LCD12864_TXT_Clear( void )
{
	uchar i;

	LCD12864_W(LCD12864_COM,LCD12864_COM_BASIC);	//8BitMCU,基本指令集合
	LCD12864_W(LCD12864_COM,0x80);	//AC归起始位,DDROM起始地址

	for(i=0;i<64;i++)
		LCD12864_W(LCD12864_DAT,0x20);	//字符编码0x20是空白字符
}

⌨️ 快捷键说明

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