?? c_demo.c
字號:
{
X[i] = p->Kr1*Ir + p->Kr2*Ig + p->Kr3*Ib;
Y[i] = p->Kg1*Ir + p->Kg2*Ig + p->Kg3*Ib;
Z[i] = p->Kb1*Ir + p->Kb2*Ig + p->Kb3*Ib; /*計算三刺激值*/
}
void color(float Ir, float Ig, float Ib, uchar i)
{
float point_x, point_y;
uchar area = 0;
mulmatrix(Ir, Ig, Ib, i, K); /* 區域1 */
point_x = X[i]/(X[i]+Y[i]+Z[i]);
point_y = Y[i]/(X[i]+Y[i]+Z[i]);
if (((point_y >= 1.3169*point_x - 0.1056) && (point_x <= 0.3333))
||((point_y >= 1.9982*point_x - 0.3327) && (point_x > 0.3333)))
{
area |= 0x01;
}
mulmatrix(Ir, Ig, Ib, i, K+1); /* 區域2 */
point_x = X[i]/(X[i]+Y[i]+Z[i]);
point_y = Y[i]/(X[i]+Y[i]+Z[i]);
if ((point_y >= -0.1667*point_x + 0.3889) && (point_y <= 1.9982*point_x -0.3327))
{
area |= 0x02;
}
mulmatrix(Ir, Ig, Ib, i, K+2); /* 區域3 */
point_x = X[i]/(X[i]+Y[i]+Z[i]);
point_y = Y[i]/(X[i]+Y[i]+Z[i]);
if (((point_y <= 1.3169*point_x - 0.1056) && (point_x <= 0.3333))
||((point_y <= -0.1667*point_x + 0.3889) && (point_x > 0.3333)))
{
area |= 0x04;
}
switch (area)
{
case 1: mulmatrix(Ir, Ig, Ib, i, K);
point_x = X[i]/(X[i]+Y[i]+Z[i]);
point_y = Y[i]/(X[i]+Y[i]+Z[i]);
break;
case 2: mulmatrix(Ir, Ig, Ib, i, K+1);
point_x = X[i]/(X[i]+Y[i]+Z[i]);
point_y = Y[i]/(X[i]+Y[i]+Z[i]);
break;
case 4: mulmatrix(Ir, Ig, Ib, i, K+2);
point_x = X[i]/(X[i]+Y[i]+Z[i]);
point_y = Y[i]/(X[i]+Y[i]+Z[i]);
break;
default:
area = 0;
break;
}
if (area != 0)
{
if (((point_x-0.333)*(point_x-0.333) /* 區域7 */
+(point_y-0.333)*(point_y-0.333)) < 0.02 )
{
mulmatrix(Ir, Ig, Ib, i, K+6);
}
return;
}
mulmatrix(Ir, Ig, Ib, i, K+3); /* 區域4 */
point_x = X[i]/(X[i]+Y[i]+Z[i]);
point_y = Y[i]/(X[i]+Y[i]+Z[i]);
if (((point_y >= -1.3053*point_x - 0.7683) && (point_x <= 0.3333))
||((point_y >= -0.1667*point_x + 0.3889) && (point_x > 0.3333)))
{
area |= 0x08;
}
mulmatrix(Ir, Ig, Ib, i, K+4); /* 區域5 */
point_x = X[i]/(X[i]+Y[i]+Z[i]);
point_y = Y[i]/(X[i]+Y[i]+Z[i]);
if (((point_y <= -1.3053*point_x - 0.7683) && (point_x <= 0.3333))
||((point_y <= -0.1667*point_x + 0.3889) && (point_x > 0.3333)))
{
area |= 0x10;
}
switch (area)
{
case 8: mulmatrix(Ir, Ig, Ib, i, K+3);
point_x = X[i]/(X[i]+Y[i]+Z[i]);
point_y = Y[i]/(X[i]+Y[i]+Z[i]);
break;
case 16:mulmatrix(Ir, Ig, Ib, i, K+4);
point_x = X[i]/(X[i]+Y[i]+Z[i]);
point_y = Y[i]/(X[i]+Y[i]+Z[i]);
break;;
default:
area = 0;
break;
}
if (area != 0)
{
if (((point_x-0.333)*(point_x-0.333) /* 區域7 */
+(point_y-0.333)*(point_y-0.333)) < 0.02 )
{
mulmatrix(Ir, Ig, Ib, i, K+6);
}
return;
}
mulmatrix(Ir, Ig, Ib, i, K+5); /* 區域6 */
point_x = X[i]/(X[i]+Y[i]+Z[i]);
point_y = Y[i]/(X[i]+Y[i]+Z[i]);
if (((point_x-0.333)*(point_x-0.333) /* 區域7 */
+(point_y-0.333)*(point_y-0.333)) < 0.02 )
{
mulmatrix(Ir, Ig, Ib, i, K+6);
}
return;
}
/***************************************************************************
* 函數原型:uint adconvert(void);
* 函數功能:本函數返回TLC1549的轉換結果。
***************************************************************************/
uint adconvert(void)
{
uchar i;
uint adresult;
ADCS = 1;
ADCLK = 0;
ADCS = 0;
_nop_();
adresult = (uint)ADOUT;
for (i=0; i<9; i++)
{
ADCLK = 1;
adresult = _irol_(adresult, 1);
ADCLK = 0;
_nop_();
adresult += (uint)ADOUT;
} /*10位數據串行寫入adresult*/
ADCLK = 1;
_nop_();
ADCLK = 0;
_nop_();
ADCS = 1;
wait();
return adresult;
}
/***************************************************************************
* 函數原型:uint measure(uchar led);
* 函數功能:本函數計算R或G或B發光二極管的光強相對值。
***************************************************************************/
uint measure(uchar led)
{
uint count;
uchar i,j;
dis816(guage, (led-1)*4+2, 4);
switch(led) /*選擇相應顏色的LED*/
{
case 1:
for (i=0; i<100; i++)
{
for (j=0; j<50; j++)
{
LIGHT_R = 1;
wait();wait();wait();wait();wait();
LIGHT_R = 0;
wait();wait();wait();wait();wait();wait();wait();
}
if (i == 40)
{
dis816(guage, (led-1)*4+3, 4);
}
if (i == 75)
{
dis816(guage, (led-1)*4+4, 4);
}
}
LIGHT_R = 1; /*點亮紅燈*/
break;
case 2:
for (i=0; i<100; i++)
{
for (j=0; j<50; j++)
{
LIGHT_G = 1;
wait();wait();wait();wait();wait();wait();
LIGHT_G = 0;
wait();wait();wait();wait();wait();wait();wait();
}
if (i == 40)
{
dis816(guage, (led-1)*4+3, 4);
}
if (i == 75)
{
dis816(guage, (led-1)*4+4, 4);
}
}
LIGHT_G = 1; /*點亮綠燈*/
break;
case 3:
for(i=0; i<100; i++)
{
for(j=0; j<50; j++)
{
LIGHT_B = 1;
wait();wait();wait();wait();wait();
LIGHT_B = 0;
wait();wait();wait();wait();wait();wait();wait();
}
if (i == 40)
{
dis816(guage, (led-1)*4+3, 4);
}
if (i == 75)
{
dis816(guage, (led-1)*4+4, 4);
}
}
LIGHT_B = 1; /*點亮藍燈*/
break;
default:
LIGHT_R = 0;
LIGHT_G = 0;
LIGHT_B = 0;
break;
}
dis816(guage, (led-1)*4+5, 4);
delay(10);
count = 0;
for (i=0; i<50; i++)
{
count += adconvert();
wait();
}
delay(2);
LIGHT_R = 0;
LIGHT_G = 0;
LIGHT_B = 0;
return count;
}
/***************************************************************************
* 函數原型:float Eab(void);
* 函數功能:本函數用于計算Lab色差。
***************************************************************************/
float Eab(void)
{
float E;
float L[2];
float a[2];
float b[2];
uchar i;
for(i=0;i<2;i++)
{
if(Y[i] > 0.8856)
{
L[i] = 116*tqrt(Y[i]/100) - 16;
}
else
{
L[i] = 9.033*Y[i];
}
if(X[i] > 0.8856)
{
a[i] = 500*(tqrt(X[i]/100) - tqrt(Y[i]/100));
}
else
{
a[i] = 38.935*(X[i] - Y[i]);
}
if(Z[i] > 0.8856)
{
b[i] = 200*(tqrt(Y[i]/100) - tqrt(Z[i]/100));
}
else
{
b[i] = 15.574*(Y[i] - Z[i]);
}
}
E = sqrt((L[1]-L[0])*(L[1]-L[0]) + (a[1]-a[0])*(a[1]-a[0]) + (b[1]-b[0])*(b[1]-b[0]));
return(E);
}
/***************************************************************************
* 函數原型:float Euv();
* 函數功能:本函數用于計算Luv色差。
***************************************************************************/
float Euv(void)
{
float E;
float L[2];
float u[2];
float v[2];
uchar i;
for(i=0;i<2;i++)
{
if(Y[i] > 0.8856)
{
L[i] = 116*tqrt(Y[i]/100) - 16;
}
else
{
L[i] = 9.033*Y[i];
}
u[i] = 13*L[i]*(4*X[i]/(X[i]+15*Y[i]+3*Z[i]) - 0.2105);
v[i] = 13*L[i]*(9*Y[i]/(X[i]+15*Y[i]+3*Z[i]) - 0.4737);
}
E = sqrt((L[1]-L[0])*(L[1]-L[0]) + (u[1]-u[0])*(u[1]-u[0]) + (v[1]-v[0])*(v[1]-v[0]));
return(E);
}
/***************************************************************************
* 函數原型:float tqrt(float x);
* 函數功能:本函數用于計算x開三次方。
***************************************************************************/
float tqrt(float x)
{
x = log(x);
x = x/3;
x = exp(x);
return(x);
}
/***************************************************************************
* 函數原型:int wavelength(float x, float y);
* 函數功能:本函數返回待測溶液顏色的主波長。
***************************************************************************/
int wavelength(float x, float y)
{
long k; /* 色品點與E點構成直線的斜率 */
uchar n;
k = ((y-0.3333)/(x-0.3333))*10000; /* 擴大10000倍 */
if(((x-0.333)*(x-0.333)+(y-0.333)*(y-0.333))<0.002)
{
return(0);
}
if((x<=0.333)&&(k<=20621)&&(k>-10000))
{
n = wl_num(0, 25, k);
}
else if((x>0.333)&&(k<10000)&&(k>=-1649))
{
n = wl_num(40, 64, k);
}
else
{
k = ((x-0.3333)/(y-0.3333))*10000;
if((y>=0.333)&&(k<10000)&&(k>=-10000))
{
n = wl_num(26, 39, k);
}
else
{
if (k <= -10000)
{
n = wl_num(23, 25, k);
}
else
{
k = ((y-0.3333)/(x-0.3333))*10000;
n = wl_num(26, 39, k);
}
return(-(380 + n*5));
}
}
return(380 + n*5);
}
/***************************************************************************
* 函數原型:uchar wl_num(uchar n1, uchar n2, long k);
* 函數功能:本函數返回待測溶液顏色的主波長的中間參數。
***************************************************************************/
uchar wl_num(uchar n1, uchar n2, long k)
{
if(n1 != 26)
{
do
{
if(k < slope[(n1+n2)/2])
{
n1 = (n1+n2)/2;
}
else
{
if((n1+n2)%2==0)
{
n2 = (n1+n2)/2;
}
else
{
n2 = (n1+n2+1)/2;
}
}
}while(((n2-n1)>1));
}
else
{
do
{
if(k > slope[(n1+n2)/2])
{
n1 = (n1+n2)/2;
}
else
{
if((n1+n2)%2==0)
{
n2 = (n1+n2)/2;
}
else
{
n2 = (n1+n2+1)/2;
}
}
}while(((n2-n1)>1));
}
return(n2);
}
/***** 主程序 *****/
void main(void)
{
uchar i = 0;
init();
while (1)
{
switch (getkey())
{
case Up:
if (i == 0)
{
i = 2;
}
else if (i == 1)
{
i = 0;
}
else if (i == 2)
{
i = 1;
}
dis_arrow(i);
break;
case Down:
if (i == 0)
{
i = 1;
}
else if (i == 1)
{
i = 2;
}
else if (i == 2)
{
i = 0;
}
dis_arrow(i);
break;
case Enter:
if (i == 0)
{
MeaC();
}
if (i == 1)
{
MeaE();
}
if (i == 2)
{
ChangeTime();
}
break;
case Esc:
i = 0;
dis_menu();
dis_arrow(0);
break;
default:
break;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -