www.pudn.com > sound-source-location.rar > st7565.c, change:2014-07-30,size:7787b


#include "st7565.h" 
 
/******************************************************************************* 
* 函 数 名         : LCD12864_WriteCmd 
* 函数功能		   : 写入一个命令到12864 
* 输    入         : cmd 
* 输    出         : 无 
*******************************************************************************/ 
 
//LcdSt7565_WriteCmd(cmd) {LCD12864_CS = 0;LCD12864_RD = 1;LCD12864_RS = 0;LCD12864_WR = 0;delay_us(1);delay_us(1);DATAOUT(cmd);delay_us(1);delay_us(1);LCD12864_WR = 1;} 
 
/******************************************************************************* 
* 函 数 名         : LcdSt7565_WriteData 
* 函数功能		   : 写入一个数据到12864 
* 输    入         : dat 
* 输    出         : 无 
*******************************************************************************/ 
 
//void LcdSt7565_WriteData(uint8_t dat) 
//{	 
//	LCD12864_CS = 0;	   //chip select,打开片选 
//	LCD12864_RD = 1;	   //disable read,读失能	 
//	LCD12864_RS = 1;       //select data,选择数据 
//	LCD12864_WR = 0;       //select write,选择写模式 
//	delay_us(1); 
//	delay_us(1); 
 
//	DATAOUT(dat);       //put data,放置数据 
//	delay_us(1); 
//	delay_us(1); 
 
//	LCD12864_WR = 1;	   //data writing,写数据  
//} 
/******************************************************************************* 
* 函 数 名         : LCD12864_Init 
* 函数功能		   : 初始化12864 
* 输    入         : 无 
* 输    出         : 无 
* 说    明         : LCD12864的命令指令可以查看例程文件夹下的《ST7565p数据手册》 
*                  * 的第51页的位置。 
*******************************************************************************/ 
 
void Lcd12864_Init() 
{ 
	uchar i; 
 	GPIO_InitTypeDef  GPIO_InitStructure; 
	 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE); 
 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	//???? 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;	//??2MHz 
	GPIO_Init(GPIOB, &GPIO_InitStructure);	//??? 
//#if LCM_MODE	 
	/* 设置数据总线PC0~7 */ 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;	//??50MHz 
 	GPIO_Init(GPIOC, &GPIO_InitStructure);						//??? 
	 
	 
	//SET_DATA_OUT();   //设置数据总线为输出模式 
//#else 
	/* 设置PC9、10、11、12为输出模式 */ 
//	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12; 
//	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//??50MHz 
// 	GPIO_Init(GPIOC, &GPIO_InitStructure); 
//	LCM_CLK=0; 
//#endif 
 
//	LCM_RST=0;	//??12864 
//  delay_ms(50); 
//	LCM_RST=1; 
//	delay_ms(30); 
 
//	LCM_WriteCmd(0x30);//????,???8???,????? 
//	LCM_WriteCmd(0x0C);//0000,1100  ????,??off,????off 
//	LCM_WriteCmd(0x01);//0000,0001 ?DDRAM 
//	LCM_WriteCmd(0x02);//0000,0010 DDRAM???? 
//	LCM_WriteCmd(0x80);//1000,0000 ??DDRAM 7???000,0000??????AC//      
//	LCM_WriteCmd(0x04);//???,????/????????,DDRAM??? ?//    
//	LCM_WriteCmd(0x0C);//????,???,????,????????? 
//} 
 
 
//void Lcd12864_Init() 
//{ 
	LCD12864_RSET = 0; 
	delay_us(100); 
	LCD12864_CS = 0; 
	LCD12864_RSET = 1; 
	 
	//----------------Star Initial Sequence-------// 
	//------程序初始化设置,具体命令可以看文件夹下---// 
 
	//--软件初始化--// 
	LcdSt7565_WriteCmd(0xE2);  //reset 
	delay_us(100);	   //延时一下 
 
	//--表格第8个命令,0xA0段(左右)方向选择正常方向(0xA1为反方向)--// 
	LcdSt7565_WriteCmd(0xA1);  //ADC select segment direction  
	 
	//--表格第15个命令,0xC8普通(上下)方向选择选择反向,0xC0为正常方向--//  
	LcdSt7565_WriteCmd(0xC8);  //Common direction  
	                   
	//--表格第9个命令,0xA6为设置字体为黑色,背景为白色---// 
	//--0xA7为设置字体为白色,背景为黑色---// 
	LcdSt7565_WriteCmd(0xA6);  //reverse display 
 
	//--表格第10个命令,0xA4像素正常显示,0xA5像素全开--// 
	LcdSt7565_WriteCmd(0xA4);  //normal display 
	 
	//--表格第11个命令,0xA3偏压为1/7,0xA2偏压为1/9--// 
	LcdSt7565_WriteCmd(0xA2);  //bias set 1/9 
	 
	//--表格第19个命令,这个是个双字节的命令,0xF800选择增压为4X;--// 
	//--0xF801,选择增压为5X,其实效果差不多--//	 
	LcdSt7565_WriteCmd(0xF8);  //Boost ratio set 
	LcdSt7565_WriteCmd(0x01);  //x4 
	 
	//--表格第18个命令,这个是个双字节命令,高字节为0X81,低字节可以--// 
	//--选择从0x00到0X3F。用来设置背景光对比度。---/ 
	LcdSt7565_WriteCmd(0x81);  //V0 a set 
	LcdSt7565_WriteCmd(0x23); 
 
	//--表格第17个命令,选择调节电阻率--// 
	LcdSt7565_WriteCmd(0x25);  //Ra/Rb set 
	 
	//--表格第16个命令,电源设置。--// 
	LcdSt7565_WriteCmd(0x2F); 
	delay_us(100); 
 
	//--表格第2个命令,设置显示开始位置--// 
	LcdSt7565_WriteCmd(0x40);  //start line 
 
	//--表格第1个命令,开启显示--// 
	LcdSt7565_WriteCmd(0xAF);  // display on 
	delay_us(100); 
 
} 
 
/******************************************************************************* 
* 函 数 名         : LCD12864_ClearScreen 
* 函数功能		   : 清屏12864 
* 输    入         : 无 
* 输    出         : 无 
*******************************************************************************/ 
 
void Lcd12864_ClearScreen(void) 
{ 
	uchar i, j; 
 
	for(i=0; i<8; i++) 
	{ 
		//--表格第3个命令,设置Y的坐标--// 
		//--Y轴有64个,一个坐标8位,也就是有8个坐标--// 
		//所以一般我们使用的也就是从0xB0到0x07,就够了--//	 
		LcdSt7565_WriteCmd(0xB0+i);  
 
		//--表格第4个命令,设置X坐标--// 
		//--当你的段初始化为0xA1时,X坐标从0x10,0x04到0x18,0x04,一共128位--// 
		//--当你的段初始化为0xA0时,X坐标从0x10,0x00到0x18,0x00,一共128位--// 
		//--在写入数据之后X坐标的坐标是会自动加1的,我们初始化使用0xA0所以--// 
		//--我们的X坐标从0x10,0x00开始---// 
		LcdSt7565_WriteCmd(0x10);  
		LcdSt7565_WriteCmd(0x04);							    
		 
		//--X轴有128位,就一共刷128次,X坐标会自动加1,所以我们不用再设置坐标--// 
		for(j=0; j<128; j++) 
		{ 
			LcdSt7565_WriteData(0x00);  //如果设置背景为白色时,清屏选择0XFF 
		} 
	} 
} 
 
/******************************************************************************* 
* 函 数 名         : LCD12864_Write16CnCHAR 
* 函数功能		   : 在12864上面书写16X16的汉字 
* 输    入         : x, y, cn 
* 输    出         : 无 
* 说    明		   : 该函数可以直接书写字符串,但是书写是从右到左,所以输入的时 
*                  * 侯注意输入。汉字的取模方式请观看文件夹下的《汉字取模软件的 
*                  * 使用说明》 
*******************************************************************************/ 
 
#ifdef  CHAR_CODE 
 
#include "charcode.h" 
 
uchar Lcd12864_Write16CnCHAR(uchar x, uchar y, uchar *cn) 
{ 
	uchar j, x1, x2, wordNum; 
 
	//--Y的坐标只能从0到7,大于则直接返回--// 
	if(y > 7) 
	{ 
		return 0; 
	} 
 
	//--X的坐标只能从0到128,大于则直接返回--// 
	if(x > 128) 
	{ 
		return 0; 
	} 
	y += 0xB0;	   //求取Y坐标的值 
	//--设置Y坐标--// 
	LcdSt7565_WriteCmd(y); 
	while ( *cn != '\0')	 //在C语言中字符串结束以‘\0’结尾 
	{	 
	 
		//--设置Y坐标--// 
		LcdSt7565_WriteCmd(y); 
 
		x1 = (x >> 4) & 0x0F;   //由于X坐标要两句命令,分高低4位,所以这里先取出高4位 
		x2 = x & 0x0F;          //去低四位 
		//--设置X坐标--// 
		LcdSt7565_WriteCmd(0x10 + x1);   //高4位 
		LcdSt7565_WriteCmd(0x04 + x2);	//低4位 
 
		for (wordNum=0; wordNum<50; wordNum++) 
		{ 
		    //--查询要写的字在字库中的位置--// 
			if ((CN16CHAR[wordNum].Index[0] == *cn) 
			     &&(CN16CHAR[wordNum].Index[1] == *(cn+1))) 
			{ 
				for (j=0; j<32; j++) //写一个字 
				{		 
					if (j == 16)	 //由于16X16用到两个Y坐标,当大于等于16时,切换坐标 
					{ 
						//--设置Y坐标--// 
			   			LcdSt7565_WriteCmd(y + 1); 
			 
						//--设置X坐标--// 
						LcdSt7565_WriteCmd(0x10 + x1);   //高4位 
						LcdSt7565_WriteCmd(0x04 + x2);	//低4位 
					} 
					LcdSt7565_WriteData(CN16CHAR[wordNum].Msk[j]); 
				} 
				x += 16; 
			}//if查到字结束		 
		} //for查字结束	 
		cn += 2; 
	}	//while结束 
	return 1; 
} 
 
#endif