📄 byq10.c
字号:
#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 + -