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

📄 t6963_driver.c

📁 本程序是一个人机接口程序
💻 C
字号:
#include <string.h>
#include <hzk16.h>
#include <hzk24.h>
#include "common.h"

#define ColumnChar 30 //总共30列

//状态检查函数
//指令,数据读写状态检查
void RWCheck()
{

	unsigned char dat;
	
	do
	{
        dataport=0xff;
        LCD_cd=1;
        LCD_rd=0;
        dat=dataport;
        LCD_rd=1;
        dat=0x03&dat;//STA0,STA1是否准备好
	} while(dat!=0x03);

}

/*
//数据自动读状态检查
void AutoRCheck()
{
	unsigned char dat;
    do
	{
        dataport=0xff;
        LCD_cd=1;
        LCD_rd=0;
        dat=dataport;
        LCD_rd=1;
        dat=0x04&dat;//STA2是否准备好
	} while(dat==0x00);
}  
*/

//数据自动写状态检查
void AutoWCheck(void)
{
	unsigned char dat;

    do
	{
        dataport=0xff;
        LCD_cd=1;
        LCD_rd=0;
        dat=dataport;
        LCD_rd=1;
        dat=0x08&dat;//STA3是否准备好
	} while(dat==0x00);


}

//读数据
unsigned char InPortData()
{
	unsigned char dat;

	RWCheck();
	LCD_cd=0;
	dataport=0xff;
	LCD_rd=0;
	dat=dataport;
	LCD_rd=1;
	return(dat);
}

//向数据口发Data
void OutPortData(dat) 
{ 
	RWCheck(); 
	LCD_cd=0;  
	dataport=dat; 
	LCD_wr=0; 
	LCD_wr=1;
}

//写有1个参数命令
void OutPortCom1(command) 
{ 
	RWCheck(); 
	LCD_cd=1; 
	dataport=command; 
	LCD_wr=0; 
	LCD_wr=1;
}

//写有2个参数命令
void OutPortCom2(dat, command) 
{ 
	OutPortData(dat); 
	OutPortCom1(command); 
}

//写有3个参数命令
void OutPortCom3(data1, data2, command) 
{ 
	OutPortData(data1); 
	OutPortData(data2); 
	OutPortCom1(command);
}

//显示8*16字符(8列16行)(图形显示方式)
//ch:字符代码(标准ASCII码)
void ShowChar(unsigned char lin,unsigned char column,unsigned char ch)	
{
	unsigned char i,j;
	unsigned int StartAddr;
	
	LCM_CE=0;///
	StartAddr=(lin*480)+column; //定位起始行

	for(j=0;j<ASC_MAX;j++) 
	{
	 	if(ASCII_index[j]==ch) 
		{
		 	break;
		}
	}	
	for(i=0;i<16;i++)
	{
		OutPortCom3((unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address
		OutPortCom2(ASCII816[j][i], 0xc4);
		StartAddr=StartAddr + ColumnChar;
	}
	LCM_CE=1;///
}

//显示12*24点阵电流值
//type为1显示当前值,为0显示给定值
//n为电流,0-99999,n为65535则不显示void ShowCurrent(unsigned char type,unsigned int n,bit Down_Line)
{
	unsigned char i,j,k;
	unsigned int StartAddr;
	unsigned char xdata font_temp[216];	

	LCM_CE=0;///
	k=0;
   	for(j=0;j<216;j++) font_temp[j]=0;
	if(n/10000) 
	{
 		for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n/10000][j*2];
		for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n/10000][j*2+1];
		k-=24;
	}
	else k=24;

	if(n/1000)
	{
		for(j=0;j<24;j++) font_temp[k++]+=ASCII1224[n%10000/1000][j*2]/16;
		for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%10000/1000][j*2]%16*16;
		k-=24;
		for(j=0;j<24;j++) font_temp[k++]+=ASCII1224[n%10000/1000][j*2+1]/16;
	}
	else k+=48;

	if(n/100)
	{
 		for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%1000/100][j*2];
		for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%1000/100][j*2+1];
   		k-=24;
	}
	else k+=24;

	if(n/10)
	{
		for(j=0;j<24;j++) font_temp[k++]+=ASCII1224[n%100/10][j*2]/16;
		for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%100/10][j*2]%16*16;
		k-=24;
		for(j=0;j<24;j++) font_temp[k++]+=ASCII1224[n%100/10][j*2+1]/16;
	}
	else k+=48;

  	for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%10][j*2];
	for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%10][j*2+1];
   	k-=24;
	for(j=0;j<24;j++) font_temp[k++]+=ASCII1224[10][j*2]/16;
	for(j=0;j<24;j++) font_temp[k++]=ASCII1224[10][j*2]%16*16;
	k-=24;
	for(j=0;j<24;j++) font_temp[k++]+=ASCII1224[10][j*2+1]/16;

	if(n==65535) for(i=0;i<216;i++) font_temp[i]=0; //不显示
	if (type==1) StartAddr=486; 	
	else StartAddr=1206;
	
	if(type==0 && Down_Line)
	{
		for(i=22;i<216;i+=24) font_temp[i]=0xff;		
		for(i=23;i<216;i+=24) font_temp[i]=0xff;
	}
	for(i=0;i<24;i++)
	{
		OutPortCom3((unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); 
		for(j=0;j<9;j++) OutPortCom2(font_temp[i+24*j], 0xc0); 
		StartAddr=StartAddr + ColumnChar;
	}
	LCM_CE=1;///
}

//显示12*24点阵电压值
//type为1显示当前值,为0显示给定值
//n为电压,0-999,n为65535则不显示
//Down_Line为1,显示下划线,为0不显示
void ShowVoltage(unsigned char type,unsigned int n,bit Down_Line)
{
	unsigned char i,j,k;
	unsigned int StartAddr;
	unsigned char xdata font_temp[144];	

	LCM_CE=0;///
	for(i=0;i<144;i++) font_temp[i]=0;
	k=0;
//	if(type==0 && Modi_Preset_value_via_Key && n<100) n*=10;
	 
	if(n/100)
	{
 		for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%1000/100][j*2];
		for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%1000/100][j*2+1];
   		k-=24;
	}
	else k=24;

	if(n/10)
	{
		for(j=0;j<24;j++) font_temp[k++]+=ASCII1224[n%100/10][j*2]/16;
		for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%100/10][j*2]%16*16;
		k-=24;
		for(j=0;j<24;j++) font_temp[k++]+=ASCII1224[n%100/10][j*2+1]/16;
	}
	else k+=48;


  	for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%10][j*2];
	for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%10][j*2+1];
   	k-=24;
	
	for(j=0;j<24;j++) font_temp[k++]+=ASCII1224[11][j*2]/16;
	for(j=0;j<24;j++) font_temp[k++]=ASCII1224[11][j*2]%16*16;
	k-=24;
	for(j=0;j<24;j++) font_temp[k++]+=ASCII1224[11][j*2+1]/16;
	
	if(n==65535) for(i=0;i<144;i++) font_temp[i]=0; //不显示

	if (type==1) StartAddr=504; 	
	else StartAddr=1224;

	if(type==0 && Down_Line)
	{
		for(i=22;i<144;i+=24) font_temp[i]=0xff;		
		for(i=23;i<144;i+=24) font_temp[i]=0xff;
	}
	for(i=0;i<24;i++)
	{
		OutPortCom3((unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); 
		for(j=0;j<6;j++) OutPortCom2(font_temp[i+24*j], 0xc0); 
		StartAddr=StartAddr + ColumnChar;
	}
	LCM_CE=1;///
}

//显示一个汉字(16*16点阵) (图形方式显示)
//lin:行(0-7), column: 列(0-15)
//hzcode: 汉字代码(自定义的)
void ShowHZ(unsigned char lin,unsigned char column,unsigned char hzcode_msb,unsigned char hzcode_lsb)
{
	unsigned char i,j;
	unsigned int StartAddr;
	
	LCM_CE=0;///
	StartAddr=(lin*480)+column; //定位起始行(括号中相当于lin*ColumnChar*16)
	for(j=0;j<HZ_MAX;j++) 
	{
	 	if(HZ_index[j*2]==hzcode_msb && HZ_index[j*2+1]==hzcode_lsb) 
		{
			break;
		}
	}	
	 		
	for(i=0;i<16;i++)
	{
		OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);
		OutPortCom2( HZ_Tab[j][i*2], 0xc0);   //左半部 地址加一
		OutPortCom2( HZ_Tab[j][i*2+1], 0xc4); //右半部 字模地址不变
		StartAddr=StartAddr + ColumnChar;
	}
	LCM_CE=1;///
}

//显示一行字符串(汉字,字母混排)
void ShowLine(unsigned char lin,unsigned char column,unsigned char *puts)
{
	unsigned char j,byte,k,len;
	
	len=strlen(puts);

	for (k=column,j=0;j<len;j++)
	{
		byte = puts[j];
		if (byte&0x80) //汉字  
		{
			ShowHZ(lin,k,byte,puts[j+1]);
			j++;
			k=k+2;
		}
		else //字母
		{
			//if(byte!=' ') 
			ShowChar(lin,k,byte);
			k=k+1;
		}   
	}
}

/*
//反显一个字符
void ReverseShowChar(unsigned char lin,unsigned char column)
{
	unsigned char i;
	unsigned char dat;
	unsigned int StartAddr;
	
	StartAddr=(lin*480) +column; //定位起始行
	
	for(i=0;i<16;i++)
	{
		OutPortCom3((unsigned char)(StartAddr),(unsigned char)(StartAddr>>8),0x24); //set address
		OutPortCom1(0xc5 ); //数据一次读,地址不变
		dat=InPortData(); //读入数据
		dat=~dat; //取反
		OutPortCom2(dat,0xc4); //送回
		StartAddr=StartAddr+ ColumnChar;
	}
}

void ReverseShowLine(unsigned char x0,unsigned char x1,unsigned char lin)
{
	unsigned char column;
	
	for(column=x0; column<x1; column++) ReverseShowChar(lin,column);
}
*/

//反显一行
//lin:反白行(0-7)
//x0:反白起始列,x1:反白终止列
void ReverseShowLine(unsigned char x0,unsigned char x1,unsigned char line)
{
	unsigned char i,j;
	unsigned char dat;
	unsigned int StartAddr;
	
	StartAddr=(line*480)+x0; //定位起始行
	LCM_CE=0;///
	for(j=0;j<16;j++)
	{
		OutPortCom3((unsigned char)(StartAddr),(unsigned char)(StartAddr>>8),0x24); //set address
		for(i=0;i<10;i++);		
		for(i=0;i<x1-x0;i++)
		{
			OutPortCom1(0xc5 );     //数据一次读,地址不变
			dat=InPortData();       //读入数据
			dat=~dat;               //取反
			OutPortCom2(dat,0xc0);  //数据写,地址加一
		}	
		StartAddr=StartAddr+ColumnChar ;
	}
	LCM_CE=1;///
}

//显示汉字(24*24点阵) 
void ShowHZ24(unsigned char x,unsigned char y,unsigned char n)
{
	unsigned char i;
 	unsigned int StartAddr; 

	StartAddr=(y*30)+x/8; 
	LCM_CE=0;///
 	for(i=0;i<24;i++)
	{
		OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);
		OutPortCom2( HZ24_Tab[n][i*3], 0xc0); 
		OutPortCom2( HZ24_Tab[n][i*3+1], 0xc0);
		OutPortCom2( HZ24_Tab[n][i*3+2], 0xc4);
		StartAddr=StartAddr + ColumnChar;
	}
	LCM_CE=1;///
}

//清屏
void ClearScreen()
{
	unsigned int i;
	
	LCM_CE=0;///
	//清显示 RAM 区 0000h--2000h (8k)
	OutPortCom3(0x00,0x00,0x24); //设置指针地址0000H
	
	OutPortCom1(0xb0); //设置自动写状态
	for(i=0;i<8200;i++) 
	{
		AutoWCheck();
		OutPortData(0x00);
	} 
	AutoWCheck();
	OutPortCom1(0xb2); // 自动写结束
	LCM_CE=1;///
}

//初始化LCD
void InitLCD()
{
	LCM_CE=0;
	LCD_cd=1;
	LCD_wr=1;
	LCD_rd=1;

	OutPortCom3(0x00,0x00,0x42);
	OutPortCom3(0x1e,0x00,0x43);
 	
//	OutPortCom1(0xa7); //设置光标形状 cursor size 8x8(好像无用)
	OutPortCom1(0x80); //设置显示方式: CGROM方式 文本\图形 "或"
	OutPortCom1(0x98); //设置显示开关: 1001 1000 只开图形显示
 	ClearScreen();
	LCM_CE=1;///

}
/*
//画线
//x:0-239
//y:0-127
void Draw_Line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1) 
{
	unsigned int Add;
	unsigned char i,j;
	unsigned char dat;

	if(y0==y1) //横线
	{
		x1+=1;
		Add=y0*30+x0/8;
		OutPortCom3((unsigned char)(Add), (unsigned char)(Add>>8), 0x24); //set address
		for(i=0;i<10;i++); //delay
		OutPortCom1(0xc5 );     //数据一次读,地址不变
		dat=InPortData();       //读入数据
		switch(x0%8)
		{
		 	case 1: OutPortCom2(dat|0x7f, 0xc0); break;
			case 2: OutPortCom2(dat|0x3f, 0xc0); break;
			case 3: OutPortCom2(dat|0x1f, 0xc0); break;
			case 4: OutPortCom2(dat|0x0f, 0xc0); break;
			case 5: OutPortCom2(dat|0x07, 0xc0); break;
			case 6: OutPortCom2(dat|0x03, 0xc0); break;
			case 7: OutPortCom2(dat|0x01, 0xc0); break;
		}
		for(i=(x0+7)/8*8;i<x1/8*8;i+=8) OutPortCom2(0xff, 0xc0);
		OutPortCom1(0xc5 );     //数据一次读,地址不变
		dat=InPortData();       //读入数据
		switch(x1%8)
		{
		 	case 1: OutPortCom2(dat|0x80, 0xc0); break;
			case 2: OutPortCom2(dat|0xc0, 0xc0); break;
			case 3: OutPortCom2(dat|0xe0, 0xc0); break;
			case 4: OutPortCom2(dat|0xf0, 0xc0); break;
			case 5: OutPortCom2(dat|0xf8, 0xc0); break;
			case 6: OutPortCom2(dat|0xfc, 0xc0); break;
			case 7: OutPortCom2(dat|0xfe, 0xc0); break;
		}
	}
	if(x0==x1)
	{
		for(j=y0;j<=y1;j++)
		{
			Add=j*30+x0/8;
			OutPortCom3((unsigned char)(Add), (unsigned char)(Add>>8), 0x24); //set address
			for(i=0;i<10;i++); //delay
			OutPortCom1(0xc5 );     //数据一次读,地址不变
			dat=InPortData();       //读入数据
			switch(x0%8)
			{
				case 0: OutPortCom2(dat|0x80, 0xc0); break;
			 	case 1: OutPortCom2(dat|0x40, 0xc0); break;
				case 2: OutPortCom2(dat|0x20, 0xc0); break;
				case 3: OutPortCom2(dat|0x10, 0xc0); break;
				case 4: OutPortCom2(dat|0x08, 0xc0); break;
				case 5: OutPortCom2(dat|0x04, 0xc0); break;
				case 6: OutPortCom2(dat|0x02, 0xc0); break;
				case 7: OutPortCom2(dat|0x01, 0xc0); break;
			}
		}	
	}
}
*/

⌨️ 快捷键说明

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