⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 t6963.c

📁 液晶6963模块 240*64,外接PS2键盘,多级菜单.这是我工作中的一个程序,有兴趣的可以看
💻 C
字号:
#include <REG52.h>
#include "T6963.h"
#include "ZK.h"
#include <stdarg.h>
#include <stdio.h>

#include <absacc.h>


#define D12_DATA 0xf002
#define D12_COMMAND 0xf003
#define inportb(X) *((unsigned char xdata *) X)
#define outportb(X,Y) *((unsigned char xdata *) X) = Y
/**************************************
             T6963驱动程序
 *************************************/

#define  LCMDW  XBYTE[0x9000]   /*定义数据口*/
#define  LCMCW  XBYTE[0x9001]    /*定义指令口*/

 // 状态位STA1,STA0判断(读写指令和读写数据) 
  #define RWCheck(){ uchar i; for(i=10;i>0;i--)  { if((LCMCW & 0x03) == 0x03)  break;}}
// 状态位ST2判断(数据自动读状态)
  #define AutoRCheck(){ uchar i; for(i=10;i>0;i--)  { if((LCMCW & 0x04) == 0x04)  break;}}
// 状态位ST3判断(数据自动写状态)
  #define AutoWCheck(){ uchar i; for(i=10;i>0;i--)  { if((LCMCW & 0x08) == 0x08)  break;}}

/*	控制指令	*/
#define ctrl(command) { RWCheck(); LCMCW= command; }
/*	写数据	*/
#define write(dat ) { RWCheck(); LCMDW=dat; }
/*	自动写	*/
#define autowrite(dat) { AutoWCheck();LCMDW=dat;}

/*	显示图形和文本	*/
void disp(unsigned char d) {	/*显示*/
	write(d);ctrl(0xc0);
}
/*	设定图形x,y值*/

void ag(unsigned char x,unsigned char y) {	/*地址*/
	unsigned int xy;
	//xy=y;
	//xy=xy*16+x+256;
	xy=y*30+x;
write(xy);
write((unsigned char)(xy>>8));
ctrl(0x24);
	//write(xy&0xff);write(xy/256);ctrl(0x24);
}

/*	点亮一点	*/

void setb(unsigned char d) {
	ctrl(0xf8|d);
}

/*	x,y处显示光标	*/

void ab(unsigned char x,unsigned char y) {		/*光标*/
	ctrl(0x9f);	/*光标开*/
	write(x);write(y);ctrl(0x21);
}
/*	取消光标	*/

void noab(void) {	
	ctrl(0x9c);	
}

/*	lcd初始化	*/
void T6963_init(void) {
	unsigned int i;
	write(0x0);write(0x08);ctrl(0x40);      /*文本首址,与图形区域分开*/
	write(16);write(0x0);ctrl(0x41);	/*文本区域*/
	write(0x0);write(0x0);ctrl(0x42);	/*图形首址*/
   	write(30);write(0x0);ctrl(0x43);	/*图形区域*/
	ctrl(0x81);	/*显示方式*/
	ctrl(0x9f);	/*显示开关*/
	ctrl(0xa1);	/*光标形状*/
	write(0);write(0);ctrl(0x24);
	ctrl(0xb0);	/*自动写方式*/
	//for (i=0;i<((240*64/8)*2);i++)
	for (i=0;i<(0x1000);i++)//清除图形和文本区
 		autowrite(0x0);
	ctrl(0xb2);/*结束自动写方式	*/
}

/*	显示8*12点阵英文字母,反白	*/
void da(uchar x,uchar y,uchar n,bit un) {
	unsigned char i;
	unsigned char k;
    if(n < 0x20)
        n = 0x1f;// 未找到该字
	k=n-0x1f;
	for (i=0;i<16;i++)
	{	ag(x,y*8+i);
		if((i<2)||(i>13))
		{	if (un==0) disp(0x00); 
			else disp(255-0x00);
		}
		else
		{	if (un==0)
				disp(ASC_MSK[k*12+i-2]);
			else
				disp(255-ASC_MSK[k*12+i-2]);
		 }
	}
}


/*	显示8*16点阵数字,反白	*/
/*void dn(uchar x,uchar y,uchar n,bit un) {
	unsigned char i;
	unsigned char k=n;
	for (i=0;i<16;i++) {
		ag(x,y*8+i);
		if (un==0) disp(Num0_9[k*16+i]); else disp(255-Num0_9[k*16+i]);
	}
	if ((++x)>=30) {
		x=0;
		y+=2;
		if (y>=8) y=0;
	}
}
*/
/*	显示8*12点阵数字,反白	*/
void dn(uchar x,uchar y,uchar n,bit un) {
	unsigned char i;
	unsigned char k=n;
	for (i=0;i<16;i++) 
	{   ag(x,y*8+i);
		if((i<2)||(i>13))
		{	if (un==0) disp(0x00); 
			else disp(255-0x00);
		}
		else
		{	if (un==0)
				disp(Num0_9[k*12+i-2]);
		 	else
				disp(255-Num0_9[k*12+i-2]);
		}
	}

}



//16*16
/*void hzx(uchar x,uchar y,uchar n,bit un) {
	unsigned char i,j;
	unsigned int k=n;
	for (i=0;i<16;i++) {
		for (j=0;j<2;j++) {
			ag(j+x,y*8+i);
			if (un==1) disp(hz[k*32+i*2+j]); 
			else disp(255-hz[k*32+i*2+j]);
		}
	}

}*/


//16*12 汉字显示
void hzx(uchar x,uchar y,uchar n,bit un) {
	unsigned char i,j;
	unsigned char k=n;
	for (i=0;i<16;i++) {
		for (j=0;j<2;j++) {
			ag(j+x,y*8+i);
			if((i<2)||(i>13))
			{	if (un==0) disp(0x00); 
				else disp(255-0x00);
			}
			else
			{	if (un==0) disp(hz[k*24+i*2+j-4]); 
				else disp(255-hz[k*24+i*2+j-4]);
			}
		}
	}
}
//16*14	    //显示特殊符号
void hzx1(uchar x,uchar y,uchar n,bit un) {
	unsigned char i,j;
	unsigned char k=n;
	for (i=0;i<16;i++) {
		for (j=0;j<2;j++) {
			ag(j+x,y*8+i);
			if(i<2)
			{	if (un==0) disp(0x00); 
				else disp(255-0x00);
			}
			else
			{
				if (un==0) disp(fot2[k*28+i*2+j-4]); 
				else disp(255-fot2[k*28+i*2+j-4]);
			} 					
		}
	}
}
void xsch(uchar x,uchar y,uchar n,bit un) 
{	if(n>=1)
		hzx1(x,y,7,un);
	else 
		hzx1(x,y,6,un);
}
void xsok(uchar x,uchar y,uchar n,bit un) 
{	if(n>=1)
		hzx1(x,y,4,un);
	else 
		hzx1(x,y,5,un);
}
void xsdir(uchar x,uchar y,uchar n,bit un)
{	if(n==0)
		hzx1(x,y,0,un);
	else if(n==1) 
		hzx1(x,y,1,un);
	else if(n==2) 
		hzx1(x,y,2,un);
	else if(n>=3) 
		hzx1(x,y,3,un);
}

/*	显示32*32点阵汉字,反白	*/
void tx(uchar x,uchar y,uchar n,bit un) {
	unsigned char i,j;
	unsigned char k=n;
	for (i=0;i<32;i++) 
	{	for (j=0;j<4;j++)
 		{	ag(j+x,y*8+i);
			if (un==0) 
				disp(fot1[k*128+i*4+j]);
			else
				disp(255-fot1[k*128+i*4+j]);
		}
	}
	x+=2;
	if (x>=30) {
		x=0;
		y+=2;
		if (y>=8) y=0;
	}
}





/*清屏*/
void ClearScreen(void)
{
	unsigned  int i;

	write(0);write(0);ctrl(0x24);
	ctrl(0xb0);	/*自动写方式*/
	for (i=0;i<19200;i++) {
		autowrite(0x0);
	}
	ctrl(0xb2);/*结束自动写方式	*/
}

/*	划点*/
/*
void Pixel(unsigned char PointX,unsigned char PointY, bit Mode)
{
	uint StartAddr=0;
	uchar dat;
	StartAddr=PointY*30 + PointX/8;
	dat=0xf0+7-PointX%8;
 	write((unsigned char)(StartAddr));
	write((unsigned char)(StartAddr>>8));
	ctrl(0x24);
	if(Mode) dat=dat|0x08;
	ctrl(dat);
}
*/
/*	划线	*/
/*  x1应大于x0,y1应大于y0.同时仅仅是0度或90度 */
/*void line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1) 
{	unsigned char x=x1-x0,y=y1-y0,xx,yy;//temp;
	
	if (y==0)
 	{	yy=y0;
		for (xx=x0;xx<x1;xx++)
			Pixel(xx,yy,1);
		
	} 
	else if(x==0)
	{	xx=x0;
		for (yy=y0;yy<y1;yy++) {
			Pixel(xx,yy,1);
		}
	}
}
*/
// ASCII(8*16) 及 汉字(16*16) 显示函数
// x不能大于30(行宽),y不能大于6,字符数不能多于30
// 例子:   dprintf(3,1,"当前试验:KPa");


void Lcd_printf(uchar x,uchar y,char *fmt,bit zt,bit un)
{
    char  c1,c2;
    char idata  tmpBuf[40];                // LCD显示数据缓冲区
    uchar i=0,j,uLen;
    uchar  Temp;
 
	uLen=0;
	while(*fmt!=0x00)
	{tmpBuf[uLen++]=*fmt++;
	}
    while(i<uLen)
    {
        c1 = tmpBuf[i];
        c2 = tmpBuf[i+1];
        if(c1 >= 0) 
        {    // ASCII

  			da(x,y,(c1),un);
			i++;
            x++;
        }
        else
        {    // 中文
			if(zt==0)
			{	Temp=((sizeof(hzmb)-1)/2);
	   			for(j=0;j<Temp;j++)
	            {
	                if(c1 == hzmb[j*2] && c2 == hzmb[j*2+1])
	                    break;
	            }
	            if(j>=Temp)
					j=0;// 未找到该字
	  			hzx(x,y,j,un);
			}
           i+=2;
           x+=2;
			if (x>=30) 
			{
				x=0;
				y+=2;
				if (y>=6) y=0;
			}
        }
 
    }
}

void Lcd_Num_Uint(char x,uchar y,uint ad,uchar n)
{	uchar a1,a2,a3,a4,a5;
		a5=ad/10000;
		ad=ad-a5*10000;
		a4=ad/1000; 
		ad=ad-a4*1000;
		a3=ad/100;
		ad=ad-a3*100;
		a2=ad/10;
		a1=ad%10;
		if(n>=5)	dn(x++,y,a5,0);
		if(n>=4)	dn(x++,y,a4,0);
		if(n>=3)	dn(x++,y,a3,0);
		if(n>=2)	dn(x++,y,a2,0);
		dn(x++,y,a1,0);

}
void Lcd_Num_int(char x,uchar y,int ad,uchar n)//特殊显示形式,加负号,增加小数点,4位
{	uchar a1,a2,a3,a4;
	if(ad<0)
	{	if(n==1)
			da(x++,y,'-',0);
		ad=0-ad;
	}
	else 
	{	if(n==1)
			da(x++,y,' ',0);
	}
	a4=ad/1000; 
	ad=ad-a4*1000;
	a3=ad/100;
	ad=ad-a3*100;
	a2=ad/10;
	a1=ad%10;
	if(a4>0)
		dn(x++,y,a4,0);
	else	
		da(x++,y,' ',0);
	if(a3>0)
		dn(x++,y,a3,0);
	else
	{	if(a4>0) dn(x++,y,a3,0);	
		else da(x++,y,' ',0);
	}
	if(a2>0)
		dn(x++,y,a2,0);
	else	
		dn(x++,y,0,0);
	da(x++,y,'.',0);
	dn(x++,y,a1,0);
}

void Lcd_Num_Uchar(char x,uchar y,uchar ad,uchar n)//n显示的位数
{	uchar a1,a2,a3;
		a3=ad/100;
		ad=(ad-a3*100);
		a2=ad/10;
		a1=ad%10;
		if(n>=3) dn(x++,y,a3,0);
		if(n>=2) dn(x++,y,a2,0);
		dn(x++,y,a1,0);
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -