12864带字库显示屏滚屏显示

来源:互联网 发布:slay的网络意思 编辑:程序博客网 时间:2024/04/29 07:18

/*****************************************************/
//描述:LCD12864的驱动
//作者:happygrilclh

//时间:2015/07/16
//描述:显示屏的滚动,需要扩展指令
//卷地址只能滚屏64行,也就是2页(一页四行),那我只能定义虚拟页(page),让它来满足我一直滚屏显示我的文字。比如我的文字是四页
/*****************************************************/
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File

#define LCD_DATA (*((volatile Uint16 *)0x45EF))
#define E GpioDataRegs.GPBDAT.bit.GPIO61
#define RW GpioDataRegs.GPADAT.bit.GPIO27
#define RS GpioDataRegs.GPBDAT.bit.GPIO60
#define LOW 0
#define HIGH 1
#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H
#define AC_INIT 0x02 //将AC设置为00H。且游标移到原点位置
#define CURSE_ADD 0x06 //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)
#define FUN_MODE 0x30 //工作模式:8位基本指令集
#define DISPLAY_ON 0x0c //显示开,显示游标,且游标位置反白
#define DISPLAY_OFF 0x08 //显示关
#define CURSE_DIR 0x14 //游标向右移动:AC=AC+1
#define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH
#define SET_DD_AC 0x80

#define DELAY_MS(A) DELAY_US((long double)A * 1000.0L)
#define DELAY_100US(B) DELAY_US((long double)B * 100.0L)

void InitXintf(void);
void ConfigGpio(void);
void InitLcd(void);
void Read_Busy(void);
void WriteCmd12864(Uint16 cmd);
void WriteData12864(Uint16 dat);
void DisplayDdram(uchar *hz);
void DispBMP(uchar *adress);
void CLR_GDRAM(void);
void gunping(void);
void gunping1(void);
void gunping2(void);

//=========一页========================
uchar tab1[]="晴天有月来几时?";
uchar tab2[]="我今停杯一问之。";

uchar tab3[]="人攀明月不可得,";
uchar tab4[]="月行却与人相随。";
//========二页==========================
uchar tab5[]="胶白飞镜林丹阙,";
uchar tab6[]="绿烟灭尽清辉发。";

uchar tab7[]="但见宵从海上来,";
uchar tab8[]="宁知晓向云间没?";
//========三页==========================
uchar tab9[]="白兔捣药秋复春,";
uchar tab10[] = "嫦娥孤栖与谁邻?";

uchar tab11[] = "今人不见古时月,";
uchar tab12[]="今月曾经照古人";
//========四页==========================
uchar tab13[]="古人今人如流水,";
uchar tab14[]="共看明月皆如此。";

uchar tab15[]="唯愿当歌对酒时,";
uchar tab16[]="月光长照金樽里。";




void main(void)
{
uchar i;
uchar page = 0;
InitSysCtrl();
InitXintf();
InitXintf16Gpio();
DINT;
InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

ConfigGpio();
InitLcd();
WriteCmd12864(CLEAR_SCREEN);
DELAY_US(50);

gunping();

WriteCmd12864(0x34); //开启扩展指令
WriteCmd12864(0x03);//允许写入卷动地址
for(i = 0;i < 64; i++)
{
if((32 == i) & (0 == page))
{
WriteCmd12864(0x30); //返回到基本指令
WriteCmd12864(0x80);
DisplayDdram(tab5);
WriteCmd12864(0x90);
DisplayDdram(tab6);

WriteCmd12864(0x88);
DisplayDdram(tab7);
WriteCmd12864(0x98);
DisplayDdram(tab8);
WriteCmd12864(0x34); //开启扩展指令
WriteCmd12864(0x03);//允许写入卷动地址
}
else if((32 == i) & (1 == page))
{
WriteCmd12864(0x30); //返回到基本指令
WriteCmd12864(0x80);
DisplayDdram(tab9);
WriteCmd12864(0x90);
DisplayDdram(tab10);

WriteCmd12864(0x88);
DisplayDdram(tab11);
WriteCmd12864(0x98);
DisplayDdram(tab12);
WriteCmd12864(0x34); //开启扩展指令
WriteCmd12864(0x03);//允许写入卷动地址
}
else if((32 == i) & (2 == page))
{
WriteCmd12864(0x30); //返回到基本指令
WriteCmd12864(0x80);
DisplayDdram(tab13);
WriteCmd12864(0x90);
DisplayDdram(tab14);

WriteCmd12864(0x88);
DisplayDdram(tab15);
WriteCmd12864(0x98);
DisplayDdram(tab16);
WriteCmd12864(0x34); //开启扩展指令
WriteCmd12864(0x03);//允许写入卷动地址
}
else if((63 == i) & (0 == page))
{
i =0;
page++;
WriteCmd12864(0x30); //返回到基本指令
gunping1();
WriteCmd12864(0x34); //开启扩展指令
WriteCmd12864(0x03);//允许写入卷动地址


}
else if((63 == i) & (1 == page))
{
i =0;
page++;
WriteCmd12864(0x30); //返回到基本指令
gunping2();
WriteCmd12864(0x34); //开启扩展指令
WriteCmd12864(0x03);//允许写入卷动地址


}
else
{

}
WriteCmd12864(0x40 + i);
DELAY_MS(10);


}
WriteCmd12864(0x30); //返回到基本指令

}

void ConfigGpio(void)
{
EALLOW;
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO60 = 1;
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO61 = 1;
GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO27 = 1;
EDIS;
}

void InitLcd(void)
{
DELAY_100US(5);
WriteCmd12864(FUN_MODE);
DELAY_US(5);

WriteCmd12864(FUN_MODE);
DELAY_US(5);

WriteCmd12864(0x0C);
DELAY_US(5);

WriteCmd12864(CLEAR_SCREEN);
DELAY_US(30);

WriteCmd12864(AC_INIT);
DELAY_US(4);

}
void Read_Busy() //读忙标志最高位为1,则busy,不能进行读写操作
{
RS = LOW;
RW = HIGH;
E = HIGH;
while(LCD_DATA & 0X80);
E = LOW;
}
void WriteCmd12864(Uint16 cmd)
{
Read_Busy();
RS = LOW;
RW = LOW;//写数据
E = HIGH;
LCD_DATA  = cmd;
E = LOW;
}

void WriteData12864(Uint16 dat)
{
Read_Busy();
RS = HIGH;
RW = LOW;//写数据
E = HIGH;
LCD_DATA  = dat;
E = LOW;
}

void DisplayDdram(uchar *hz)
{
while(*hz != '\0')
{
WriteData12864(*hz);//地址里面的值
hz++;
}
}

void gunping()
{
WriteCmd12864(0x80);
DisplayDdram(tab1);
WriteCmd12864(0x90);
DisplayDdram(tab2);

WriteCmd12864(0xA0);
DisplayDdram(tab3);
WriteCmd12864(0xB0);
DisplayDdram(tab4);

WriteCmd12864(0x88);
DisplayDdram(tab3);
WriteCmd12864(0x98);
DisplayDdram(tab4);
WriteCmd12864(0xA8);
DisplayDdram(tab5);
WriteCmd12864(0xB8);
DisplayDdram(tab6);

}
void gunping1()
{
WriteCmd12864(0x80);
DisplayDdram(tab5);
WriteCmd12864(0x90);
DisplayDdram(tab6);

WriteCmd12864(0xA0);
DisplayDdram(tab7);
WriteCmd12864(0xB0);
DisplayDdram(tab8);

WriteCmd12864(0x88);
DisplayDdram(tab7);
WriteCmd12864(0x98);
DisplayDdram(tab8);
WriteCmd12864(0xA8);
DisplayDdram(tab9);
WriteCmd12864(0xB8);
DisplayDdram(tab10);

}

void gunping2()
{
WriteCmd12864(0x80);
DisplayDdram(tab9);
WriteCmd12864(0x90);
DisplayDdram(tab10);

WriteCmd12864(0xA0);
DisplayDdram(tab11);
WriteCmd12864(0xB0);
DisplayDdram(tab12);

WriteCmd12864(0x88);
DisplayDdram(tab11);
WriteCmd12864(0x98);
DisplayDdram(tab12);
WriteCmd12864(0xA8);
DisplayDdram(tab13);
WriteCmd12864(0xB8);
DisplayDdram(tab14);

}

有问题,请咨询,个人公众号。


 

0 0