液晶显示12864程序(调试通过)

#include "STC89C51RC_RD_PLUS.H"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int

/********************************************************
初始化设置命令,0 0 1 DL N F * *
DL=1 8位数据接口 DL=04位数据接口:
N=1 二行显示 N=0一行显示
F=1 5*10点阵显示 F=05*7点阵显示
*********************************************************
显示开关控制命令:0 0 0 0 1 D C B
D:表示显示开关 D=1开 D=0关
C:光标显示开关 C=1开 C=0关
B:表示闪烁开关 B=1开 B=0关
*********************************************************
输入方式设置命令:0 0 0 0 0 1 N S
N=1:数据读写后,地址指针自动加1,且光标加1
N=0:数据读写后,地址指针自动减1,且光标减1
S=1:数据读写操作,显示屏左移(N=1)或右移(N=0),以得到光标不
动,而屏幕移动的效果。
S=0:当写一个字符,整屏不动
********************************************************/

uchar code C51BOX2[3] _at_ 0x43; //仿真器用三字节空间
uchar code Megs0[]={"12864LCD测试程序"};
uchar code Megs1[]={" 富贵人 "};
uchar code Megs2[]={"QQ:1226649323"};
uchar code Megs3[]={" 2015 年 03月 20日"};

uchar code LogoCepark[] ={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x00,0x00,0x00,0x00,0x7F,0xFF,
0x00,0x00,0x00,0x03,0xFF,0xFF,0xC0,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x1F,
0xFF,0xFF,0xFE,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0x00,0x00,0x7F,0xFF,0xF8,0x07,0x80,
0x00,0xFF,0xFF,0xC0,0x00,0xC0,0x01,0xFF,0xFC,0x00,0x0C,0x00,0x03,0xFF,0xF0,0x10,
0x7F,0x00,0x07,0xFF,0xC0,0xF0,0xFF,0x80,0x07,0xFF,0x01,0xF0,0xFF,0xC0,0x0F,0xFE,
0x07,0xE0,0xFF,0x80,0x0F,0xFC,0x0F,0xE0,0xFF,0x80,0x1F,0xF0,0x1F,0xC1,0xFF,0x00,
0x1F,0xE0,0x7F,0x81,0xFE,0x04,0x3F,0xC0,0xFF,0x83,0xF8,0x0C,0x3F,0xC1,0xFF,0x03,
0xE0,0x1E,0x3F,0x81,0xFE,0x03,0x00,0x1E,0x7F,0x03,0xFC,0x00,0x00,0x7E,0x7F,0x07,
0xFC,0x00,0x00,0xFF,0x7E,0x07,0xF8,0x00,0x03,0xFF,0x7E,0x0F,0xF8,0x00,0x1F,0xFF,
0x7C,0x0F,0xF0,0x00,0xFF,0xFF,0x7C,0x0F,0xE0,0x1F,0xFF,0xFF,0x7C,0x0F,0xE0,0x1F,
0xFF,0xFF,0x7C,0x0F,0xC0,0x3F,0xFF,0xFE,0x3C,0x0F,0xC0,0x3F,0xFF,0xFE,0x3C,0x0F,
0x80,0x7F,0xFF,0xFE,0x3C,0x07,0x00,0x7F,0xFF,0xFE,0x1C,0x07,0x00,0xFF,0x8F,0xFC,
0x1E,0x03,0x00,0xFE,0x0F,0xFC,0x0E,0x03,0xFF,0xF8,0x3F,0xF8,0x0F,0x01,0xFF,0xE0,
0x7F,0xF8,0x07,0x80,0x3F,0x01,0xFF,0xF0,0x07,0xE0,0x00,0x07,0xFF,0xF0,0x03,0xF0,
0x00,0x1F,0xFF,0xE0,0x01,0xFF,0x03,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0xFF,0xFF,0xC0,
0x00,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x3F,0xFF,0xFF,0xFF,0x00,0x00,0x1F,0xFF,0xFF,
0xFC,0x00,0x00,0x0F,0xFF,0xFF,0xF8,0x00,0x00,0x03,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0xFF,0xFF,0x80,0x00,0x00,0x00,0x1F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

uchar code LogoCode[]={ //宽48高48
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x0

0,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x07,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x1F,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x3F,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xF0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0xFF,0xFF,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xFF,0xF8,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x07,0xFF,0xE0,0x20,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0xFF,0x81,0xE1,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0xFE,0x03,0xE1,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0xFC,0x0F,0xC1,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0xF8,0x1F,0xC1,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x3F,0xE0,0x3F,0x83,0xFE,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x3F,0xC0,0xFF,0x03,0xFC,0x08,0x00,0x0C,0x00,0x0F,0xFF,0x80,0xFF,0xFF,0x80,
0x00,0x7F,0x81,0xFF,0x07,0xF0,0x18,0x00,0x0C,0x00,0x00,0x03,0x00,0xC0,0x01,0x80,
0x00,0x7F,0x83,0xFE,0x07,0xC0,0x3C,0x03,0xFF,0xF8,0x00,0x0E,0x00,0xC0,0x01,0x80,
0x00,0x7F,0x03,0xFC,0x06,0x00,0x3C,0x03,0x0C,0x18,0x00,0x1C,0x00,0xFF,0xFD,0x80,
0x00,0xFE,0x07,0xF8,0x00,0x00,0xFC,0x03,0x0C,0x18,0x00,0x70,0x00,0xC0,0x01,0x80,
0x00,0xFE,0x0F,0xF8,0x00,0x01,0xFE,0x03,0x0C,0x18,0x00,0x70,0x00,0xC0,0x01,0x80,
0x00,0xFC,0x0F,0xF0,0x00,0x07,0xFE,0x03,0xFF,0xF8,0x00,0x18,0x00,0xFF,0xFF,0x80,
0x00,0xFC,0x1F,0xF0,0x00,0x3F,0xFE,0x03,0x0C,0x18,0x3F,0xFF,0xF0,0xC6,0xC1,0x80,
0x00,0xF8,0x1F,0xE0,0x01,0xFF,0xFE,0x03,0x0C,0x18,0x00,0x0C,0x00,0xC6,0xC1,0x80,
0x00,0xF8,0x1F,0xC0,0x3F,0xFF,0xFE,0x03,0x0C,0x18,0x00,0x0C,0x00,0xC6,0xC1,0x80,
0x00,0xF8,0x1F,0xC0,0x3F,0xFF,0xFE,0x03,0x0C,0x18,0x00,0x06,0x00,0xCC,0xC7,0x80,
0x00,0xF8,0x1F,0x80,0x7F,0xFF,0xFC,0x03,0xFF,0xF8,0x00,0x06,0x00,0xCC,0xC7,0x80,
0x00,0x78,0x1F,0x80,0x7F,0xFF,0xFC,0x00,0x0C,0x06,0x00,0x06,0x00,0xD8,0xCD,0x80,
0x00,0x78,0x1F,0x00,0xFF,0xFF,0xFC,0x00,0x0C,0x06,0x00,0x0E,0x00,0xF0,0x7D,0x80,
0x00,0x78,0x0E,0x00,0xFF,0xFF,0xFC,0x00,0x0C,0x06,0x06,0x0C,0x00,0xE0,0x01,0x80,
0x00,0x38,0x0E,0x01,0xFF,0x1F,0xF8,0x00,0x07,0xFE,0x03,0xF8,0x00,0xFF,0xFF,0x00,
0x00,0x3C,0x06,0x01,0xFC,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1C,0x07,0xFF,0xF0,0x7F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1E,0x03,0xFF,0xC0,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0x00,0x7E,0x03,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0xC0,0x00,0x0F,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x07,0xE0,0x00,0x3F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xFE,0x07,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xFF,0xFF

,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x3F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x1F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x07,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x01,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,
0x03,0x80,0xE0,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,
0x01,0x80,0x60,0x00,0x01,0x86,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,
0x01,0x80,0x60,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,
0x01,0x80,0x60,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,
0x01,0xB8,0x6E,0x1E,0x06,0x00,0x1C,0x17,0x07,0x05,0x33,0x00,0xF1,0xF0,0x5E,0xE0,
0x01,0xDC,0x77,0x32,0x06,0x00,0x66,0x7B,0x89,0x9F,0x32,0x01,0x13,0x19,0xE7,0x30,
0x01,0x8C,0x63,0x3C,0x06,0x00,0x66,0x31,0x81,0x8C,0x34,0x03,0x13,0x18,0xC6,0x30,
0x01,0x8C,0x63,0x3E,0x06,0x00,0x7E,0x31,0x87,0x8C,0x3C,0x03,0x03,0x18,0xC6,0x30,
0x01,0x8C,0x63,0x06,0x03,0x00,0x60,0x31,0x99,0x8C,0x36,0x03,0x03,0x18,0xC6,0x30,
0x01,0x98,0x66,0x26,0xC1,0x82,0x70,0x33,0x19,0x8C,0x33,0x33,0x83,0x18,0xC6,0x30,
0x01,0xE0,0x78,0x3C,0xC0,0xFC,0x3C,0x3E,0x1F,0xDE,0x7B,0xB1,0xF1,0xF1,0xEF,0x38,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
} ;
/***************硬件相关设定********************/

sbit RS_12864=P1^0; //各控制脚
sbit RW_12864=P1^1;
sbit EN_12864=P1^2;
sfr DataPort_12864=0x80; //P0数据口

sbit CS_12864=P1^0; //串行片选
sbit SID_12864=P1^1; //串行数据
sbit CLK_12864=P1^2; //串行时钟
sbit RST_12864=P1^5; //串行复位
sbit PSSel=P1^3; //串并选择


//延时子程序
void mDelay(uint i) //延时子程序 ,每加1增加0.5ms
{
for (;i>0;i--)
{uchar j=244;while(--j);}
}


void uDelay(uchar i) //延时子程序,入口参数每加1约加50.1us
{
for(;i>0;i--)
{uchar j=20;while(--j);}
}



/*----------------12864 串行通信使用程序---------------------*/
/*
void SendDat_12864(uchar Dat)
{
uchar i;
for(i=0;i<8;i++)
{
SID_12864=(Dat<CLK_12864=1;CLK_12864=0;
}
}

void Write12864(uchar Dat,uchar command) //入口:数据,指令(1为写数据,0为写指令)
{
CS_1

2864=1;
SendDat_12864(0xf8|(command<<1));
SendDat_12864(Dat&0xf0);
SendDat_12864(Dat<<4);
CLK_12864=0;
CS_12864=0;
}

void Init12864() //初始化子程序
{
PSSel=0; //选择为串口方式
RST_12864=0; RST_12864=1; //复位
Write12864(0x01,0); //清屏
mDelay(10);
Write12864(0x0c,0); //开显示,光标不显示
}

*/
/*--------------12864 8线使用程序-------------------------- */
//*********************************************************/
void Read12864() //读忙状态
{
uchar i=255; //建一个循环变量避免器件发生故障停在这里
DataPort_12864=0xff; //将数据口置为高电平
RS_12864=0; RW_12864=1; //设置LCD为读取数据状态
EN_12864=1; //使能LCD,高电平
while ((i--)&&(DataPort_12864&0x80)); //检测数据口最高位状态,为0则空闲
EN_12864=0; //关闭使能
}

void Write12864(uchar Dat,bit command)
{ //写操作,入口参数:数据,指令(1为写数据,0为写指令)
Read12864();
DataPort_12864=Dat; //数据送出
RS_12864=command; //RS为1写数据、为0写指令
RW_12864=0; //RW为低,进行写操作
EN_12864=1;EN_12864=0; //E端控制一个高脉冲
}

void Init12864() //初始化子程序
{
PSSel=1;
Write12864(0x38,0); //8位点阵方式
mDelay(10);
Write12864(0x01,0); //清屏
mDelay(10);
Write12864(0x0c,0); //开显示,光标不显示
}
/***************************************************************/

/*--------------12864 4线使用程序-------------------------- */
/************************************************************

void Read12864() //读忙状态
{
uchar i=255; //建一个循环变量避免器件发生故障停在这里
DataPort_12864=0xff; //将数据口置为高电平
RS_12864=0; RW_12864=1; //设置LCD为读取数据状态
EN_12864=1; //使能LCD,高电平
while ((i--)&&(DataPort_12864&0x80)); //检测数据口最高位状态,为0则空闲
EN_12864=0; //关闭使能
}

void Write12864(uchar Dat,bit command)
{ //写操作,入口参数:数据,指令(1为写数据,0为写指令)
Read12864(); //每次写之前忙判断
DataPort_12864=Dat; //高四位数据送出
RS_12864=command; //RS为1写数据、为0写指令
RW_12864=0; //RW为低,进行写操作
EN_12864=1;EN_12864=0; //E端控制一个高脉冲
//送完高4位马上送低4位,中间不必延时,延时反而会有问题
DataPort_12864=Dat<<4; //低四位数据送出
RS_12864=command; //RS为1写数据、为0写指令
RW_12864=0; //RW为低,进行写操作
EN_12864=1;EN_12864=0; //E端控制一个高脉冲
}

void Init12864() //初始化子程序
{
Write12864(0x28,0); //4位点阵方式
mDelay(10);
Write12864(0x01,0); //清屏
mDelay(10);
Write12864(0x0c,0); //开显示,光标不显示
}
/*******************

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

void WrString12864(uchar x,uchar y,uchar *p) //多字符写入,入口参数:x行(0~3),y列(0~7),字符串
{
if(x==1)x=2;
else if(x==2)x=1;
Write12864(0x80+8*x+y,0); //合并生成坐标地址写入LCD12864
while(*p) {Write12864(*p,1);p++;}
}


void WrGdram12864(uchar x,uchar y,uchar *map,uchar high,uchar wide) //写12864 GDRAM,入口参数:x行,y列,数据,h高,w宽,
{
uchar line,row;
Write12864(0x36,0); //切换到扩充模式,打开图形显示
if(wide%8==0)wide=wide/8;
else wide=wide/8+1; //求出宽度为多少个字节。
for(line=0;line{
if(x+line>31)
{Write12864(0x80+x+line-32,0);Write12864(0x80+y+8,0);}
else {Write12864(0x80+x+line,0);Write12864(0x80+y,0);} //写入行首地址,列首地址
for(row=0;rowWrite12864(map[line*wide+row],1); //写入数据。

}
}

void ClrGdram12864()//清GDRAM
{
uchar line,row;
Write12864(0x34,0); //扩展指令,关图形显示
for(line=0;line<32;line++)
{
Write12864(0x80+line,0),Write12864(0x80,0); //写入行首、列首地址
for (row=0;row<32;row++)Write12864(0,1); //填充数据0
}
}

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

void Test12864_1()
{
uchar i;
Init12864();
Write12864(1,0);mDelay(500);
Write12864(0x07,0);Write12864(0x90,0);//左移,从0x90开始写入数据,指令07为左移
for(i=0;i<32;i++)
{
Write12864(Megs0[i],1);
mDelay(800);
}
Write12864(0x5,0); //指令05为右移
for(i=0;i<33;i++)
{
Write12864(0x20,1);
mDelay(800);
}
Write12864(0x07,0);Write12864(0xd0,0); //第二行
for(i=0;i<32;i++)
{
Write12864(Megs1[i],1);
mDelay(800);
}
Write12864(0x5,0);
for(i=0;i<33;i++)
{
Write12864(0x20,1);
mDelay(800);
}
}


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

void Test12864()
{
Init12864();
WrString12864(0,0,Megs0);
WrString12864(1,0,Megs1);
WrString12864(2,0,Megs2);
WrString12864(3,0,Megs3);
mDelay(8000);
}

void main()
{
Init12864();
ClrGdram12864();//清GDRAM
Write12864(0x38,0);//切换回字符模式显示字符
WrString12864(0,0,"欢迎加入我们");
WrString12864(1,1,"1226649323");
WrString12864(2,0," 富贵人");
WrString12864(3,0,"电子开发设计");

while(1);
}

相关文档
最新文档