📄 main.c
字号:
#include <reg51.h>
unsigned int Timer0_Pause, Timer1_Pause;
unsigned char test (unsigned char Pos);
void ExternalINT0_ISR (void) interrupt 0
{
ET0 = 1; ET1 = 1;
TR0 = 1; TR1 = 1;
P1 = P1 & 0x7F; // P1.7(INTOUT) = 0;
P1 = P1 & 0xF7; // P1.4(SW2) = 0; INT;ON, A/Z is connected in C0MMON.
EX0 = 0;
}
void Timer0_ISR (void) interrupt 1
{
P1 = P1 | 0x80; // P1.7(INT) = 1;
TR0 = 0; ET0 = 0;
Timer0_Pause = 1;
}
void Timer1_ISR (void) interrupt 3
{
TR1 = 0; ET1 = 0;
Timer1_Pause = 1;
}
void main (void)
{
unsigned int Timer0_Counts, Timer1_Counts, mCheckVal, i;
int retVal, sumVal, Index;
long ai;
unsigned char mRepeatNum, bTestCh;
EA = 1; // Global Interrupt Enable
TCON = 0x00;
mRepeatNum = 30; // Repeat Check
mCheckVal = 2000; // 0 Check
Index = 0;
bTestCh = 0;
DIGITAL_CHECK_PART:
Timer0_Pause = 0;
Timer1_Pause = 0;
Timer0_Counts = 65535 - mCheckVal + 2 ;
TH0 = (unsigned char)(Timer0_Counts >> 8); // Set timer0 couunt value to TH0 and TL0...
TL0 = (unsigned char)Timer0_Counts;
TMOD = (TMOD & 0xF0) | 0x05; // Set Mode1 : Set Timer0 for 16bit Counter.
Timer1_Counts = 57535; // 65535 - 8001 + 1;
TH1 = (unsigned char)(Timer1_Counts >> 8); // Set timer1 couunt value to TH1 and TL1...
TL1 = (unsigned char)Timer1_Counts;
TMOD = (TMOD & 0x0F) | 0x50; // Set Mode1 : Set Timer1 for 16bit Counter.
ai = 0;
EX0 = 1; //External interrupt enabble
while(1)
{
if(Timer0_Pause)
{
ai = 0;
if(bTestCh == 0)
{ //*******************************
for(i=0; i<20000; i++); // about 20ms Delay
retVal = test(1); if(retVal != 20) sumVal = retVal;
P0 = P0 & 0x7F;//Buffer 2 select
retVal = test(2); if(retVal != 20) sumVal += retVal*10;
P0 = P0 | 0x80;//Buffer 2 unselect
retVal = test(3); if(retVal != 20) sumVal += retVal*100;
P2 = P2 & 0x7F; //Buffer 4 select
retVal = test(4); if(retVal != 20) sumVal += retVal*1000;
P2 = P2 | 0x80; //Buffer 4 unselect
if( sumVal == (mCheckVal - 2000 ) )
{
mRepeatNum = 3;
if( ++Index < 4 )
{
mCheckVal = (1111 * Index) + 2000;
}
else
{
if( Index < 10 )
{
mCheckVal = (111 * Index) + 2000;
}
else
{
TR1 = 0; ET1 = 0;
goto ANALOG_CHECK_PART;
}
}
}
else
{
if(--mRepeatNum != 0 )
{
TR1 = 0; ET1 = 0;
goto DIGITAL_CHECK_PART;
}
else P1 = P1 & 0xBF; // Red On
}
}
//*******************************
while( Timer1_Pause == 0 );
Timer0_Counts = 65535 - mCheckVal + 2;
TH0 = (unsigned char)(Timer0_Counts >> 8); // Set timer0 couunt value to TH0 and TL0...
TL0 = (unsigned char)Timer0_Counts;
TMOD = (TMOD & 0xF0) | 0x05; // Set Mode1 : Set Timer0 for 16bit Counter.
Timer1_Counts = 57535; // 65535 - 8001 + 1;
TH1 = (unsigned char)(Timer1_Counts >> 8); // Set timer1 couunt value to TH1 and TL1...
TL1 = (unsigned char)Timer1_Counts;
TMOD = (TMOD & 0x0F) | 0x50; // Set Mode1 : Set Timer1 for 16bit Counter.
P1 = P1 & 0x7F; // P1.7(INTO) = 0;
ET0 = 1; ET1 = 1;
TR0 = 1; TR1 = 1;
Timer0_Pause = 0;
Timer1_Pause = 0;
}
if(++ai > 60000 ) goto Bad_Chip; // Red On . Contact Test
}
ANALOG_CHECK_PART:
P1 = P1 & 0xEF; // P1.4(SW1 Switch) = 0; Buff:Open , INTO:Open
P1 = P1 | 0x08; // P1.3(SW2 Switch) = 1; INTO:Open , INL=COMMON
ai = 1;
while(1)
{
mRepeatNum = 50;
switch(ai)
{
case 1: P1 = P1 & 0xF9; break; // P1.1(A) = 0, P1.2(B) = 0 : VIN=Vcom;+/-0000
case 2: P1 = P1 | 0x02;P1 = P1 & 0xFB; break; // P1.1(A) = 1, P1.2(B) = 0 : VIN=VREF=200mV;2000
case 3: P1 = P1 | 0x06; // P1.1(A) = 1, P1.2(B) = 1 : VIN=GND;-4 overrange
}
for(i=0; i<60000; i++); // about 50ms Delay
Repeat_Check:
Index = 0;
for(i=0; i<30000; i++); // about 20ms Delay
retVal = test(1); if(retVal != 20) sumVal = retVal;
else Index++;
P0 = P0 & 0x7F;//Buffer 2 select
retVal = test(2); if(retVal != 20) sumVal += retVal*10;
else Index++;
P0 = P0 | 0x80;//Buffer 2 unselect
retVal = test(3); if(retVal != 20) sumVal += retVal*100;
else Index++;
P2 = P2 & 0x7F; //Buffer 4 select
retVal = test(4); if(retVal != 20) sumVal += retVal*1000;
P2 = P2 | 0x80; //Buffer 4 unselect
switch(ai)
{
case 1: if(((sumVal + 2) < 2) || (sumVal > 3))
{
if(--mRepeatNum > 0) goto Repeat_Check;
else goto Bad_Chip;
}
break;
case 2: if((sumVal < (2000 - 30)) || (sumVal > (2000 - 10)))
{
if(--mRepeatNum > 0) goto Repeat_Check;
else goto Bad_Chip;
}
break;
case 3:P2 = P2 & 0x7F; //Buffer 4 select
if(!(P2 & 0x09)) //-4 overrange test
{
if(--mRepeatNum > 0) goto Repeat_Check;
else goto Bad_Chip;
}
P2 = P2 | 0x80; //Buffer 4 unselect
}
if( ++ai > 3 ) break;
}
if(!(P1 & 0x01)) //V- check
{
goto Bad_Chip;
}
// Good_Chip:
P1 = P1 & 0xCF; // Green On
// End -3888 display
P1 = P1 | 0x18; // P1.4(SW1 Switch) = 1; Buff:Open , INTO:Open
// P1.3(SW2 Switch) = 1; INTO:Open , INL=COMMON
bTestCh = 1;
mCheckVal = 5888;
goto DIGITAL_CHECK_PART;
Bad_Chip:
P1 = P1 & 0xBF; // Red On
while(1){}
}
unsigned char test(unsigned char Pos)
{
unsigned char mch, mVal;
if( Pos < 4 )
{
switch(Pos)
{
case 1: mch = P0 & 0x7F; break;
case 2: mch = P0 & 0x7F; break;
case 3: mch = P2 & 0x7F;
}
switch( mch )
{
case 0x40: mVal = 0; break;
case 0x79: mVal = 1; break;
case 0x24: mVal = 2; break;
case 0x30: mVal = 3; break;
case 0x19: mVal = 4; break;
case 0x12: mVal = 5; break;
case 0x02: mVal = 6; break;
case 0x78: mVal = 7; break;
case 0x00: mVal = 8; break;
case 0x10: mVal = 9; break;
default: mVal = 20; //error
}
}
if( Pos == 4 )
{
mch = P2 & 0x3F;
switch( mch )
{
case 0x3F: mVal = 0; break;
case 0x39: mVal = 1; break;
case 0x14: mVal = 2; break;
case 0x18: mVal = 3; break;
default: mVal = 20; //error
}
}
return (mVal);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -