12864带字库显示屏自定义字符显示CGRAM

/*****************************************************/
//描述:LCD12864的驱动
//作者:小四叶草
//时间:2015/06/30
//CGRAM 字符发生RAM,用户自定义4个16×16字符
//功能:显示自定义的字符
/*****************************************************/
#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 DisplayChar();
void CGRAM(void);

uchar A[] = "输出功率:";
uchar A_DATA[] = "123.45";
uchar B[] = "日发电量:";
uchar B_DATA[] = "123.45";
uchar C[] = "本月发电量:";
uchar C_DATA[] = "123.45";
uchar D[] = "总发电量:";
uchar D_DATA[] = "123.45";
uchar danwei[] = " kWh";
uchar danwei_kw[] = " kW";

uchar fanlong[] = {0x10,0x80,0x08,0x80,0x7E,0xFC,0x24,0x80,0x18,0xFC,0xFF,0x04,0x00,0xFC,0x3E,0x80,
				0x22,0xF8,0x3E,0x80,0x22,0xF8,0x3E,0x80,0x22,0xFA,0x22,0x82,0x2A,0x82,0x24,0x7E};/*龍,16 X 16 ,逐行式,顺向(高位,低位)*/

uchar guo[] = {0x7F,0xFC,0x40,0x84,0x40,0xA4,0x40,0xA4,0x5F,0xF4,0x40,0x84,0x5E,0xA4,0x52,0xB4,
			   0x5E,0x64,0x40,0x44,0x46,0xD4,0x59,0x54,0x42,0x24,0x40,0x04,0x7F,0xFC,0x40,0x04};/*"國",0*//* (16 X 16 , 宋体 )*/

void main(void)
{
	InitSysCtrl();
	InitXintf();
	InitXintf16Gpio();
	DINT;
	InitPieCtrl();
	
	IER = 0x0000;
	IFR = 0x0000;
	
	ConfigGpio();
	InitLcd();
	WriteCmd12864(CLEAR_SCREEN);
	DELAY_US(50);
	DisplayChar();
	while(1)
	{
		//DisplayChar();
	}
}

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 DisplayChar()
{	

	WriteCmd12864(0x81);
	DisplayDdram(A);
	
	CGRAM();
	
	WriteCmd12864(0x90);
	WriteData12864(0x00);
	WriteData12864(0x00);
	
	WriteCmd12864(0x88);
	WriteData12864(0x00);
	WriteData12864(0x02);
	
	WriteCmd12864(0x98);
	WriteData12864(0x00);
	WriteData12864(0x04);

	WriteData12864(0x00);
	WriteData12864(0x06);
}
void DisplayDdram(uchar *hz)
{
	while(*hz != '\0')
	{
		WriteData12864(*hz);//地址里面的值
		hz++;
	}
}
/*======================================================================
自定义函数:CGRAM 自定义显示字符对应地址及编码
地址			显示编码
0x40			0x0000
0x50			0x0002
0x60			0x0004
0x70			0x0006
CGRAM的地址是从0X40开始的,0x40+16 = 0x50;以后的地址就是加16得到的。
======================================================================*/
void CGRAM()
{
	uchar i;
	WriteCmd12864(0x40);//CGRAM的地址
	
	WriteCmd12864(0x30);//基本指令
	for(i=0;i<32;i++)
	{
		WriteData12864(fanlong[i]); //
	}
	
	WriteCmd12864(0x50);
	for(i=0;i<32;i++)
	{
		WriteData12864(guo[i]); //
	}
	
	WriteCmd12864(0x60);
	for(i=0;i<32;i++)
	{
		WriteData12864(guo[i]); //
	}

	WriteCmd12864(0x70);
	for(i=0;i<32;i++)
	{
		WriteData12864(guo[i]); //
	}
}

你可能感兴趣的:(12864显示屏)