以下为元程序:(经过不同的中断口中的中断开启另一中断的准许与取反)
void keyboard()
{ P1DIR&=~(BIT6+BIT7+BIT5); //P1
P1IES|=BIT6+BIT7+BIT5;
P1IE|=BIT6+BIT7+BIT5;
P2DIR&=~BIT0; //P1
P2IES|=BIT0;
P2IE|=BIT0;
}
#pragma vector=PORT1_VECTOR
__interrupt void PORT1(void)
{
if((P1IN&BIT5)!=BIT5)
KEY++;//KEYd的起初值为0,加1,为1
if(KEY==1)
{
k_data0=-0.001448;//ph=7
b_data0=15.688;
}
if(KEY==2)
{
KEY=0;
mode=0;
k_data0=(float)5.170/((float)ad_data2-(float)ad_data1);
b_data0=4.010-(float)(k_data0*ad_data1);
canshuo[0]=(uchar)( -k_data0*1000000);//高8位,对8或16位的float型数据进行拆分,负号是对k_data进行转换成无符号 char型
canshuo[1]=(uint)(-k_data0*1000000)>>8;//低8位,
canshuo[2]=(uchar)( b_data0*1000);
canshuo[3]=(uint)(b_data0*1000)>>8;//乘以1000和1000000为获得整数
delay(10);
write_SegA0 (canshuo);
#pragma vector=PORT1_VECTOR
__interrupt void PORT1(void)
{
if((P1IN&BIT5)!=BIT5)
KEY++;//KEYd的起初值为0,加1,为1
if(KEY==1)
{ P2IE&=~BIT0;
k_data0=-0.001448;//ph=7
b_data0=15.688;
}
if(KEY==2)
{
KEY=0;
mode=0;
k_data0=(float)5.170/((float)ad_data2-(float)ad_data1);
b_data0=4.010-(float)(k_data0*ad_data1);
canshuo[0]=(uchar)( -k_data0*1000000);//高8位,对8或16位的float型数据进行拆分,负号是对k_data进行转换成无符号 char型
canshuo[1]=(uint)(-k_data0*1000000)>>8;//低8位,
canshuo[2]=(uchar)( b_data0*1000);
canshuo[3]=(uint)(b_data0*1000)>>8;//乘以1000和1000000为获得整数
delay(10);
write_SegA0 (canshuo);
while((P1IN&BIT5)!=BIT5);
}
if((P1IN&BIT6)!=BIT6)
{
if(KEY==1)
{
P2IE&=~BIT0;
if(mode>1)//防止mode的值变动,校验4.01的显示
mode=0;
mode++;
}
while((P1IN&BIT6)!=BIT6);
}
if((P1IN&BIT7)!=BIT7)
{
if(KEY==1)
{
if(mode<2)
mode=3;
mode--;//9.18的校验。编译器的效果
}
while((P1IN&BIT7)!=BIT7);
}
P1IFG=0X00;
}
#pragma vector=PORT2_VECTOR
__interrupt void PORT2(void)
{
if((P2IN&BIT0)!=BIT0)
{ if(wendu!=1)
wendu=1;
else wendu=0;
}
P2IFG=0X00;
}
while((P1IN&BIT5)!=BIT5);
}
if((P1IN&BIT6)!=BIT6)
{
if(KEY==1)
{
if(mode>1)//防止mode的值变动,校验4.01的显示
mode=0;
mode++;
}
while((P1IN&BIT6)!=BIT6);
}
if((P1IN&BIT7)!=BIT7)
{
if(KEY==1)
{
if(mode<2)
mode=3;
mode--;//9.18的校验。编译器的效果
}
while((P1IN&BIT7)!=BIT7);
}
P1IFG=0X00;
}
#pragma vector=PORT2_VECTOR
__interrupt void PORT2(void)
{
if((P2IN&BIT0)!=BIT0)
{ if(wendu!=1)
wendu=1;
else wendu=0;
}
P2IFG=0X00;
}
改为:
#pragma vector=PORT1_VECTOR
__interrupt void PORT1(void)
{
if((P1IN&BIT5)!=BIT5)
KEY++;//KEYd的起初值为0,加1,为1
if(KEY==1)
{ P2IE&=~BIT0;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
k_data0=-0.001448;//ph=7
b_data0=15.688;
}
if(KEY==2)
{
KEY=0;
mode=0;
k_data0=(float)5.170/((float)ad_data2-(float)ad_data1);
b_data0=4.010-(float)(k_data0*ad_data1);
canshuo[0]=(uchar)( -k_data0*1000000);//高8位,对8或16位的float型数据进行拆分,负号是对k_data进行转换成无符号 char型
canshuo[1]=(uint)(-k_data0*1000000)>>8;//低8位,
canshuo[2]=(uchar)( b_data0*1000);
canshuo[3]=(uint)(b_data0*1000)>>8;//乘以1000和1000000为获得整数
delay(10);
write_SegA0 (canshuo);
#pragma vector=PORT1_VECTOR
__interrupt void PORT1(void)
{
if((P1IN&BIT5)!=BIT5)
KEY++;//KEYd的起初值为0,加1,为1
if(KEY==1)
{ P2IE&=~BIT0;
k_data0=-0.001448;//ph=7
b_data0=15.688;
}
if(KEY==2)
{
KEY=0;
mode=0;
k_data0=(float)5.170/((float)ad_data2-(float)ad_data1);
b_data0=4.010-(float)(k_data0*ad_data1);
canshuo[0]=(uchar)( -k_data0*1000000);//高8位,对8或16位的float型数据进行拆分,负号是对k_data进行转换成无符号 char型
canshuo[1]=(uint)(-k_data0*1000000)>>8;//低8位,
canshuo[2]=(uchar)( b_data0*1000);
canshuo[3]=(uint)(b_data0*1000)>>8;//乘以1000和1000000为获得整数
delay(10);
write_SegA0 (canshuo);
P2IE|=BIT0;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
while((P1IN&BIT5)!=BIT5);
}
if((P1IN&BIT6)!=BIT6)
{
if(KEY==1)
{
P2IE&=~BIT0;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if(mode>1)//防止mode的值变动,校验4.01的显示
mode=0;
mode++;
}
while((P1IN&BIT6)!=BIT6);
}
if((P1IN&BIT7)!=BIT7)
{
if(KEY==1)
{
if(mode<2)
mode=3;
mode--;//9.18的校验。编译器的效果
}
while((P1IN&BIT7)!=BIT7);
}
P1IFG=0X00;
}
#pragma vector=PORT2_VECTOR
__interrupt void PORT2(void)
{
if((P2IN&BIT0)!=BIT0)
{ if(wendu!=1)
{ P1IE&=~(BIT6+BIT7+BIT5);!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
wendu=1;
}
else
{ wendu=0;
P1IE|=BIT6+BIT7+BIT5;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}
}
P2IFG=0X00;
}