📄 fivet140y.c
字号:
Modified=0;
}
CHnum++;
if(CHnum>5)
{
CHnum=1;
low_f=0; //5个通道都已经设置,退出设置下限模式
opAD_flag=1;
circle=1;
return;
}
return;
}
if(up_f)//如果是在显示上限模式下,则做以下处理
{
if(Modified)//如果下限值有被修改,将修改过的下限值写入EEPROM
{ close();
ewr(25+CHnum,Upper[CHnum-1]);
//wait(10000);
open();
Modified=0;
}
CHnum++;
if(CHnum>5)
{
CHnum=1;
up_f=0; //5个通道都已经设置,退出设置上限模式
opAD_flag=1;
circle=1;
return;
}
return;
}
if(single) //如果是在单通道显示模式下,则退出此模式,转为正常循环
{
single=0;
circle=1;
key4_f=0;
return; //返回
}
switch(key4_f)
{
case 1: {
CHnum=0;
Adj_Zero=1; //进入调0模式
break;
}
case 2: { //单通道显示模式
CHnum=1;
single=1;
circle=0;
opAD_flag=1;
break;
}
case 3: {
up_f=1;//显示上限标志置一
CHnum=1;
//single=0;
circle=0;
opAD_flag=0;//禁止操作AD
break;
}
case 4: {
low_f=1;//显示下限标志置一
CHnum=1;
circle=0;
opAD_flag=0;//禁止操作AD
break;
}
default: break;
}
key4_f=0;//key4_f清0,否则下次再按K4,计数会错误
return;
}
/*减少键k2处理函数*/
void Key2()
{
if(single) //是单通道显示模式下
{
if(--CHnum<1) CHnum=5;
opAD_flag=1;
return;
}
if(up_f)//在调整上限模式下
{
if(Upper[CHnum-1]>50) //上限值不能低于50
Upper[CHnum-1]-=1;//减一
Modified=1;//设置限制已有修改标志
return;
}
if(low_f)//在调整下限模式下
{
if(Lower[CHnum-1]>0) //下限值不能低于0
Lower[CHnum-1]-=1;//减一
Modified=1;//设置限制已有修改标志
return;
}
}
/*增加键k3处理函数*/
void Key3()
{
if(single) //是单通道显示模式下
{
if(++CHnum>5) CHnum=1;
opAD_flag=1;
return;
}
if(up_f)//在调整上限模式下
{
if(Upper[CHnum-1]<200)//上限值不能大于200
Upper[CHnum-1]+=1;//加一
Modified=1;//设置限制已有修改标志
return;
}
if(low_f)//在调整下限模式下
{
if(Lower[CHnum-1]<40) //下限值不能大于40
Lower[CHnum-1]+=1;//加一
Modified=1;//设置限制已有修改标志
return;
}
}
/*模式键k4处理函数*/
void Key4()
{
idata unsigned char i;
if(Adj_Zero||single||up_f||low_f) //如果是在调零模式、单通道显示模式、设置上下限模式,则此按键无效
{
key4_f=0;
return; //返回
}
key4_f++;
if(key4_f>4) key4_f=1;
switch(key4_f)
{
case 1: {
Vcode[1]=0;//"0"给DS6,调0模式信息为F0
break;
}
case 2: {
Vcode[1]=1;//"1"给DS6,单通道循环显示模式信息为F1
break;
}
case 3: {
Vcode[1]=2;//"2"给DS6,设置上限模式信息为F2
break;
}
case 4: {
Vcode[1]=3;//"3"给DS6,设置下限模式信息为F3
break;
}
default: break;
}
ModeWait=1;
Vcode[0]=14;//"F"给DS7
Vcode[3]=Vcode[4]=Vcode[5]=Vcode[6]=11;//"-"
for(i=0;i<7;i++) Dis_dat[i]=table[Vcode[i]];//显示模式信息
return;
}
/*显示下限*/
void dislow(void)
{
sendlim(Lower[CHnum-1]);
}
/*显示上限*/
void disup(void)
{
sendlim(Upper[CHnum-1]);
}
/*送上(下)限值去显示缓存*/
void sendlim(signed char temp)
{ idata unsigned char i;
Dis_dat[0]=table[CHnum]; //第一个为通道号
Dis_dat[1]=0x00;
//if(temp<0) {Dis_dat[1]=0xbf;temp=-1*temp;}//负值,第二个显示负号,并取绝对值
//else Dis_dat[1]=0xff; //正值,第二个灭
if(temp==0)
{
Dis_dat[6]=table[0];//最后一位显示0
Dis_dat[1]=Dis_dat[2]=Dis_dat[3]=Dis_dat[4]=Dis_dat[5]=0x00;//其它灭
}
else
{
for(i=6;i>1;i--)
{
if(temp>0)
{
Dis_dat[i]=table[temp%10]; //各位的数字放入对应显示缓存
temp=temp/10;
}
else Dis_dat[i]=0x00; //没有数字的位灭
}
}
}
void CTRL_R(float value)
{
data unsigned char IOCON;
//idata unsigned Upnum=0,Lonum=0;//记录超过限值的通道数
if(value>Upper[CHnum-1])//判断是否超过上限
Upnum++; //记录超过上限的通道数
else if(value<Lower[CHnum-1])//判断是否低于下限
Lonum++; //记录低于下限的通道数
if(Upnum>0&&Lonum>0)
IOCON=0X33;
if(Upnum>0&&Lonum==0)
IOCON=0X32;
if(Upnum==0&&Lonum==0)
IOCON=0X30;
if(Upnum==0&&Lonum>0)
IOCON=0X31;
close();
writetoreg(0x07); //write to communication register. The next step is writing to IO REGISTER
open();
close();
writetoreg(IOCON);//control IO
open();
if(circle&&CHnum==5) Upnum=Lonum=0;//循环显示的时候,CHnum=5时候清零
else if(single) Upnum=Lonum=0;//单通道显示的时候每次清零
}
/*喂看门狗*/
void dog(void)
{
CATDAT=0;
wait_delay();
CATDAT=1;
}
/*存浮点数到EEPROM*/
void FtoE(float a,unsigned char adr)
{
idata unsigned char i;
data char *px,x[4],dat;
void *pf;
px=x;
pf=&a;
for(i=0;i<4;i++)//强制void型指针转成char型,因为void型指针不能运算
{*(px+i)=*((char *)pf+i);}
for(i=0;i<4;i++)
{
dat=x[i];
ewr(adr+i,dat);
wait(10000);
}
}
/*从EEPROM读取浮点数*/
float EtoF(unsigned char adr)
{
idata float a;
idata unsigned char i;
idata char *px,x[4],dat;
void *pf;
for(i=0;i<4;i++)
{
dat=erd(adr+i);
x[i]=dat;
}
px=x;
pf=&a;
for(i=0;i<4;i++)
{ *((char *)pf+i)=*(px+i); }
return(a);
}
/*eerom不存在或损坏显示*/
void disperr(void)
{
idata unsigned char i;
//填入eeprom的错误信息,DS7DS6显示E1,其他显示-
Vcode[0]=10;
Vcode[1]=1;
Vcode[3]=Vcode[4]=Vcode[5]=Vcode[6]=11;
for(i=0;i<7;i++) Dis_dat[i]=table[Vcode[i]];
}
/*非应答函数*/
void mnack(void)
{
CATDAT=1;
wait_delay();
CATCLK=1;
wait_delay();
CATCLK=0;
}
/*I2C总线开始函数*/
void start(void)
{
CATDAT=1;
wait_delay();
CATCLK=1;
wait_delay();
CATDAT=0;
wait_delay();
CATCLK=0;
wait_delay();
}
/*I2C总线停止函数*/
void stop(void)
{
CATDAT=0;
wait_delay();
CATCLK=1;
wait_delay();
CATDAT=1;
wait_delay();
}
/*I2C总线字节接收传送函数*/
unsigned char erxd(void)
{
idata unsigned char n=0;
idata unsigned char j;
for(j=0;j<8;j++)
{
CATDAT=1;
n=n<<1;
CATCLK=1;
wait_delay();
if(CATDAT==1) n++;
CATCLK=0;
}
return(n);
}
/*I2C字节写传送函数*/
void etxd(n)
unsigned char n;
{
idata unsigned char i;
for(i=0;i<8;i++)
{
if((n&0x80)!=0) CATDAT=1;
else CATDAT=0;
wait_delay();
CATCLK=1;
wait_delay();
n=n<<1;
CATCLK=0;
}
}
/*I2C字节读函数*/
unsigned char erd(adds)
unsigned char adds;
{
idata unsigned char dats;
start();
etxd(0xa0);
mnack();
etxd(adds);
mnack();
start();
etxd(0xa1);
mnack();
dats=erxd();
mnack();
stop();
return(dats);
}
/*I2C字节写函数*/
void ewr(unsigned char adds, unsigned char dats)
{
start();
etxd(0xa0);
mnack();
etxd(adds);
mnack();
etxd(dats);
mnack();
stop();
}
/*延时等待函数*/
void wait_delay(void)
{
nopt=!nopt;nopt=!nopt;nopt=!nopt;nopt=!nopt;nopt=!nopt;nopt=!nopt;
nopt=!nopt;nopt=!nopt;nopt=!nopt;nopt=!nopt;nopt=!nopt;nopt=!nopt;
}
/*等待延时函数*/
void wait(unsigned int ji)
{
idata unsigned int jj;
jj=ji;
dog();
do {jj--;}while(jj!=0);
}
/*延时*/
void delay(unsigned int time)
{
idata unsigned char i;
close(); //软件延时的时候关中断
while(time--)
{
for(i=0;i<10;i++) {;}
}
open();
}
/*定时器0中断处理*/
void clk0_int(void) interrupt 1 using 0
{
//T2ms=!T2ms;
//if(T2ms) disbyte();//2ms显示一次
disbyte();
if(++time==period) //1秒时间到
{ time=0;
if(RomEr)//eeprom损坏
{
if(++Tns==5) {RomEr=!RomEr;Tns=0;}//5秒到,不再显示损坏信息
}
else if(ModeWait)//等待模式确认
{
if(++Tns==20) {ModeWait=0;Tns=0;}//半分钟到,还未确认模式,返回正常循环显示模式
}
else
{
if(single) single_disp();
if(circle) circle_disp();
}
}
clock0_init();//初始化定时器
}
/*外部0中断服务程序*/
void exint0(void) interrupt 0
{
EX0=0;//关闭外部0中断
rdAD=1;//设置转换完毕标志
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -