www.pudn.com > t6963_nios.rar > t6963.h


#include "excalibur.h" 
#include "zimo.h" 
 
 
np_pio* lcddata=na_lcddata; 
np_pio* lcdcd=na_lcdcd; 
np_pio* lcdce=na_lcdce; 
np_pio* lcdwr=na_lcdwr; 
np_pio* lcdrd=na_lcdrd; 
 
 
typedef unsigned char uchar; 
#define uint unsigned int 
 
// ASCII字符控制代码解释定义 
#define STX	0x02 
#define ETX	0x03 
#define EOT	0x04 
#define ENQ	0x05 
#define BS	0x08 
#define CR	0x0D 
#define LF	0x0A 
#define DLE	0x10 
#define ETB	0x17 
#define SPACE	0x20 
#define COMMA	0x2C 
 
// T6963C 命令定义 
#define LC_CUR_POS	0x21		// 光标位置设置 
#define LC_CGR_POS	0x22		// CGRAM偏置地址设置 
#define LC_ADD_POS	0x24		// 地址指针位置 
#define LC_TXT_STP	0x40		// 文本区首址 
#define LC_TXT_WID	0x41		// 文本区宽度 
#define LC_GRH_STP	0x42		// 图形区首址 
#define LC_GRH_WID	0x43		// 图形区宽度 
#define LC_MOD_OR	0x80		// 显示方式:逻辑“或” 
#define LC_MOD_XOR	0x81		// 显示方式:逻辑“异或” 
#define LC_MOD_AND	0x82		// 显示方式:逻辑“与” 
#define LC_MOD_TCH	0x83		// 显示方式:文本特征 
#define LC_DIS_SW	0x9c		// 显示开关:D0=1/0:光标闪烁启用/禁用; 
					// D1=1/0:光标显示启用/禁用; 
					// D2=1/0:文本显示启用/禁用; 
					// D3=1/0:图形显示启用/禁用; 
#define LC_CUR_SHP	0xA0		// 光标形状选择:0xA0-0xA7表示光标占的行数 
#define LC_AUT_WR	0xB0		// 自动写设置 
#define LC_AUT_RD	0xB1		// 自动读设置 
#define LC_AUT_OVR	0xB2		// 自动读/写结束 
#define LC_INC_WR	0xC0		// 数据一次写,地址加1 
#define LC_INC_RD	0xC1		// 数据一次读,地址加1 
#define LC_DEC_WR	0xC2		// 数据一次写,地址减1 
#define LC_DEC_RD	0xC3		// 数据一次读,地址减1 
#define LC_NOC_WR	0xC4		// 数据一次写,地址不变 
#define LC_NOC_RD	0xC5		// 数据一次读,地址不变 
#define LC_SCN_RD	0xE0		// 屏读 
#define LC_SCN_CP	0xE8		// 屏拷贝 
#define LC_BIT_OP	0xF0		// 位操作: 
					// D0-D2:定义D0-D7位;D3:1置位;0:清除 
uchar gCurRow,gCurCol;	 
uchar  turnf[8] = {7,6,5,4,3,2,1,0};	 
 
void setcd(unsigned char a){ 
	if(a) lcdcd->np_piodata=1; 
	else lcdcd->np_piodata=0;} 
void setwr(unsigned char a){ 
	if(a){lcdwr->np_piodata=1; 
	     } 
	else {lcdwr->np_piodata=0;} 
	} 
void setrd(unsigned char a){if(a) lcdrd->np_piodata=1;else  lcdrd->np_piodata=0;} 
void setce(unsigned char a){if(a) lcdce->np_piodata=1;else  lcdce->np_piodata=0;} 
void delay6963(unsigned char a)    
{	 
   uchar i; 
		for(i=0;inp_piodirection=0; 
	 
	setcd(1); 
	setwr(1); 
	setrd(0); 
delay6963(1); 
	a=lcddata->np_piodata; 
	setrd(1); 
	lcddata->np_piodirection=0xff; 
		 
return a;     } 
void st01(){while(!(readstatus()&0x01)) delay6963(1); 
			while(!(readstatus()&0x02)) delay6963(1);} 
void st02(){while(!(readstatus()&0x04)) delay6963(1);} 
void st03(){while(!(readstatus()&0x08)) delay6963(1);} 
void st06(){while(!(readstatus()&0x40)) delay6963(1);}	 
/********************************************************/ 
/* 写双参数的指令					*/ 
/********************************************************/ 
void fnPR1(uchar uCmd,uchar uPart1,uchar uPart2) 
{	 
     st01(); 
	setcd(0); 
	lcddata->np_piodata=uPart1; 
	setwr(0); 
	delay6963(1);    
	setwr(1); 
	st01(); 
	setcd(0); 
	lcddata->np_piodata=uPart2; 
	setwr(0); 
	delay6963(1); 
	setwr(1); 
	st01(); 
lcddata->np_piodata=uCmd; 
	setwr(0); 
	delay6963(1); 
	setwr(1); 
} 
/********************************************************/ 
/* 写单参数的指令					*/ 
/********************************************************/ 
void fnPR11(uchar uCmd,uchar uPart1) 
{    
	st01(); 
	setcd(0); 
	   lcddata->np_piodata=uPart1; 
	setwr(0); 
	delay6963(1); 
	setwr(1); 
	st01(); 
	   lcddata->np_piodata=uCmd; 
	setwr(0); 
	delay6963(1); 
	setwr(1); 
} 
/********************************************************/ 
/* 写无参数的指令					*/ 
/********************************************************/ 
void fnPR12(uchar uCmd) 
{    
	st01(); 
	lcddata->np_piodata=uCmd; 
	setwr(0); 
	delay6963(1); 
	setwr(1); 
} 
/********************************************************/ 
/*  写数据						*/ 
/********************************************************/ 
void fnPR13(uchar uData) 
{   
	st03(); 
	setcd(0); 
   lcddata->np_piodata=uData; 
	setwr(0); 
	delay6963(1); 
	setwr(1); 
} 
/********************************************************/ 
/* 读数据						*/ 
/********************************************************/ 
uchar fnPR2(void) 
{	uchar a; 
   st01(); 
lcddata->np_piodirection=0; 
 
  setcd(0); 
    setwr(1); 
	setrd(0); 
	delay6963(1); 
	a=lcddata->np_piodata; 
	setrd(1); 
lcddata->np_piodirection=0xff; 
 
	return a;    
} 
/********************************************************/ 
/* 设置当前地址						*/ 
/********************************************************/ 
void fnSetPos(uchar urow, uchar ucol)                    //urow是列值,ucol是行值 
{ 
	uint  iPos; 
	iPos = urow * 16+ ucol;                                   
	fnPR1(LC_ADD_POS,iPos & 0xFF,iPos / 256); 
	gCurRow = urow; 
	gCurCol = ucol; 
} 
 
void initial6963() 
{	lcddata->np_piodirection=0xff; 
	  lcddata->np_piodata=0; 
		lcdwr->np_piodata=0; 
		lcdrd->np_piodata=0; 
		lcdcd->np_piodata=0; 
		lcdce->np_piodata=0; 
		fnPR1(LC_TXT_STP,0,0);	// 文本显示区首地址 
	fnPR1(LC_TXT_WID,16,0x00);		// 文本显示区宽度 
	fnPR1(LC_GRH_STP,0x00,0x00);		// 图形显示区首地址 
	fnPR1(LC_GRH_WID,16,0x00);		// 图形显示区宽度 
	fnPR12(LC_CUR_SHP | 0x01);		// 光标形状 
	fnPR12(LC_MOD_OR);			// 显示方式设置 
	fnPR12(LC_DIS_SW|0x0c);		// 显示开关设置 
		 
} 
 
/********************************************************/ 
/* 设置当前显示行、列					*/ 
/********************************************************/ 
void cursor(uchar uRow, uchar uCol) 
{ 
	fnSetPos(uCol* 16, uRow);                              //ucol是列值0   1 2 3 
														   //uRow 是行值 
} 
 
void cls2(void )   /* 依次写CGROM字符库						*/ 
{ 
	uint  i; 
    fnPR1(LC_CGR_POS,0x00,0x00);//CGRAM偏移地址设置 
	fnPR1(LC_ADD_POS,0x00,0x00);	// 置地址指针为从零开始 
	fnPR12(LC_AUT_WR);		// 自动写 
	for(i=0;i<128;i++)	// 清一屏                    
		{ 
		st03(); 
		fnPR13(i);		// 写数据,实际使用时请将0x55改成0x0 
		} 
	fnPR12(LC_AUT_OVR);		// 自动写结束 
	fnPR1(LC_ADD_POS,0x00,0x00);	// 重置地址指针 
	gCurRow = 0;			// 置地址指针存储变量 
	gCurCol = 0; 
} 
/********************************************************/ 
 
/********************************************************/ 
void cls(void)     //清屏 
{ 
	uint  i; 
    fnPR12(LC_DIS_SW & 0xf7);		// 显示开关设置 
	fnPR1(LC_ADD_POS,0x00,0x00);	// 置地址指针为从零开始 
	fnPR12(LC_AUT_WR);		// 自动写 
	for(i=0;i<128*64/8;i++)	// 清一屏                   //   总的字节数是240*128/8 
		{ 
		st03(); 
		fnPR13(0x00);		// 写数据,实际使用时请将0x55改成0x0 
		} 
	fnPR12(LC_AUT_OVR);		// 自动写结束 
	fnPR1(LC_ADD_POS,0x00,0x00);	// 重置地址指针 
	fnPR12(LC_DIS_SW & 0xfb);		// 显示开关设置 
	gCurRow = 0;			// 置地址指针存储变量 
	gCurCol = 0; 
} 
/*******************************************************/ 
/*   设置文本                                         */ 
/*******************************************************/ 
void CGRAM() 
{	 
		fnPR1(LC_CGR_POS,0x00,0x00);//CGRAM偏移地址设置 
		 
} 
 
//一行有16个地址单元,一个地址8个点,画点时先要确定地址单元地址, 
//row确定地址单元所在行,为0-63,column确定地址单元所在列,为0-15 
//bit为0-7的数,控制画地址单元中的哪个点,为7画最左边的点,为0画最右边的点 
//s为8时画点,为0时擦除点 
void point(uchar row,uchar column,uchar s)   
	{ 
	uchar	x1=0xf0; 
	uchar column1=column/8; 
	uchar   bit=7-column%8; 
	int a=row*16+column1; 
    fnPR1(LC_ADD_POS,a&0xff,a/256); 
	x1|=bit; 
	x1|=s; 
    fnPR12(x1);   	 
	} 
 
 
//y0,yt为横坐标0-127,x0,xt为纵坐标0-63,s为8时画线,为0时擦除,不能画斜线 
void line(uchar row0,uchar column0,uchar rowt,uchar columnt,uchar s)  
{ 
	uchar i; 
	if(row0==rowt) 
	  for(i=column0;i<=columnt;i++) 
	     point(row0,i,s);  
	 if(column0==columnt) 
	  for(i=row0;i<=rowt;i++) 
	     point(i,column0,s);  
	  
} 
 
//x0、xt为0-127,y0、yt为0-63,s为8画矩形,为0镲除 
void rectangle(uchar x0,uchar y0,uchar xt,uchar yt,uchar s) 
{ 
	line(x0,y0,xt,y0,s); 
	line(xt,y0,xt,yt,s); 
	line(x0,y0,x0,yt,s); 
	line(x0,yt,xt,yt,s); 
	} 
 
//显示字符串	 
void dprintf(uchar row,uchar column,uchar black,char *fmt,... )  //row为0-63,columm为0-15 
{ 
	char c1,c2,cData=0; 
     
	uchar i=0,j,uRow,uCol; 
	uint k; 
    uchar ulen; 
 
    ulen=strlen(fmt); 
    fnSetPos(row,column); 
 
	while(i 0 ) 
		{	// ASCII 
			if(c1 < 0x20)      
			{ 
				switch(c1) 
				{ 
					case CR: 
					case LF:		// 回车或换行 
						i++; 
						if(uRow < 144) 
							fnSetPos(uRow+16,0); 
						else 
							fnSetPos(0,0); 
						continue; 
					case BS:		// 退格 
						if(uCol > 0) 
							uCol--; 
						fnSetPos(uRow,uCol); 
						cData = 0x00; 
						break; 
					default:		// 其他 
						c1 = 0x1f; 
				} 
			} 
			for(j=0;j<16;j++) 
			{ 
				fnPR12(LC_AUT_WR);		// 写数据 
				if(c1 >= 0x20) 
						fnPR13((0xff*black)^ASC_MSK[(c1-0x20)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)]); 
				else 
					fnPR13(cData); 
				fnPR12(LC_AUT_OVR); 
				fnSetPos(uRow+j+1,uCol); 
			} 
			if(c1 != BS)		// 非退格 
				uCol++; 
		} 
 
		else 
		{	// 中文 
			for(j=0;j=30)			// 光标后移 
		{ 
			uRow +=16; 
			if(uRow < 0x80) 
				uCol -= 30; 
			else 
			{ 
				uRow = 0; 
				uCol = 0; 
			} 
		} 
		fnSetPos(uRow,uCol); 
		i++; 
	} 
}        
 
//显示数字	 
printfig(uchar row,uchar column,uchar black,int fig) 
{ 
	char a[10],i=0,k; 
	if(!fig) 
	  dprintf(row,column,black,"0");   
	while(fig) 
	{ 
	a[i]=fig%10; 
	fig=fig/10; 
	i++; 
} 
for(k=i-1;k>=0;k--) 
   { 
	switch(a[k]) 
	{ 
		case 0: 
		    dprintf(row,column,black,"0");  
		break; 
		case 1: 
		    dprintf(row,column,black,"1");  
		break; 
		case 2: 
		    dprintf(row,column,black,"2");  
		break; 
        case 3: 
		    dprintf(row,column,black,"3");  
		break; 
		case 4: 
		    dprintf(row,column,black,"4");  
		break; 
		case 5: 
		    dprintf(row,column,black,"5");  
		break; 
		case 6: 
		    dprintf(row,column,black,"6");  
		break; 
		case 7: 
		    dprintf(row,column,black,"7");  
		break; 
		case 8: 
		    dprintf(row,column,black,"8");  
		break; 
		case 9: 
		    dprintf(row,column,black,"9");  
		break; 
		default : break; 
		} 
column++; 
	} 
	}