📄 borad.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 + -