DSP28335驅動LCD12864顯示源碼II(帶註釋及運行顯示)

顯示的行列指令與筆者之前一篇博客裏的方法有區別,但大同小異,這裏直接將行列指出,並顯示內容。端口可以根據硬件自檢配置。
#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 *pData);			//顯示子函數

uchar str[]={"我愛你中國"};			//顯示的內容

void main(void)
{
	InitSysCtrl();				//dsp初始化配置
	Init_Port();
	DINT;
	InitPieCtrl();
	IER = 0x0000;
	IFR = 0x0000;
	InitPieVectTable();

	LCD_init();				//lcd初始化

	LCD_write_command(0x80);		//用於在第1行第1列顯示
	DELAY_US(10);
	show(str);

	DELAY_US(10);
	LCD_write_command(0x91);		//用於在第2行第2列顯示
	DELAY_US(10);
	show(str);

	DELAY_US(10);
	LCD_write_command(0x88+2);		//用於在第3行第3列顯示
	DELAY_US(10);
	show(str);

	DELAY_US(10);
	LCD_write_command(0x98+3);		//用於在第4行第4列顯示
	DELAY_US(10);
	show(str);

	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();
;功    能:初始化LCD1602
;佔用資源:--
;參數說明:--
;-------------------------------------*/
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 show(uchar *pData)
{
	while( *pData != '\0' )
	{
		LCD_write_data( *pData );
		pData++;
		DELAY_US(10);
	}
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章