📄 main.c
字号:
//========================================================================================
//校正密码验证
//========================================================================================
WDTCTL=WDTPW+WDTHOLD; //Stop WDT
LCD_NUM=6;
rest_LCD_data();
if(!Password_ok_flag)
Password_check();
if(Exit_Modify_flag) goto Exit_Modify;
//========================================================================================
//校正密码验证通过进入用户上下限的输入
//========================================================================================
// rest_LCD_data();
user_zero=User_input(0);//下限输入
_NOP();
//rest_LCD_data();
user_basinful=User_input(0);//上限输入
_NOP();
if(user_basinful>10000) P_RangeFlag=1;
//========================================================================================
//校正密码验证通过进入PGA的校正
//========================================================================================
PGA_Plus=0x00;
WDTCTL =WDT_ADLY_250; //WDT_ADLY_250;
IE1 |= WDTIE; // Enable WDT interrupt
AD_Task_Complete=0;
flag=0;
while(flag)
{
while(AD_Task_Complete)
{
AD_Task_Complete=0;
flag=0;
for(i=0;i<(AD_Sampling_Time-1);i++)
{
ad1240_test[i]=Sampling_AD.Sampling_AD_Num[i+1];
}
}
}
WDTCTL=WDTPW+WDTHOLD; //Stop WDT
ad1240_PGA=(unsigned long int)((ad1240_test[0]+ad1240_test[1])/2);
k=0;
k=(unsigned long int)(8388608/ad1240_PGA);
if(k>64) PGA_Plus=6;
else {if(k>32) PGA_Plus=5;
else{if(k>16) PGA_Plus=4;
else{if(k>8) PGA_Plus=3;
else{if(k>4) PGA_Plus=2;
else{if(k>2) PGA_Plus=1;
else{ PGA_Plus=0;}
}
}
}
}
}
//========================================================================================
//请用户输入线性校正点个数
//========================================================================================
line_revise_num=6;
line_revise_num=Line_num_Input(line_revise_num);
//========================================================================================
//进入线性校正
//========================================================================================
data=(user_basinful-user_zero)/line_revise_num;
//if(abs(user_zero)>99999) user_zero=0;
//if(abs(user_basinful)>99999) user_basinful=0;
//if(abs(data)>99999) data=0;
LCD_NUM=6;
for(i=0;i<line_revise_num;i++)
{
if(i==(line_revise_num-1))
Standard_Press[i]=User_input(user_zero);
else
{
data_ad =user_basinful-i*data;
Standard_Press[i]=User_input(data_ad);
}
WDTCTL =WDT_ADLY_250; //WDT_ADLY_250;
IE1 |= WDTIE; // Enable WDT interrupt
AD_Task_Complete=0;
flag=1;
while(flag)
{
while(AD_Task_Complete)
{
AD_Task_Complete=0;
flag=0;
for(j=0;j<(AD_Sampling_Time-1);j++)
{
ad1240_test[j]=Sampling_AD.Sampling_AD_Num[j+1];
}
}
}
WDTCTL=WDTPW+WDTHOLD; //Stop WDT
ad12401=(long int)((ad1240_test[0]+ad1240_test[1])/2);
Measure_Press[i]=ad12401;
}
Dis_key_INT();
Press_Adjust_state=0x01;
WriteWord(Adjust_state,Press_Adjust_state);//压力校正标志
WriteWord(AD_PGA_Plus,PGA_Plus);//PGA输入
Foat_TO_Char(user_zero,char_data); //user_basinful
WriteWord(Press_Zero,char_data[0]);//压力用户输入零点
WriteWord((Press_Zero+1),char_data[1]);//压力用户输入零点
WriteWord((Press_Zero+2),char_data[2]);//压力用户输入零点
WriteWord((Press_Zero+3),char_data[3]);//压力用户输入零点
Foat_TO_Char(user_basinful,char_data);
WriteWord(Press_Most,char_data[0]);//压力用户输入满程
WriteWord((Press_Most+1),char_data[1]);//压力用户输入满程
WriteWord((Press_Most+2),char_data[2]);//压力用户输入满程
WriteWord((Press_Most+3),char_data[3]);//压力用户输入满程
WriteWord(Press_line_modify_num,line_revise_num);//线性校正点的个数
for(i=0;i<line_revise_num;i++)
{
Foat_TO_Char(Standard_Press[i],char_data);
WriteWord((Press_Standard+i*8),char_data[0]); //线性校正点的用户输入点的压力值
WriteWord((Press_Standard+i*8+1),char_data[1]); //线性校正点的用户输入点的压力值
WriteWord((Press_Standard+i*8+2),char_data[2]); //线性校正点的用户输入点的压力值
WriteWord((Press_Standard+i*8+3),char_data[3]); //线性校正点的用户输入点的压力值
Long_TO_Char(Measure_Press[i],char_data);
WriteWord((Press_Measure+i*8),char_data[0]); //线性校正点的用户输入点的压力测量AD值
WriteWord((Press_Measure+i*8+1),char_data[1]); //线性校正点的用户输入点的压力测量AD值
WriteWord((Press_Measure+i*8+2),char_data[2]); //线性校正点的用户输入点的压力测量AD值
WriteWord((Press_Measure+i*8+3),char_data[3]); //线性校正点的用户输入点的压力测量AD值
}
En_key_INT();
Exit_Modify:
WDTCTL =WDT_ADLY_250; //WDT_ADLY_250;
IE1 |= WDTIE; // Enable WDT interrupt
Task_Mode=0;
//========================================================================================
//校正结束进入压力采样模式
//========================================================================================
break;
case 2://温度测量任务
break;
case 3://显示任务,压力显示任务,密码显示任务,键盘输入的压力值显示任务,AD值显示任务
break;
case 4://键盘任务:密码输入任务,压力值输入任务,背光任务,关电源任务
break;
case 5://CPU休眠任务
break;
default: break;
}
}
}
//========================================================================================
//函数:__interrupt void watchdog_timer (void)
//功能:检测AD采样是否完成
//变量:Byte
//返回:无
//========================================================================================
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
WDT_num++;
if(WDT_num>4)
{
if(EN_AD_Measure==1)
{
AD_Task_Complete=0;
P6OUT &= ~BIT5;
//Open_AD_Power();
Delay_1ms(10);
}
}
if(Back_Light_Task_Start)
{
Back_Light_Time_num++;
if(Back_Light_Time_num>20)
{
Back_Light_Time_num=0;
P2OUT |= BIT6;
Back_Light_Task_Start=0;
}
}
if(WDT_num>4)
{
if(EN_AD_Measure==1)
{
WDT_num=0;
ADS1240Init();
En_AD_DRDY_INT();
adc_init();
AD_Task_Start=1;
}
}
}
//========================================================================================
//函数:__interrupt void Port10_AD_DRDY(void)
//功能://ADC interrupt
//变量:无
//返回:无
//========================================================================================
#pragma vector=PORT1_VECTOR
__interrupt void Port10_AD_DRDY(void)
{
unsigned char i;
if(P1IFG&BIT0)//P1.0(DRDY)=0
{
ADS1240SendByte(ADS1240_CMD_RDATA);
//ad0.dat4[1]高字节,ad0.dat4[2]中间字节,ad0.dat4[3]低字节
for(i=0;i<3;i++)
Sampling_AD.Data_8Bit[i]=ADS1240ReceiveByte();
ad1240=0;
ad1240= ad1240+(unsigned long)Sampling_AD.Data_8Bit[0]<<8;
ad1240= ad1240+(unsigned long)Sampling_AD.Data_8Bit[1]<<8;
ad1240= ad1240+(unsigned long)Sampling_AD.Data_8Bit[2];
if(ad1240 & 0x800000)
ad1240 |= 0xff000000;
Sampling_AD.Sampling_AD_Num[AD_Sampling_Num]=ad1240;
if(AD_Sampling_Num>(1))
{
AD_Task_Complete=1;
AD_Task_Start=0;
AD_Sampling_Num=0;
Dis_AD_DRDY_INT(); //关中断
Close_AD_Power();//关AD电源
_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)
_NOP();
}
else
{AD_Sampling_Num++; }
}
P1IFG&=~BIT0;//clear IFG
}
//========================================================================================
//函数:__interrupt void Port2(void)
//功能://ADC interrupt
//变量:无
//返回:无
//========================================================================================
#pragma vector=PORT2_VECTOR
__interrupt void Port2(void)
{
unsigned char port2;
port2=P2IFG;
if(port2&(BIT0+BIT1+BIT2+BIT5))//P1.5P1.6P1.7(key)=1
{
key_data=0x00;
key_data= port2;
key_data&=0x27;
if(key_data!=0x00)
{
KeyDown_flag=1;
/* if(key_data==0x01)
{
key_data=0;
P2OUT &= ~BIT6;// 背光打开
Back_Light_Task_Start=1;
Back_Light_Time_num=0;
KeyDown_flag=0;
}
else*/
_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)
}
}
P2IFG&=~(BIT0+BIT1+BIT2+BIT5);//clear IFG
}
//========================================================================================
//函数:void Password_check(void)
//功能:读取AD1240积存器
//变量:Byte
//返回:无
//========================================================================================
void Password_check(void)
{
unsigned char flag,i;
////校正密码验证
Exit_Modify_flag=0;
Password_ok_flag=0;
while(!Password_ok_flag)
{
switch(key_data)
{
case 0x01:
{
LCD_Cursor_Addr++;
if(LCD_Cursor_Addr>=LCD_NUM) LCD_Cursor_Addr=0;
key_data=0;
}
break;
case 0x04:
{
LCD_Key_bar[LCD_Cursor_Addr]++;
if(LCD_Key_bar[LCD_Cursor_Addr]>=10) LCD_Key_bar[LCD_Cursor_Addr]=0;
key_data=0;
}
break;
case 0x02:
{
flag=0;
for(i=0;i<LCD_NUM;i++)
{
if(LCD_Key_bar[i]!=password[i])//password_ok_flag
{ flag=1;break;}
}
if(flag==1)
Password_ok_flag=0;
else
Password_ok_flag=1;
key_data=0;
}
break;
case 0x20://退出校验模式
{
Exit_Modify_flag=1;
key_data=0;
flag=0;
Password_ok_flag=1;
}
break;
}
Password_LCD_Display(LCD_Cursor_Addr,LCD_Key_bar);
}
}
//========================================================================================
//函数:void Zero_input(void)
//功能:用户零点输入
//变量:Byte
//返回:无
//========================================================================================
float User_input(float input_data)
{
unsigned char flag,unit;
float data;
long int data1;
unsigned long int data2;
flag=0;
unit=0;
if(input_data<0)LCD_Key_bar[0]='-';
else LCD_Key_bar[0]='+';
data1=(long int)(input_data*10);
if(input_data<0)data2=(~data1)+1;
else data2=(unsigned long int)data1;
LCD_Key_bar[1]=(unsigned char)(data2/10000);
data2-=LCD_Key_bar[1]*10000;
LCD_Key_bar[2]=(unsigned char)(data2/1000);
data2-=LCD_Key_bar[2]*1000;
LCD_Key_bar[3]=(unsigned char)(data2/100);
data2-=LCD_Key_bar[3]*100;
LCD_Key_bar[4]=(unsigned char)(data2/10);
data2-=LCD_Key_bar[4]*10;
LCD_Key_bar[5]=(unsigned char)(data2);
DisplayUnit(0);
while(!flag)
{
{
switch(key_data)
{
case 0x01:
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -