📄 struct.c
字号:
#include <iom8v.h>
#include <macros.h>
#include "eeprom.h"
#include "m8pic73.h"
unsigned int out_value=0; //输出数据
unsigned char st_byte=0; //参数指针
unsigned char st_bit=0; //位指针
unsigned char vbit[4]={0,0,0,0}; //参数的四位
unsigned int hole_vbit[5]={0,0,0,0,0}; //5个参数
//hole_vbit[0] 运行目标
//hole_vbit[1] 采样时间
//hole_vbit[2] 最小变化值
//hole_vbit[3] 模式
//hole_vbit[4] 预加常数
/*********设置参数程序*********/
/*
st_byte=0; 参数指针
st_bit=0; 位指针
vbit[4]={0,0,0,0}; 参数的四位
hole_vbit[5]={0,0,0,0,0}; 5个参数*/
void data_setting(void)
{
unsigned char i;
switch (readkey()) //根据键值跳转
{
case 3 :{ //OK key
if (f_mode==0) //从运行模式转到设置模式第一层
{
f_mode=1;
load_vbit(); //读eeprom数据
disp_ram[0]=16; //显示格式 P
disp_ram[1]=18; //显示格式 -
disp_ram[2]=18; //显示格式 -
disp_ram[3]=st_byte;//显示被设置参数
disp_int_value(hole_vbit[st_byte],4); //显示参数内容
}
else
{
if (f_mode==2) //从设置模式第二层转到第一层
{
get_hole_vbit(); //保存当前设置值
f_mode=1;
disp_ram[0]=16; //显示格式 P
disp_ram[1]=18; //显示格式 -
disp_ram[2]=18; //显示格式 -
disp_ram[3]=st_byte;//显示被设置参数
}
else //返回运行模式
{
f_mode=0;
save_vbit(); //保存数据到eeprom
st_byte=0; //设置要显示的参数0
disp_int_value(hole_vbit[st_byte],4); //显示参数内容
disp_ram[0]=0; //mode change need refill
disp_ram[1]=0;
disp_ram[2]=0;
disp_ram[3]=0;
}
}
break;
}
case 5 :{ //add key
if (f_mode==0) break;
if (f_mode==1) //切换要设置的参数
{
st_byte++;
if (st_byte>4) st_byte=0; //第5个参数后回0
disp_ram[3]=st_byte;
disp_int_value(hole_vbit[st_byte],4); //显示参数内容
break;
}
if (f_mode==2) //加参数的值
{
vbit[st_bit]++;
if (vbit[st_bit]>9) vbit[st_bit]=0;
disp_ram[7-st_bit]=vbit[st_bit];
break;
}
break;
}
case 6 :{ //move key
if (f_mode==2) //在第二层各bit里换位置
{
disp_ram[7-st_bit]=vbit[st_bit];
st_bit++;
if (st_bit>3) st_bit=0;
break;
}
if (f_mode==1) //进入设置模式第二层
{
disp_ram[3]=st_byte;
divide_vbit(); //分解并显示参数
f_mode=2;
st_bit=0;
}
else break;
}
default: break;
}
if (hole_vbit[0]>9998) hole_vbit[0]=9999; //运行目标
if (hole_vbit[0]<1) hole_vbit[0]=1;
if (hole_vbit[1]>9998) hole_vbit[1]=9999; //采样时间
if (hole_vbit[1]<1) hole_vbit[1]=1;
if (hole_vbit[2]>100) hole_vbit[2]=100; //最小变化值
if (hole_vbit[2]<1) hole_vbit[2]=1;
if (hole_vbit[3]>3) hole_vbit[3]=3; //模式
if (hole_vbit[4]>511) hole_vbit[4]=511; //预加常数
if (hole_vbit[4]<1) hole_vbit[4]=1;
out_value=hole_vbit[4]; //输出等于预加常数
}
/*****(设置参数程序**end)*******/
/*********运行输出程序*********/
void wdy_output(void)
{
switch (hole_vbit[3]) //根据模式值跳转
{
case 0 :{ //模式0 二分法逼近
if (((speed_vs-hole_vbit[0])<hole_vbit[2])|((hole_vbit[0]-speed_vs)<hole_vbit[2])); //实际=目标
else
{
if (speed_vs<hole_vbit[0]) //实际<目标 加大输出
{
if (out_value+((speed_vs-hole_vbit[0])/2/hole_vbit[2])>512) out_value=512;
else out_value=out_value+((speed_vs-hole_vbit[0])/2/hole_vbit[2]);
}
else //实际>目标 减少输出
{
if (out_value<((speed_vs-hole_vbit[0])/2/hole_vbit[2])) out_value=1;
else out_value=out_value-((speed_vs-hole_vbit[0])/2/hole_vbit[2]);
}
}
break;
}
case 1 :{ //模式1 逐个逼近
if (((speed_vs-hole_vbit[0])<hole_vbit[2])|((hole_vbit[0]-speed_vs)<hole_vbit[2])); //实际=目标
else
{
if (speed_vs<hole_vbit[0]) //实际<目标 加大输出
{
// out_value=512;
// if (out_value<1) out_value=1;
// else out_value--;
if (out_value>511) out_value=512;
else out_value++;
}
else //实际>目标 减少输出
{
// if (out_value>511) out_value=512;
// else out_value++;
if (out_value<1) out_value=1;
else out_value--;
}
}
break;
}
case 2 :{ //模式2 直接逼近
if (((speed_vs-hole_vbit[0])<hole_vbit[2])|((hole_vbit[0]-speed_vs)<hole_vbit[2])); //实际=目标
else
{
if (speed_vs<hole_vbit[0]) //实际<目标 加大输出
{
if (out_value+((speed_vs-hole_vbit[0])/hole_vbit[2])>512) out_value=512;
else out_value=out_value+((speed_vs-hole_vbit[0])/hole_vbit[2]);
}
else //实际>目标 减少输出
{
if (out_value<((speed_vs-hole_vbit[0])/hole_vbit[2])) out_value=1;
else out_value=out_value-((speed_vs-hole_vbit[0])/hole_vbit[2]);
}
}
break;
}
default: break;
}
if (out_value>511) out_value=512; //
if (out_value<1) out_value=1;
DAC_output(out_value); //输出到DAC
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -