/*****************************************************/ //描述:LCD12864的驱动 //作者:happygrilclh //时间:2015/06/30 /*****************************************************/ #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 WriteCmd12864(Uint16 cmd); void WriteData12864(Uint16 dat); void DisplayDdram(uchar *hz); void DisplayChar(); uchar A[] = {"输 出功率:"}; uchar B[] = {"当天发电量:"}; uchar C[] = {"当月发电量:"}; uchar D[] = {"总 发电量:"}; void main(void) { InitSysCtrl(); InitXintf(); InitXintf16Gpio(); DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; ConfigGpio(); InitLcd(); DisplayChar(); while(1); } 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(DISPLAY_ON); DELAY_US(5); WriteCmd12864(CLEAR_SCREEN); DELAY_US(20); WriteCmd12864(AC_INIT); DELAY_US(4); } void WriteCmd12864(Uint16 cmd) { RS = LOW; RW = LOW;//写数据 E = HIGH; LCD_DATA = cmd; E = LOW; } void WriteData12864(Uint16 dat) { RS = HIGH; RW = LOW;//写数据 E = HIGH; LCD_DATA = dat; E = LOW; } void DisplayChar() { WriteCmd12864(0x80); DELAY_US(5); DisplayDdram(A); WriteCmd12864(0x90); DELAY_US(5); DisplayDdram(B); WriteCmd12864(0x88); DELAY_US(5); DisplayDdram(C); WriteCmd12864(0x98); DELAY_US(5); DisplayDdram(D); } void DisplayDdram(uchar *hz) { while(*hz != '\0') { WriteData12864(*hz);//地址里面的值 hz++; DELAY_US(3); } }
有问题,请咨询,个人公众号。