DSP

DSP28335驱动LCD12864显示源码(带注释及运行显示)

2019-07-13 10:09发布

参考了网上的一些方法,内部GPIO口每个板子的出厂配置不一样,需要自己调整。其他都是ok的。 #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "DSP2833x_Examples.h" // DSP2833x Examples Include File /***************全局变量定义****************/ #define uchar unsigned char /****************端口宏定义*****************/ #define RS GpioDataRegs.GPADAT.bit.GPIO0 //#define RW GpioDataRegs.GPADAT.bit.GPIO2 #define EN GpioDataRegs.GPADAT.bit.GPIO1 #define DB GpioDataRegs.GPADAT.all // 使用前,声明本文件中的相关函数 void Init_Port(void); //端口初始化 void LCD_init(void); //初始化函数 void LCD_write_command(uchar command); //写指令函数 void LCD_write_data(uchar dat); //写数据函数 void LCD12864SetAddress_f( uchar x, uchar y ); //地址转换 void show(uchar x,uchar y,uchar *pData); //用于显示的子函数 void main(void) { InitSysCtrl(); //dsp初始化配置 Init_Port(); DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); LCD_init(); //12864初始化 show( 0,0, "我爱你中国!"); //在12864的第1行第1列显示 show( 2,1, "我在江苏") ; //在12864的第2行第3列显示 show( 0,2, "*F28335LCD12864*") ; //在12864的第3行第1列显示 show( 0,3, "1111111111111111"); //在12864的第4行第1列显示 while(1); } /*------------------------------------------*/ /*形式参数:void */ /*返回值:void */ /*函数描述:初始化gpio端口 */ /*------------------------------------------*/ void Init_Port(void) { EALLOW; // 用户根据需要可以使能内部上拉或禁止. // 其他不需要的行注释掉; GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; // 使能GPIO1 引脚内部上拉 GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1; // 禁止GPIO3 引脚内部上拉 /* 通过I/O功能选择寄存器配置通用I/O功能*/ GpioCtrlRegs.GPAMUX1.all = 0x000000; // 配置GPIO0-GPIO15为通用I/O口 /* 设置I/O口为输入引脚*/ GpioCtrlRegs.GPADIR.all = 0x00FFF;// 配置GPIO1-GPIO11为输出引脚 // 每个输入口可以有不同的输入限定 // a) 输入与系统时钟 SYSCLKOUT同步 // b) 输入被指定的采样窗口限定 // c) 输入异步 (仅对外设输入有效) GpioCtrlRegs.GPAQSEL1.all = 0x0000; // GPIO0-GPIO15与系统时钟SYSCLKOUT 同步 //输出数据LCD_RS置1和LCD_EN清零 GpioDataRegs.GPADAT.bit.GPIO0 = 1; GpioDataRegs.GPADAT.bit.GPIO1 = 0; EDIS; } /*-------------------------------------- ;模块名称:LCD_write_command(); ;功 能:LCD12864写指令函数 ;参数说明:command为写命令参数 ;-------------------------------------*/ void LCD_write_command(uchar command) { RS=0; //指令 EN=1; //允许 DB=(command<<2)|0x0002;//赋值给D0-D7对应的GPIO4-GPIO11引脚 DELAY_US(10000); EN=0; DELAY_US(100); } /*-------------------------------------- ;模块名称:LCD_write_data(); ;功 能:LCD12864写数据函数 ;占用资源: P2.0--RS(LCD_RS),P2.1--RW(LCD_RW),P2.2--E(LCD_E). ;参数说明:dat为写数据参数 ;-------------------------------------*/ void LCD_write_data(uchar dat) { RS=1; //指令 EN=1; //允许 DB=(dat<<2)|0x0003;//赋值给D0-D7对应的GPIO4-GPIO11引脚 DELAY_US(10000); EN=0; DELAY_US(100); } /*-------------------------------------- ;模块名称:LCD_init(); ;功 能:初始化LCD12864 ;占用资源:-- ;参数说明:-- ;-------------------------------------*/ void LCD_init(void) { DELAY_US(100000);//延迟100ms LCD_write_command(0x30);//功能设置 DELAY_US(200);//延迟200us LCD_write_command(0x30);//功能设置 DELAY_US(200);//延迟200us LCD_write_command(0x0c);//显示开关控制 DELAY_US(200);//延迟200us LCD_write_command(0x01);//显示清除 DELAY_US(12000);//延迟12ms LCD_write_command(0x06);//显示清除 DELAY_US(500);//延迟500us } void LCD12864SetAddress_f( uchar x, uchar y ) //地址转换 { unsigned char byAddress; switch( y ) { case 0 : byAddress = 0x80 + x; break; case 1 : byAddress = 0x90 + x; break; case 2 : byAddress = 0x88 + x; break; case 3 : byAddress = 0x98 + x; break; default : break; } LCD_write_command( byAddress ) ; } void show(uchar x,uchar y,uchar *pData) { LCD12864SetAddress_f( x, y ); //地址转换 while( *pData != '