📄 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 + -