⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 borad.c

📁 自动检测电容值
💻 C
字号:
#include <reg52.h>
#include <setjmp.h>
#include <serial.h>
#include <intrins.h>
#include <stdio.h> 
#define CYCLE (-10000)

//InterrupT
#define INT0INT 0
#define TIMER0INT 1
#define INT1INT 2
#define TIMER1INT 3
#define COMINT 4
#define TIMER2INT 5

sbit SW952D=P0^0;
sbit SW951D=P0^1;
sbit LED951D=P0^2;
sbit LED952D=P0^3;
sbit LED953D=P0^4;
sbit LED954D=P0^5;
sbit LED955D=P0^6;
sbit LED956D=P0^7;

sbit SW952T=P1^0;  	//hi
sbit SW951T=P1^1;	//hi
sbit LED951T=P1^2;	//lo
sbit LED952T=P1^3;	//lo
sbit LED953T=P1^4;	//lo
sbit LED954T=P1^5;	//lo
sbit LED955T=P1^6;	//lo
sbit LED956T=P1^7;	//lo

sbit OkLed=P2^4;
sbit NgLed=P2^5;
sbit Bell=P3^7;

bit Start=0,Next=0,Stop=0;
char CurrentX=0,CurrentY=0;
char INPORT;
int td;
code char TestBit[]={0,2,1,4,8,16,32,64,128};
//code char Name[8][]={"S1";"S2";"L1";"L2";"L3";"L4";"L5";"L6"};
unsigned char code Name[][6]={"     ","SW951","SW952","LD951","LD952","LD953","LD954","LD955","LD956"};
jmp_buf env;

void Initial(void);
void delay10ms(int);
void LcdPrint(char *);
void LcdClear(void);
bit keyWait(bit);
bit StartCheck(void);
void main(void)
{
	char ErrNo=0;
	char Pin[9];
	auto unsigned char ii,jj,d,dm,db;
	bit StartShow=1;
	bit ok;
//	bit Round;
	EA=0;
	P0=0;
	OkLed=0;
	NgLed=0;
	Bell=0;
	SP=0x5f;
	init_lcd ();
	/*------------------主程序--------------------*/
/*	while (1)
	{
		lat_disp (0x00,0x00);
		chn_disp (tab1);
		con_disp (0xff,0xff,0x8c,0x80,2,16);
		delay1 (2000);
		clrram();
		lat_disp (0xcc,0xcc);
		delay1 (2000);
		lat_disp (0x00,0x00);
		chn_disp1 (tab31);
		img_disp1 (tab32);
		delay1 (2000);
		clrram();
		lat_disp (0xff,0x00);
		delay1 (2000);
		img_disp (tab5);
		delay1 (2000);
	}*/
//	LcdPrint(tab1[0]);
//	while(1)
	Initial();
	P0=0;
	P2=0xe0;
	LcdClear();
//	LcdPrint("\n");
	LcdPrint("R1=10.2M\n");
	LcdPrint("R3=10.2M\n");
	LcdPrint("R2=10.2M\n");
	LcdPrint("R4=10.2M\n");
	LcdPrint("C1=1000P\n");
	LcdPrint("C2=1003P\n");
	printf("R1=10.2M\n");
	printf("R2=10.2M\n");
	printf("R3=10.2M\n");
	printf("R4=10.2M\n");
	printf("C1=1000P\n");
	printf("C2=1003P\n");
//	LcdPrint("  按〈测试〉键\n");
//	LcdPrint("开始测试\n");
//	while(1);
	while(1);
	while(1)
	{
		if(StartCheck()) Start=1;
		if(setjmp(env)) Start=1;
		if(Start)
		{
			OkLed=NgLed=Bell=1;
			Start=0;
//			LcdPrint("\n");
//			LcdPrint("\n");
			LcdClear();
			LcdPrint("测试中.");
			P0=0;
			delay10ms(500);
			if(Pin[0]=P1^0xfc) ok=0;else ok=1;
			for(ii=8;ii>=1;ii--)
			{
				LcdPrint(".");
				d=TestBit[ii];
				P0=d;
				delay10ms(ii>=3?80:120);
				if((Pin[ii]=P1^0xfc)!=d) ok=0;
				delay10ms(ii>=3?20:30);
				P0=0;
			}
//			P0=0;
			//Error analyse

//			Pin[0]=0xff;
//			Pin[2]=0xbc;
//			ok=1;
			LcdClear();
			if(ok)
		 	{
				OkLed=0;
				NgLed=1;
				LcdPrint("**测试通过**\n");
				LcdPrint("\n");
				Bell=0;delay10ms(300);
				Bell=1;
			}
			else
			{
				OkLed=1;
				NgLed=0;
				Bell=0;delay10ms(60);
				Bell=1;delay10ms(100);
				Bell=0;delay10ms(60);
				Bell=1;
		   	}
			do
			{
				if(!ok)
				{
					for(ii=1;ii<=8;ii++)
					{
						db=TestBit[ii];
						if(Pin[0]&db) {LcdPrint(Name[ii]);LcdPrint(" ");LcdPrint("与电源短路\n");}
						if((dm=Pin[ii])!=db)
						{
							if(dm)
							{
								for(jj=ii+1;jj<=8;jj++)
								{
									d=TestBit[jj];
									if(dm&d)
									{
										
										LcdPrint(Name[ii]);
										LcdPrint("/");
										LcdPrint(Name[jj]);
										LcdPrint(" ");
											LcdPrint(dm&db?"短路\n":"误配\n");
									}
								}
							}
							else
							{
								LcdPrint(Name[ii]);
								LcdPrint(" ");
								LcdPrint("失效\n");
							}
						}
					}
				}
				if(!ok)
				{
					while(keyWait(1));
					Next=0;Stop=0;
					LcdClear();
					LcdPrint("  按〈下一页〉键\n查看第一页错误\n");
				}
				LcdPrint("  按〈测试〉键\n");
				LcdPrint("测试下一个样品\n");
				if(ok) while(keyWait(0));
/*				else
				{
					keyWait(1);
				}*/
			}while(1);
		}
	}
	return;
}
void Initial(void)
{
	P0=0;
	P1=P2=P3=0xff;
	INPORT=0XFF;
	TMOD=0X11;
	TR0=1;
	EX0=0;
	ET0=1;
	EA=1;
	TL0=CYCLE % 256;
	TH0=CYCLE/256;
}
void PowerOff (void) interrupt INT0INT
{
	return;
}
void Time10ms (void) interrupt TIMER0INT
{
//	#define FLASHTIME 60
//	static unsigned char ft=FLASHTIME;
	static char InP1=0,InP2=0;
	char InP,InP3;
	TL0=CYCLE % 256;
	TH0=CYCLE/256;

	InP=INPORT^P2;
	InP3=InP&InP2;			//count 3
	InP2=InP&InP1&(~InP3);
	InP1=InP&(~InP3);
	InP^=INPORT;			//InP=PP1
	InP&=InP3;
	INPORT&=~InP3;
	INPORT|=InP;

	Next=Stop=!(INPORT&0x40);
	Start=!(INPORT&0x80);	
	if(td) td--;	
	return;
}
void LcdClear(void)
{
	init_lcd();
	CurrentX=CurrentY=0;
}
void LcdPrint(char * DisBuf)
{
	code unsigned char Line[]={0x80,0x90,0x88,0x98}; 
	char kk=0;
	wr_lcd(comm,0x30);
	while(DisBuf[kk])
	{
		if(DisBuf[kk]=='\n'||CurrentX>=16)
		{
			CurrentX=0;
			CurrentY++;
			if(CurrentY<4) wr_lcd(comm,Line[CurrentY]);
		}
		else
		{
			if(CurrentY>=4)
			{
				if(!NgLed)
				{
					while(keyWait(1));
//					Next=0;Stop=0;
					LcdClear();
				}
			}
			wr_lcd(dat,DisBuf[kk]);
			CurrentX++;
		}
	 	kk++;
	}
	return;
}
bit StartCheck(void)
{
	static unsigned char cn=0;
	bit NowInst=0;
	static bit CurInst=0;
	char pt;
	P0=0xfc;
	delay10ms(10);
	if((pt=P1&0xfc)^0xfc)
	{
		P0=0;
		delay10ms(10);
		if(pt!=(P1&0xfc)) NowInst=1;
	}
	else
	{
		P0=0;
		delay10ms(10);
	}
	if(NowInst!=CurInst)
	{
		cn++;
		if(cn>=30)
		{
			CurInst=NowInst;
			cn=0;
//			if(CurInst) return(1);
		}
	}
	else
	{
		cn=0;
	}
//	return(0);
	if(CurInst)
	{
//		CurInst=0;
		return(1);
	}
	else
	{
		return(0);
	}
}
bit keyWait(bit chk)
{
	static bit NextUp=0,StartUp=0,CheckUp=0;
	if(chk)
	{
		if(Next)
		{
			if(NextUp)
			{
				NextUp=0;
				return(0);   //Next OK
			}
		}
		else
		{
			NextUp=1;
		}
	}
	if(Start)
	{
		if(StartUp)
		{
			StartUp=0;
			longjmp(env,2);   //Start OK
		}
	}
	else
	{
		StartUp=1;
	}
	if(StartCheck())
	{
		if(CheckUp)
		{
			CheckUp=0;
			longjmp(env,2);   //Start OK
		}
	}
	else
	{
		CheckUp=1;
	}
	return(1);
}
void delay10ms(int a)
{
	td=a/10;
	while(td);
}


/*------------------初始化-----------------*/
void init_lcd (void)
{
  rst=1;
 // psb=0;
  wr_lcd (comm,0x30);  /*30---基本指令动作*/   
  wr_lcd (comm,0x01);  /*清屏,地址指针指向00H*/
  delay (100);
  wr_lcd (comm,0x06);  /*光标的移动方向*/
  wr_lcd (comm,0x0c);  /*开显示,关游标*/
}
/*---------------显示汉字或字符----------------*/
/*void chn_disp (uchar code *chn)
{
  uchar i,j;
  wr_lcd (comm,0x30);
  wr_lcd (comm,0x80);
  for (j=0;j<4;j++)
  {
    for (i=0;i<16;i++)
    wr_lcd (dat,chn[j*16+i]);
  }
}*/
/*------------上半屏显示汉字或字符-----------*/
/*void chn_disp1 (uchar code *chn)
{
  uchar i,j;
  wr_lcd (comm,0x30);       //基本指令集动作	,绘图显示OFF
  wr_lcd (comm,0x80);		//设定GDRAM地址到地址记数器AC
  j=0;
  for (i=0;i<16;i++)
  wr_lcd (dat,chn[j*16+i]);
  wr_lcd (comm,0x90);
  j=1;
  for (i=0;i<16;i++)
  wr_lcd (dat,chn[j*16+i]);
}*/
/*----------------显示图形-----------------*/
/*void img_disp (uchar code *img)
{
  uchar i,j;
  for(j=0;j<32;j++)
  {
    for(i=0;i<8;i++)
    {
      wr_lcd (comm,0x34);	   //8位控制器接口,扩充功能设定,扩充指令集动作,绘图显示OFF
      wr_lcd (comm,y+j);
      wr_lcd (comm,x1+i);
      wr_lcd (comm,0x30);
      wr_lcd (dat,img[j*16+i*2]);
      wr_lcd (dat,img[j*16+i*2+1]);
    }
  }
  for(j=32;j<64;j++)
  {
    for(i=0;i<8;i++)
    {
      wr_lcd (comm,0x34);
      wr_lcd (comm,y+j-32);
      wr_lcd (comm,x2+i);
      wr_lcd (comm,0x30);
      wr_lcd (dat,img[j*16+i*2]);
      wr_lcd (dat,img[j*16+i*2+1]);
    }
  }
  wr_lcd (comm,0x36);
}*/
/*-------------下半屏显示图形--------------*/
/*void img_disp1 (uchar code *img)
{
  uchar i,j;
  for(j=0;j<32;j++)
  {
    for(i=0;i<8;i++)
    {
      wr_lcd (comm,0x34);
      wr_lcd (comm,y+j);
      wr_lcd (comm,x2+i);
      wr_lcd (comm,0x30);
      wr_lcd (dat,img[j*16+i*2]);
      wr_lcd (dat,img[j*16+i*2+1]);
    }
  }
  wr_lcd (comm,0x36);
}*/
/*--------------显示点阵----------------
显示点阵

-------------------------------------------*/ 
/*
void lat_disp (uchar data1,uchar data2)
{
  uchar i,j,k,x;
  x=x1;
  for(k=0;k<2;k++)
  {
    for(j=0;j<16;j++)
    {
      for(i=0;i<8;i++)
      {
        wr_lcd (comm,0x34);	  //8位控制器接口,扩充功能设定,扩充指令集动作,绘图显示OFF
        wr_lcd (comm,y+j*2);  //设定绘图地址
        wr_lcd (comm,x+i);
        wr_lcd (comm,0x30);	  //基本指令集动作	,绘图显示OFF
        wr_lcd (dat,data1);	  //写入数据
        wr_lcd (dat,data1);
      }
      for(i=0;i<8;i++)
      {
        wr_lcd (comm,0x34);
        wr_lcd (comm,y+j*2+1);
        wr_lcd (comm,x+i);
        wr_lcd (comm,0x30);
        wr_lcd (dat,data2);
        wr_lcd (dat,data2);
      }
    }
    x=x2;
  }
  wr_lcd (comm,0x36);	  //扩充指令集动作 ,绘图显示ON
}*/
/*-----------------------------------------------*/
//当data1=0xff,data2=0xff时,在x0,y0处反白显示16xl*yl.
/*void con_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)
{
  uchar i,j;
  for(j=0;j<yl;j++)
  {
    for(i=0;i<xl;i++)
    {
      wr_lcd (comm,0x34);   //8位控制器接口,扩充功能设定,扩充指令集动作,绘图显示OFF
      wr_lcd (comm,y0+j);
      wr_lcd (comm,x0+i);
      wr_lcd (comm,0x30);	//基本指令集动作	,绘图显示OFF
      wr_lcd (dat,data1);
      wr_lcd (dat,data2);
    }
  }
  wr_lcd (comm,0x36);
}*/
/*--------------清DDRAM------------------*/
/*void clrram (void)
{
  wr_lcd (comm,0x30);
  wr_lcd (comm,0x01);
  delay (180);
}*/
/*---------------------------------------------
发送数据或指令的函数
当dat_comm=1 发送的是数据, dat_comm=0则是命令.
待发送的数据或指令放在content中.
----------------------------------------------*/
void wr_lcd (uchar dat_comm,uchar content)
{
  uchar a,i,j;
  delay (50);
  a=content;
  cs=1;
  sclk=0;
  std=1;
  for(i=0;i<5;i++)		//先输入五个连续的1   -----》是同步位字符串,此时输入记数被重置并且串行传输被同步。
  {
    sclk=1;
    sclk=0;
  }
  std=0;				//RW位
  sclk=1;
  sclk=0;
  if(dat_comm)		   //RS位
    std=1;   //data
  else
    std=0;   //command
  sclk=1;
  sclk=0;			   //第8位规定为0
  std=0;
  sclk=1;
  sclk=0;
  for(j=0;j<2;j++)
  {
    for(i=0;i<4;i++)   //每一个8位指令将被分为两个字节接收到.
    {
      a=a<<1;
      std=CY;
      sclk=1;
      sclk=0;
    }
    std=0;
    for(i=0;i<4;i++)
    {
      sclk=1;
      sclk=0;
    }
  }
}
/*-----------------------------------*/
void delay (uint us)   //delay time
{
  while(us--);
}
/*void delay1 (uint ms)
{
  uint i,j;
  for(i=0;i<ms;i++)
  for(j=0;j<15;j++)
  delay(1);
}*/


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -