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

📄 byq10.c

📁 能配合“变压器测试组件”实现LF2000系列各个型号变压器组件与互感器的测试任务要抗干扰能力强
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <pic.h>


__CONFIG(0x3fe5);
/*********************************************************************************
软件功能:
		能配合“变压器测试组件”实现LF2000系列各个型号变压器组件与互感器的测试任务
		要抗干扰能力强,操作方便,软件升级维护方便
		可复位保护功能
软件使用单位:	龙飞股份有限公司仪表车间隔离式安全栅组
编写人:	吴宏树
编写日:	2006-9-22
*********************************************************************************/

/**********************************************
输入信号
**********************************************/
#define		Uo		RA0	//开路电压
#define		Io		RA1	//短路电压
#define		IR		RA2	
#define		FUNCTION	RA3	//功能键,型号选择	
	
#define		TM40_A		RB5	//41同名端
#define		TM43_B		RB6	//40同名端需与41配合使用
#define		TM43 		RB7	//43同名端检测
/************************************************
输出信号
***********************************************/
#define		BJ_A		RA4	//1路同名端声光报警
#define		BJ_B		RA5	//2路同名端声光报警

#define		A_QH		RB0	//功耗与短路电流测试切换
#define		Uo_QH		RB1	//开路电压测试切换 测开路电压时需切换到短路电流档然后再切换这个继电器	
#define		V_QHa		RC7	//测试电压表切换A
#define		V_QHb		RC6	//测试电压表切换B
#define		ZL		RC5	//整流方式切换

#define		DCF1		RC0			
#define		DCF2		RC1
#define		DCF3		RC2
#define		DCF4		RC3
#define		DCF5		RC4

/****************************************
	HT1621液晶显示器引脚功能定义
****************************************/
#define		DATA		RB4
#define		CLK		RB3
#define		CS		RB2


//显示字段表
const unsigned char dis_char[18] = 
{
	0xf5,0x60,0xb6,0xf2,0x63,0xd3,0xd7,0x70,0xf7,0xf3,	//0-9
	0x77,0xc7,0x86,0xe4,0xb7,0xe5,0x17,0x85,	//A,b,c,d,e,L,F
};
const char TAB_REST[6]={0b00000001,		//打开系统振荡器命令
    0b00000011,							//打开LCD 偏压发生器命令
    0b00000101,							//WDT 溢出标志输出失效命令
    0b00000110,							//时基输出使能命令
    0b00011000,							//系统时钟源片内RC振荡器命令
    0b00101001};						//LCD1/3偏压选项4个公共口命令
/***************************************************************************************
				全局变量说明
**************************************************************************************/

unsigned char 	Dis_buff[8];		//显示缓冲区
unsigned char 	functionkey_value;		//功能按键值
unsigned char	Uokey_value;		//开路电压按键值
unsigned char	Iokey_value;		//短路电流按键值
unsigned char	IRkey_value;		//端电压测试路值
unsigned char   UIx;			//开路短路测试路数
unsigned char   homonymy;		//同名端计数达到50个后才认为相同

bit	ubz;		//开路测试按键标志
bit     ibz;		//短路测量按键标志
bit	gnbz;		//功耗按键标志
bit	uibz;		//开路/短路测试标志
bit	irbz;		//端电压测试切换按键
/******************************
引用的子函数
******************************/

void Init_device(void);		//初始化程序
void delay(unsigned char);	//扬时程序

void send_data(unsigned char,unsigned char);  	//发送显示程序 	
void display_start(void);		//显示初始化
void display(void);		//显示函数
void keyscan(void);		//按键扫描函数


void lf2011(void);	
void lf2012(void);
void lf2014(void);
void lf2016(void);
void lf2021(void);
void lf2027(void);
void lf2041(void);
void lf2040(void);
void lf2043(void);

/******************************************************************** 
功    能:初始化程序
说    明:上电后调用一次即可
***********************************************************************/
void Init_device(void)
{
	OPTION = 0x00;		//不对定时器0进行操作						
	PORTA = 0xff;		
	TRISA = 0x0f;  		//RA<0..3>为输入
	PORTB=0xfc;
	TRISB=0xe0;
	RBPU=0;			//使能内部上拉	
	PORTC=0;
	TRISC = 0x00;		
	INTCON = 0xC0;		
	ADCON1 = 0x07;		//111//对应全为数
	PIR1 = 0;		//清除所有外设中断标志位
	TMR1L = 0x00;		//定时器低8位,
	TMR1H = 0xd9;		//定时器高8位
	PIE1=0x01;		//允许定时器1,
	UIx=3;			//默认为LF2041
	homonymy=0;
	Uokey_value=0;
	Iokey_value=0;
	IRkey_value=1;
	irbz=0;
	ubz=0;
	ibz=0;
	uibz=0;
	gnbz=0;
	BJ_A=0;
	BJ_B=0;
}
/******************************************************************** 
功    能:延时
说    明:i=1为24us ,2为34us,3为44us
入口参数:unsigned char i
***********************************************************************/
void delay(unsigned char i)        //延时
{
     
	while(i--)
	{
		NOP();
		NOP();
		CLRWDT();
		NOP();
	}
}   
/******************************************************************** 
功    能:发送显存数据
********************************************************************/
void send_data(unsigned char data_bus,unsigned char loop)
{
  	unsigned char i;
  	for(i=loop;i>0;i--)
  	{
 		delay(5);
   		CLK=0;
   		if(data_bus & 0x80) DATA=1;
   		else DATA= 0;
   		data_bus<<=1;
   		delay(5);
   		CLK=1;  
  	}
}
/******************************************************************** 
功    能:	显示初始化
备注:		深圳清显电子HT1621驱动
***********************************************************************/
void display_start(void)
{
	unsigned char i;
  	CS=0;
  	send_data(0x80,0x03);   				//送3位命令模式代码100	
  	for(i=0;i<6;i++)
  	{
   		send_data(TAB_REST[i],0x09);    		//送9位命令代码 
  	}
  	CS=1;
   	CLK=1;	
}
/**********************************************************************
功    能:显示函数

说    明:把要显示的数据查表译码,送入缓冲区:Dis_buff[],然后调用此函数它将从0位至第7位逐位送入。  
***********************************************************************/
void display(void)
{
  	unsigned char t;
  	CS=0;
  	send_data(0xa0,0x03);  				//送3位WRITE 模式命令代码101
  	send_data(0,0x06); 				       //送6位首地址00h
  	for(t=0;t<7;t++)
  	{
   		send_data(Dis_buff[t],8);	//送16*8显存数据{将数组Dis_buff[]数据从0位至7位逐位送入}
  	}
  	CS=1;
} 	
/****************************************************************** 
功    能:按键扫描

说    明:
******************************************************************/
void keyscan(void)
{
	unsigned char   i;
	if(!FUNCTION)
	{
		for(i=5;i>1;i--)delay(200);
		if(!FUNCTION)gnbz=1;		//型号选择
	}
	if(FUNCTION&&gnbz)
	{
		gnbz=0;
		uibz=0;
		IRkey_value=1;
		Uokey_value=0;
		Iokey_value=0;
		Uo_QH=0;
		A_QH=0;
		DCF1=0;
		DCF2=0;
		DCF3=0;
		DCF4=0;
		DCF5=0;
		homonymy=0;
		functionkey_value++;
		if(functionkey_value>28)functionkey_value=0;
	}
	if(!IR)
	{
		for(i=5;i>1;i--)delay(200);
		if(!IR)irbz=1;		
		
	}
	if(IR&&irbz)
	{
		irbz=0;
		IRkey_value++;
		if(IRkey_value>2)IRkey_value=1;
	}
//开路测试
	if(!Uo)
	{
		for(i=5;i>1;i--)delay(200);
		if(!Uo)ubz=1;
	}
	if(Uo&&ubz)
	{
		ubz=0;
		uibz=0;
		Uokey_value++;
		Iokey_value=0;	//测试开路项时,要把短路项清0
		if(Uokey_value>UIx)Uokey_value=0;
	}
//短路测试
	if(!Io)
	{
		for(i=5;i>1;i--)delay(200);
		if(!Io)ibz=1;
	}
	if(Io&&ibz)
	{
		ibz=0;
		uibz=1;
		Iokey_value++;
		Uokey_value=0;	//测试短路项时,要把开路项清0
		if(Iokey_value>UIx)Iokey_value=0;
	}
}
/****************************************************************** 
功    能:11系列执行程序

说    明:
******************************************************************/
void lf2011(void)
{
	ZL=1;
	V_QHa=1;
	V_QHb=0;
	DCF2=0;
	DCF3=0;
	DCF5=0;	
	UIx=2;		//确定路数
	if(!uibz)
	{
		switch(Uokey_value)
		{
			case	0:		//可测功耗,两路各带上1K的负载
				Dis_buff[0]=dis_char[0];		//显示0
				Dis_buff[1]=dis_char[0];		//显示0
				Uo_QH=0;
				A_QH=0;
				DCF1=0;
				DCF4=0;
				break;	
			case	1:		//第一路开路电压
				Dis_buff[0]=dis_char[1];		//显示1
				Dis_buff[1]=dis_char[15];		//显示U	
				A_QH=1;			
				Uo_QH=1;
				DCF4=0;			
				DCF1=1;
				break;
			case	2:		//第二路开路电压
				Dis_buff[0]=dis_char[2];		//显示2
				Dis_buff[1]=dis_char[15];		//显示U	
				A_QH=1;			
				Uo_QH=1;						
				DCF1=0;
				DCF4=1;	
				break;
			default:
				Uokey_value=0;	//程序键壮用
				break;
		}
	}
	else
	{
		switch(Iokey_value)
		{
			case	0:		//可测功耗,两路各带上1K的负载
				Dis_buff[0]=dis_char[0];		//显示0
				Dis_buff[1]=dis_char[0];		//显示U	
				Uo_QH=0;
				A_QH=0;
				DCF1=0;
				DCF4=0;
				break;	
				case	1:	//第一路短路电流
				Dis_buff[0]=dis_char[1];		//显示1
				Dis_buff[1]=dis_char[10];		//显示A
				A_QH=1;					
				Uo_QH=0;
				DCF1=1;
				DCF4=0;
				break;
			case	2:		//第二路Io
				Dis_buff[0]=dis_char[2];		//显示2
				Dis_buff[1]=dis_char[10];		//显示A		
				A_QH=1;						
				Uo_QH=0;
				DCF1=0;
				DCF4=1;
				break;					
			default:
				Iokey_value=0;
				break;
		}
	}
}
/****************************************************************** 
功    能:12系列执行程序

说    明:
******************************************************************/
void lf2012(void)
{
	ZL=1;
	V_QHb=0;	
	DCF2=0;
	DCF3=0;
	UIx=3;		//确定路数
	if(!uibz)
	{
		switch(Uokey_value)
		{
			case	0:		//可测功耗,两路各带上1K的负载
				Dis_buff[0]=dis_char[0];		//显示0
				Dis_buff[1]=dis_char[0];		//显示0
				V_QHa=1;
				Uo_QH=0;
				A_QH=0;
				DCF1=0;
				DCF4=0;
				DCF5=0;
				break;	
			case	1:		//第一路开路电压
				Dis_buff[0]=dis_char[1];		//显示1
				Dis_buff[1]=dis_char[15];		//显示U	
				V_QHa=1;
				A_QH=1;			
				Uo_QH=1;
				DCF4=0;
				DCF5=0;			
				DCF1=1;
				break;
			case	2:		//第二路开路电压
				Dis_buff[0]=dis_char[2];		//显示2
				Dis_buff[1]=dis_char[15];		//显示U	
				V_QHa=1;
				A_QH=1;			
				Uo_QH=1;
				DCF5=0;						
				DCF1=0;
				DCF4=1;		
				break;
			case    3:
				Dis_buff[0]=dis_char[3];		//显示3
				Dis_buff[1]=dis_char[15];		//显示U	
				V_QHa=0;
				A_QH=1;			
				Uo_QH=1;						
				DCF1=0;
				DCF4=0;
				DCF5=1;	
			default:
				Uokey_value=0;	//程序键壮用
				break;
		}
	}
	else
	{
		switch(Iokey_value)
		{
			case	0:		//可测功耗,两路各带上1K的负载
				Dis_buff[0]=dis_char[0];		//显示0
				Dis_buff[1]=dis_char[0];		//显示0
				Uo_QH=0;
				A_QH=0;
				DCF1=0;
				DCF4=0;
				break;	
			case	1:	//第一路短路电流
				Dis_buff[0]=dis_char[1];		//显示
				Dis_buff[1]=dis_char[10];		//显示A
				A_QH=1;					
				Uo_QH=0;
				DCF1=1;
				DCF4=0;
				break;
			case	2:		//第二路Io
				Dis_buff[0]=dis_char[2];		//显示
				Dis_buff[1]=dis_char[10];		//显示A								
				Uo_QH=1;
				A_QH=0;
				DCF1=0;
				DCF4=1;
				break;					
			default:
				Iokey_value=0;
				break;
		}
	}
}
/****************************************************************** 
功    能:14系列执行程序

说    明:
******************************************************************/
void lf2014(void)
{
	ZL=1;	
	DCF4=0;
	UIx=4;		//确定路数	
	if(!uibz)
	{
		switch(Uokey_value)
		{
			case	0:
				Dis_buff[0]=dis_char[0];		//显示0
				Dis_buff[1]=dis_char[0];		//显示0
				if(IRkey_value==1)
				{
					V_QHa=0;
					V_QHb=0;		//A,E
				}
				else
				{
					V_QHa=0;
					V_QHb=1;		//B,C
				}		
				Uo_QH=0;
				A_QH=0;
				DCF1=0;
				DCF2=0;
				DCF3=0;
				DCF5=0;
				break;
			case	1:
				Dis_buff[0]=dis_char[1];		//显示1
				Dis_buff[1]=dis_char[15];		//显示U	
				IRkey_value=1;
				V_QHa=0;
				V_QHb=0;		//A,E	
				A_QH=1;			
				Uo_QH=1;
				DCF2=0;
				DCF3=0;
				DCF5=0;
				DCF1=1;				
				break;
			case	2:
				Dis_buff[0]=dis_char[2];		//显示2
				Dis_buff[1]=dis_char[15];		//显示U	
				IRkey_value=1;

⌨️ 快捷键说明

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