📄 setframe.c
字号:
#include<reg52.h>
//宏定义
#define KEY_ENTER 0x01
#define KEY_MOVE 0x02
#define KEY_DOWN 0x03
#define KEY_UP 0x04
#define KEY_SET 0x05
#define KEY_ESC 0x06
//存储在ROM中的各个地址基本,设置存入第二页中,0020-003f
#define PAGE2_BASE_ADD 0x0020//本页基本地址
#define VVALUE_STORE_ADD 0x0020//电压等级地址 10
#define CTVALUE_STORE_ADD 0x0021//CT变比地址 400
#define PTVALUE_STORE_ADD 0x0023//PT变比地址 100
#define TSCNUM_STORE_ADD 0x0024//TSC组数地址 5
//#define HVCPERMIT_STORE_ADD 0x0025//HVC允许地址 0
#define HVCNUM_STORE_ADD 0x0026//HVC组数地址 3
#define RUNMOD_STORE_ADD 0x0027//运行模式地址 0
#define TTHRESH_STORE_ADD 0x0028//投入门限地址 75/实际为0.75
#define QTHRESH_STORE_ADD 0x0029//切除门限地址 99/实际为0.99
#define TCOEFFI_STORE_ADD 0x002a//投入系数地址 110/实际为1.10
//----------------------------------------------------
//******************************************************
typedef unsigned char uchar;
typedef unsigned int uint;
//-----------------------------------------------------------------------------------------------------
//外部函数声明
extern void display3list(unsigned int *STRTABLE[]);//显示一屏的4行,通过改变全局变量fbchar,i有不同的显示效果,并改变全局变量selenum,
extern void key_up_move(unsigned int *STRTAB[]);//按上移键,反白上移,若为第一条则不动,输入:字符串地址列表*STRTAB[]
extern void key_down_move(unsigned int *STRTAB[],unsigned char num);//按下移键,反白下移,若为最后一条则不动?/输入:字符串地址列表数组*STRTAB[],选项总数num,void getfigurebit(unsigned int para);
extern void init_frame(unsigned int *STRTAB[]);//写初始页面
extern void clearscreen();
extern void getfigurebit(unsigned int para);//得到各个位,最高bit4,bit3,bit2,bit1;
extern void putchar(unsigned int singlecharnum);
extern void putstr(unsigned int *STR);
//void set_time();
void send_single8(unsigned char para_ID,unsigned char para8);
void send_single16(unsigned char para_ID,unsigned int para16);
void dsp_ans(unsigned char check_ID);
void message_show();
//void can_common();
void delay20ms();
extern void bytewrite_chip1(uint wbyteadd,uchar wbytedata);
extern uchar byteread_chip1(uint rbyteadd);
extern void wordwrite_chip1(uint wwordadd,uint wworddata);
extern uint wordread_chip1(uint rwordadd);
//----------------------------------------------------------------------------------------------
//外部变量声明
extern uchar xdata KEY_BUF;
extern uchar xdata selenum;//选择的字符串号,16位
extern uchar xdata i; //第二行显示的字符串号
extern uchar xdata fbchar; //fbchar为反白字节,4时第一行反白,2时第二行反白,1时最后一行反白
extern uchar xdata TOTALNUM;
extern uchar xdata XPOS;//XPOS为0~7
extern uchar xdata YPOS;//YPOS为0~127
extern bit FB_FLAG;
extern unsigned int xdata bit1,bit2,bit3,bit4;
//--------------------------------------------------------------------------------
//外部变量定义
unsigned int xdata VVALUE,CTVALUE,PTVALUE,TSCNUM,HVCNUM,RUNMOD,TTHRESH,QTHRESH,TCOEFFI;
//unsigned int data SLOPETIME,STARTTORQUE,DUDELAY,STOPTIME,ID;//各全局变量
unsigned int xdata basevar[11];//变量表,记录各全局变量
unsigned int xdata var,max;
bit fbbit1,fbbit2,fbbit3;
unsigned char xdata fbbitchar;
unsigned char xdata selebit;//设数时的各反白标志
unsigned char xdata Flag_unit;//有无单位标志
unsigned char remi;//记录第一行是哪个选项的变量
extern bit DSP_REV_FLAG;//DSP是否接受数据标志位,0接受,1 没有接受
unsigned char xdata SENDDATABUF[10];//发送缓冲器,存放包括两个字节ID在内的10个字节,放在XDATA
unsigned char xdata REVDATABUF[10];//接受缓冲器,存放包括两个字节ID在内的10个字节,放在XDATA
//数组定义
//-------------------------------------------
unsigned char code basic_para_ID[7]={0xff,0x02,0x03,0x04,0x05,0x06,0x07};//参数ID
//----------------------------------
//unsigned int code unit[7]={0x0017,0x003b,0x0036,0x002A,0x0030,0x0030,0x000a};//单位表{'','KV','A','?','?','?','?',}
unsigned int code maxvar[7]={0,600,30,90,100,120,99};//变量最值表
//字符串定义
unsigned int code STR0bsettitle[] = {0x8022,0x8023,0x8024,0x8025,0x00ff};//基本设置
unsigned int code STR1_voltrank[] = {0x0001,0x800F,0x8033,0x8034,0x8035,0x0017,0x00ff};//1电压等级
unsigned int code STR2_CTratio[] = {0x0002,0x0017,0x0038,0x0044,0x0017,0x804A,0x804B,0x0017,0x00ff};//2CT变比
unsigned int code STR3_PTratio[] = {0x0003,0x0017,0x003E,0x0044,0x0017,0x804A,0x804B,0x0017,0x00ff};//3PT变比
unsigned int code STR4_TSCnum[] = {0x0004,0x0017,0x0044,0x0042,0x0038,0x804C,0x801F,0x0017,0x00ff};//4TSC组数
//unsigned int code STR5_stoptime[] = {0x0005,0x0017,0x0039,0x0046,0x0038,0x804D,0x804E,0x0017,0x00ff};//5HVC允许
unsigned int code STR5_HVCnum[] = {0x0005,0x0017,0x0039,0x0046,0x0038,0x804C,0x801F,0x0017,0x00ff};//6HVC组数
unsigned int code STR6_runmod[] = {0x0006,0x804F,0x8050,0x8051,0x8052,0x0017,0x00ff};//7运行方式
unsigned int code STR7_TOUthreshold[] = {0x0007,0x8053,0x8054,0x8055,0x8056,0x0017,0x00ff};//8投入门限
unsigned int code STR8_QIEthreshold[] = {0x0008,0x8057,0x8058,0x8055,0x8056,0x0017,0x00ff};//9切除门限
unsigned int code STR9_coefficient[] = {0x0009,0x8053,0x8054,0x8022,0x801F,0x00ff};//10投入系数
unsigned int * code BSETSTRTABLE[] = {STR0bsettitle,STR1_voltrank,STR2_CTratio,STR3_PTratio,STR4_TSCnum,STR5_HVCnum,STR6_runmod,STR7_TOUthreshold,STR8_QIEthreshold,STR9_coefficient};
unsigned int code UNIT0_Volt[] = {0x003b,0x0047,0x00ff};//Kv
unsigned int code UNIT3_Group[] = {0x804c,0x00ff};//组
unsigned int code UNIT4_Group[] = {0x804c,0x00ff};//组
//unsigned int code UNIT2_ActiveP[] = {0x003b,0x0049,0x00ff};//Kw
//unsigned int code UNIT3_Reactive[] = {0x003b,0x0047,0x005d,0x0041,0x00ff};//Kvar
//unsigned int code UNIT4_Frequency[] = {0x0039,0x0060,0x00ff};//Hz
//unsigned int code UNIT5_PQuant[] = {0x003b,0x0049,0x0061,0x00ff};//Kwh
//unsigned int code UNIT8_Second[] = {0x0043,0x00ff};//s
//unsigned int code UNIT9_MSecond[] = {0x003c,0x0043,0x00ff};//ms
unsigned int * code UNITTABLE[] = {UNIT0_Volt,UNIT0_Volt,UNIT0_Volt,UNIT0_Volt,UNIT3_Group,UNIT4_Group};
//-----------------------------------------------------------------------------------------
//写000型数据
void write3dfig()
{
if(fbbitchar==1)
{
selebit=1;
fbbit1=1;
fbbit2=0;
fbbit3=0;
}
else if(fbbitchar==2)
{
selebit=2;
fbbit1=0;
fbbit2=1;
fbbit3=0;
}
else if(fbbitchar==4)
{
selebit=3;
fbbit1=0;
fbbit2=0;
fbbit3=1;
}
XPOS=4;
YPOS=56;
FB_FLAG=fbbit3;
putchar(bit3);//写百位
YPOS=64;
FB_FLAG=fbbit2;
putchar(bit2);//写十位
YPOS=72;
FB_FLAG=fbbit1;
putchar(bit1);
}//写个位
//----------------------------------------------------------------------
//写入00.0型数据
void write2d1fig()
{
if(fbbitchar==1)
{
selebit=1;
fbbit1=1;
fbbit2=0;
fbbit3=0;
}
else if(fbbitchar==2)
{
selebit=2;
fbbit1=0;
fbbit2=1;
fbbit3=0;
}
else if(fbbitchar==4)
{
selebit=3;
fbbit1=0;
fbbit2=0;
fbbit3=1;
}
XPOS=4;
YPOS=48;
FB_FLAG=fbbit3;
putchar(bit3);//写十位
YPOS=56;
FB_FLAG=fbbit2;
putchar(bit2);//写个位
YPOS=64;
FB_FLAG=0;
putchar(0x0028);//写小数点
YPOS=72;
FB_FLAG=fbbit1;
putchar(bit1);
}//写小数位
//----------------------------------------------------------------------
//写标题和单位
void setwritestr()
{
XPOS=0;
YPOS=0;
FB_FLAG=0;
putstr(BSETSTRTABLE[selenum]); //写标题
XPOS=4;
YPOS=80;
if(Flag_unit == 1)//有单位 则写单位
{
putstr(UNITTABLE[selenum]);//写单位
Flag_unit = 0;
}
}
//------------------------------------------------------------------
//从变量var得到各位数,写数
void bsetwritefig()
{
if(var>max)
var=max;
if(selenum==0x04)
{
getfigurebit(var);
write2d1fig();
}//堵转延迟写的是小数,其他写的是3位整数
else
{
getfigurebit(var);
write3dfig();
}
}
//--------------------------------------------------------------
void key_fig_up()//按向上键,各位数加1 ,加到9时,恢复为0,加数及时更新变量写数,最大值为max
{
if(selebit==1)
{
if(bit1==9)
bit1=0;
else
bit1++;
}
else if(selebit==2)
{
if(bit2==9)
bit2=0;
else
bit2++;
}
else if(selebit==3)
{
if(bit3==9)
bit3=0;
else
bit3++;
}
var=bit3*100+bit2*10+bit1; //及时更新数据
}
//-------------------------------------------------------------------
void key_fig_down()//按向下键,各位数减1,减到0时循环到9
{
if(selebit==1)
{
if(bit1==0)
bit1=9;
else
bit1--;
}
else if(selebit==2)
{
if(bit2==0)
bit2=9;
else
bit2--;
}
else if(selebit==3)
{
if(bit3==0)
bit3=9;
else
bit3--;
}
var=bit3*100+bit2*10+bit1;//及时更新数据
}//写数
//--------------------------------------------------------------------------
void set_key_move()//修改数时反白向左移移到0100时,恢复为0001,重写一遍数据
{
if(fbbitchar==4)
fbbitchar=1;
else
fbbitchar<<=1;
}
//----------------------------------------------------------------------------------
//基本设数函数
void bset_key_set()
{
clearscreen();
basevar[1] = VVALUE;
basevar[2] = CTVALUE;
basevar[3] = PTVALUE;
basevar[4] = TSCNUM;
basevar[5] = HVCNUM;
basevar[6] = RUNMOD;
basevar[7] = TTHRESH;
basevar[8] = QTHRESH;
basevar[9] = TCOEFFI;
if(selenum<10) //选中前六项,执行下面的函数
{
fbbitchar=1;
var=basevar[selenum];
max=maxvar[selenum];
if(selenum == 1 || selenum == 4 || selenum == 5)
Flag_unit = 1;//有单位
else
Flag_unit = 0;//无单位
setwritestr();
bsetwritefig();
while(KEY_BUF != KEY_ESC&&KEY_BUF != KEY_ENTER)
{
if(KEY_BUF == KEY_MOVE)
{
set_key_move();
bsetwritefig();
KEY_BUF=0xff;
}
else if(KEY_BUF == KEY_UP)
{
key_fig_up();
bsetwritefig();
KEY_BUF=0xff;
}
else if(KEY_BUF == KEY_DOWN)
{
key_fig_down();
bsetwritefig();
KEY_BUF=0xff;
}
}
if(KEY_BUF == KEY_ENTER) //按enter键更新各全局变量
{
// if(selenum==1)
// send_single16(basic_para_ID[1],var);
// else
// send_single8(basic_para_ID[selenum],(uchar)var);//发送数据
// delay20ms();
// dsp_ans(basic_para_ID[selenum]);
// if(DSP_REV_FLAG==0)//该页面的数据处理,将设定的参数存入相应的的地址
// {
if(selenum==1)
wordwrite_chip1(VVALUE_STORE_ADD,var);//选择的是限流(16)
else
bytewrite_chip1((PAGE2_BASE_ADD+selenum),(uchar)var);
basevar[selenum] = var;
VVALUE = basevar[1]; //及时更新各个全局变量
CTVALUE = (uchar)basevar[2];
PTVALUE = (uchar)basevar[3];
TSCNUM = (uchar)basevar[4];
HVCNUM = (uchar)basevar[5];
RUNMOD = (uchar)basevar[6];
TTHRESH = (uchar)basevar[7];
QTHRESH = (uchar)basevar[8];
TCOEFFI = (uchar)basevar[9];
// }
}
}
// else if(selenum==7)
// set_time();
}
//-----------------------------------------------------------------------
void main_bset()
{
TOTALNUM = 9;//共有10项
clearscreen();//清屏
init_frame(BSETSTRTABLE);//写初始页面
VVALUE = byteread_chip1(VVALUE_STORE_ADD);//从ROM中读出相应数据
CTVALUE = wordread_chip1(CTVALUE_STORE_ADD);
PTVALUE = byteread_chip1(PTVALUE_STORE_ADD);
TSCNUM = byteread_chip1(TSCNUM_STORE_ADD);
HVCNUM = byteread_chip1(HVCNUM_STORE_ADD);
RUNMOD = byteread_chip1(RUNMOD_STORE_ADD);
TTHRESH = byteread_chip1(TTHRESH_STORE_ADD);
QTHRESH = byteread_chip1(QTHRESH_STORE_ADD);
TCOEFFI = byteread_chip1(TCOEFFI_STORE_ADD);
basevar[1] = VVALUE;
basevar[2] = CTVALUE;
basevar[3] = PTVALUE;
basevar[4] = TSCNUM;
basevar[5] = HVCNUM;
basevar[6] = RUNMOD;
basevar[7] = TTHRESH;
basevar[8] = QTHRESH;
basevar[9] = TCOEFFI;
while(KEY_BUF!=KEY_ESC)
{
if(KEY_BUF==KEY_UP)
key_up_move(BSETSTRTABLE);//上移选项
else if(KEY_BUF==KEY_DOWN)
key_down_move(BSETSTRTABLE,TOTALNUM);//下移选项
else if(KEY_BUF==KEY_SET)
{
remi=i;
bset_key_set();
// can_common();
KEY_BUF=0xff;
i=remi;
clearscreen();
display3list(BSETSTRTABLE);//回到上一页面
}
}
}//设置后按KEY
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -