12864带字库显示屏滚屏显示

    xiaoxiao2021-03-25  153

    /*****************************************************/ //描述: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); } 有问题,请咨询,个人公众号。

     

    转载请注明原文地址: https://ju.6miu.com/read-18015.html

    最新回复(0)