📄 spotwelder.c
字号:
/*
李先的红姆点焊机
ailing于温州华侨机械--2005.10
*/
#include<intrins.h>
#include"keyscan.h"
#include"at24cxx.h"
#ifdef __C51__
#include<regx51.h>
#endif
#ifdef __C52__
#include<regs52.h>
#endif
#define nop() _nop_()
#define uchar unsigned char
#define uint unsigned int
#define Prrz 11
#define Weld 22
#define PrrzL 33
#define Space 44
#define check 55
#define Emergency 66
#define AUTO 1
#define MAN 0
//led driver bit
sbit bPrrz_led = P3^5;
sbit bWeld_led = P3^6;
sbit bFshCnt_led = P3^7;
sbit bPrrzL_led = P3^0;
sbit bSpace_led = P1^7;
sbit bSet_led = P3^1;
sbit bMode_led = P3^4;
//relay drive bit
sbit bPrrz_RlyDr = P2^6;
sbit bWeld_RlyDr = P2^5;
sbit bPrrzL_RlyDr= P2^4;
sbit bFshCnt_RlyDr= P2^2;
sbit bSpace_RlyDr= P2^3;
sbit bStartup =P3^2;
/*按键设置是为:百位+=100,十位+=10,个位+=1 */
unsigned int PrrzTime;
unsigned int WeldTime;
unsigned int WorkCount;
unsigned int PrrzLTime;
unsigned int SpaceTime;
unsigned char Work;
unsigned char Tent;
unsigned char data trnscv[11]={0,0,0,0,0,0,0,0,0,0};
unsigned char DisData[15];
unsigned char WorkMode;
bit bcheck;
void SendByte(unsigned char Data);
unsigned char RcvByte();
bit ISendByte(uchar SLA,uchar Data);
bit ISendStr(uchar sla,uchar Suba,uchar *s,uchar Num);
bit IRcvByte(uchar sla,uchar *rcv);
bit IRcvStr(uchar SLA,uchar Suba,uchar *rcv,uchar Num);
/****************************** keyscan() **********************************
放在 5ms 中断里运行
RUN=p3.2; shift=p3.4; FUNCtion=p3.5; add=p3.7 共 4 个独立式按键;
p3.3 为合盖的行程开关不能作为一个独立按键,否则合盖后p3.3==0将屏蔽掉所有的按键。
*****************************************************************************/
void keyscan(void)
{
uchar KCodeCrrt;
static uchar DBCount;
static uchar DownCT;
KCodeCrrt=0x7c&P1; // &01111100b
if(KCodeCrrt==0x7c)
{
if(DBCount==0)
{
if(KeyState==DOWN)
{
KeyState=BeFree;
bExecute=DONT;
DownCT=0; //按键持续按下的计时清零
}
}
else
DBCount--;
}
else
{
if(DBCount==1)
{
if(bExecute==DONT)
{
bExecute=DONE;
KeyCode=~(KCodeCrrt|0x83);
}
else if(DownCT>SetupOverCode)
{
DownCT=SetupOverCode;
if(KeyKind==Continued)
KeyCode=KCodeCrrt;
}
KeyState=DOWN;
DownCT++;
}
else if(DBCount<1) //消抖
DBCount++;
}
}
/******************************************************************************
键盘处理程序
******************************************************************************/
#define RUN 11
#define FUNC 22
#define runing 1
#define stop 0
unsigned int prrz_buf;
unsigned char Program;
unsigned char position;
bit flag_func; //作为进入功能设置的标志
bit flag_run; //作为向24C01 发送数据的标志
bit current_state;
void DispData_Dispose(void);
void Write_24Cxx(void);
/******************************/
uint DEC_DSP(uchar digital, uint minuend)
{
if(digital==100)
{
if(minuend<100)
minuend+=900;
else
minuend-=100;
}
else if(digital==10)
{
if((minuend%100)<10)
minuend+=90;
else
minuend-=10;
}
else if(digital==1)
{
if((minuend%10)<1)
minuend+=9;
else
minuend-=1;
}
return(minuend);
}
/******************************/
void Key_Server(void)
{
uchar i;
switch(KeyCode)
{
case 0x04: //work mode
DeleteKeyCode();
if(bcheck){bcheck=0;break;}
if(Program==FUNC)
{
if(WorkMode==MAN)
{
bMode_led=0;
WorkMode=AUTO;
}
else
{
bMode_led=1;
WorkMode=MAN;
}
do{i=ISendStr(AT24WC01,10,&WorkMode,1);
}while(!i);
}
break;
case 0x08: //dec
DeleteKeyCode();
if(bcheck){bcheck=0;break;}
if(Program==FUNC)
{
if(position==0)
PrrzTime=DEC_DSP(100,PrrzTime);
else if(position==1)
PrrzTime=DEC_DSP(10,PrrzTime);
else if(position==2)
PrrzTime=DEC_DSP(1,PrrzTime);
else if(position==3)
WeldTime=DEC_DSP(100,WeldTime);
else if(position==4)
WeldTime=DEC_DSP(10,WeldTime);
else if(position==5)
WeldTime=DEC_DSP(1,WeldTime);
else if(position==6)
WorkCount=DEC_DSP(100,WorkCount);
else if(position==7)
WorkCount=DEC_DSP(10,WorkCount);
else if(position==8)
WorkCount=DEC_DSP(1,WorkCount);
else if(position==9)
PrrzLTime=DEC_DSP(100,PrrzLTime);
else if(position==10)
PrrzLTime=DEC_DSP(10,PrrzLTime);
else if(position==11)
PrrzLTime=DEC_DSP(1,PrrzLTime);
else if(position==12)
SpaceTime=DEC_DSP(100,SpaceTime);
else if(position==13)
SpaceTime=DEC_DSP(10,SpaceTime);
else if(position==14)
SpaceTime=DEC_DSP(1,SpaceTime);
}
break;
case 0x10: //shift
DeleteKeyCode();
if(bcheck){bcheck=0;break;}
if(Program==FUNC)
{
position++;
if(position==15)
position=0;
}
break;
case 0x20: //Function
DeleteKeyCode();
bcheck=0;
if(Program==RUN)
{
Program=FUNC;
bSet_led=0;
flag_func=1;
flag_run=0;
position=0;
Work=Emergency;
}
else
{
Program=RUN;
flag_func=0;
flag_run=1;
bSet_led=1;
}
break;
case 0x40: //check
DeleteKeyCode();
if((current_state==stop)&&(flag_func==0))
{ if(!bcheck)
{
bPrrz_led=0;
bPrrz_RlyDr=0;
prrz_buf=PrrzTime;
PrrzTime=0;
bcheck=1;
Work=check;
}
else bcheck=0;
}
break;
default:
break;
}
}
/*********************************************************************************
这里的数据填充顺序是为和 74154 的输出顺序相配合,因布线不合理所致 。
**********************************************************************************/
void DisData_DSP()
{
DisData[0]=(char)((SpaceTime/100)%10);
DisData[1]=(char)((SpaceTime/10)%10);
DisData[2]=(char)(SpaceTime%10);
DisData[3]=(char)((PrrzLTime/100)%10);
DisData[4]=(char)((PrrzLTime/10)%10);
DisData[5]=(char)(PrrzLTime%10);
DisData[6]=(char)((PrrzTime/100)%10);
DisData[7]=(char)((PrrzTime/10)%10);
DisData[8]=(char)(PrrzTime%10);
DisData[9]=(char)((WeldTime/100)%10);
DisData[10]=(char)((WeldTime/10)%10);
DisData[11]=(char)(WeldTime%10);
DisData[12]=(char)((WorkCount/100)%10);
DisData[13]=(char)((WorkCount/10)%10);
DisData[14]=(char)(WorkCount%10);
}
/*************************** LED_Display() ************************************
i 左移 4 位做为 74154 的输入,74154的 输出 Q0-Q14 为SpaceTimed \PrrzLTime\PrrzTime\
WeldTime\WorkCount 的 百位 ,十 位,个位。而面板上的次序为 PrrzTime \WeldTime \WorkCount\
PrrzLTime\SpaceTime,这样以来按键移位的顺序和显示位驱动的顺序无法统一,需要分别处理
***********************************************************************************/
void LED_Display()
{
static unsigned int j;
static unsigned char i;
P2_7=1;
DisData[i] &=0x0f;
DisData[i] |=(i<<4);
if(flag_func)
{
if(j++>999)j=0;
if(j>499)P0=DisData[i];
else
{
if((position==0)&&(i==6))P0=0xff;
else if((position==1)&&(i==7))P0=0xff;
else if((position==2)&&(i==8))P0=0xff;
else if((position==3)&&(i==9))P0=0xff;
else if((position==4)&&(i==10))P0=0xff;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -