📄 main.c
字号:
/*****************************************************************************
** 功能模块描述:主函数
** 建立日期: 2007年5月2日
** 调用模块:LCD 显示、G代码输入、直线插补、圆弧插补、手动、回原点G代码执行。
** 版本号: 030120531
** 设计者 :周德宇
******************************************************************************/
//#include <sst89x5x4.H>
#include <AT89X51.h> /*头文件定义*/
#include <stdio.h>
#include <intrins.h>
#include <math.h>
#include <ALL.h>
#include <Line_interpolation.c>
#include <manual.c>
#include <lcd.c>
#include <G_translation.c>
#include <G_input.c>
#include <return_origin.c>
#include <Cir_interpolation.c>
#include <24c02.c>
//#include <IAP.c>
//#include <Interrupt service.c>
/////////////////////子函数//////////////////////////
void service_t0(void) interrupt TF0_VECTOR using 2
{
TH0=(65536-ir_time)/256;
TL0=(65536-ir_time)%256;
ir_signtime++;
if (ir_signtime>250) {ir_signtime=0; TR0=0;ir_start_flag=0;ir_rpt1=ir_rpt2=0;
ir_data[2]=ir_data[3]=0xff; //清除数据.
}
//如果接收到单次的触发脉冲,如干扰或红外信号的结束,关闭定时器,并把红外引导标记清除,把连发标记也清除
}
#ifdef T2
void service_t2(void) interrupt TF2_VECTOR using 1 /*每秒中断显示XY值并判断XY值是否溢出,溢出则停止输出*/
{
static unsigned char Timer2_Server_Count;
TF2=0; // T2定时器发生溢出中断时,需要用户自己清除溢出标记,而51的其他定时器是自动清除的?
Timer2_Server_Count++;
if(Timer2_Server_Count==4) // T2定时器的预装载值为0x0BDC,溢出1次就是35m秒钟。
{
Timer2_Server_Count=0;
SBUF=(unsigned char)(Pref_x/100);
while(!TI){;}
TI=0;
SBUF=(unsigned char)(Pref_y/100);
while(!TI){;}
TI=0;
}
}
#endif
#if 0
void service_ex1(void) interrupt IE1_VECTOR using 1 /*外部紧急中断*/
{
interrupt_flag=1;
// Lcd_print("interrupt");
while(1)
{
P1_6=0;
DelayXS(1) ;
P1_6=1;
}
}
#endif
void service_ex0(void) interrupt IE0_VECTOR using 3
{
EA=0 ; //中断关闭
TH0=(65536-ir_time)/256;
TL0=(65536-ir_time)%256;
if(!ir_start_flag&&ir_signtime>20) //如果没收到引导脉冲,进行引导脉冲CHECK.
{
ir_sign_count=0; //脉冲记数
ir_start_flag=1; //ir_start_flag 引导信号标记。
}
if(ir_start_flag)
{
if(ir_signtime>0&&ir_signtime<10) //符合真正数据的脉冲
{
ir_temp>>=1;
if(ir_signtime>3) ir_temp|=0x80; //如果时间>3是1
ir_sign_count++; //红外脉冲+1
switch (ir_sign_count)
{
case 8:
ir_data[0]=ir_temp; //设备码
break;
case 16:
ir_data[1]=ir_temp;
break;
case 24:
ir_data[2]=ir_temp; //数据码
break;
case 32:
ir_data[3]=ir_temp;
if (ir_data[0]==~ir_data[1]&&ir_data[2]==~ir_data[3])
{
ir_flag=1; //有键按下.
/* SBUF=ir_data[2];
while(!TI){;}
TI=0; */
if(ir_data[2]==JINTING)
Jamp_to_user_pragram();
}
break;
}
}
if(ir_signtime>0X40) { lf_flag=1;
if (ir_rpt1>10) { ir_rpt2++;if(ir_rpt2==2) {ir_rpt2=0;ir_flag=1;} }
else ir_rpt1++ ;
} //连发码的处理:接收到连发码,淹死20个码,然后每5个码发送一次键按下信号
else lf_flag=0;
}
ir_signtime=0; //计数器归0
EA=1;
TR0=1; //开始计时
}
void TandC_Tnit(void)
{
EA=1; //总控
ES=1; //串行中断允许
ET1=0; //定时器0
ET0=1; //定时器1,波特发生
EX0=1; //外部0中断
IT0=1; //下降沿触发
SCON=0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD=0x21; //TMOD: timer 1, mode 2, 8-bit reload ,time0 mode1;
PCON=0x80; //SMOD=1;
#ifdef Y12
TH1= 0xFD; //Baud:19200 fosc=11.0592MHz
#endif
#ifdef Y22
TH1= 0xFa; //Baud:19200 fosc=22.1184MHz
#endif
TH0=(65536-ir_time)/256;
TL0=(65536-ir_time)%256;
TR1=1; // timer 1 run
#ifdef T2
T2MOD &= 0xFC; /* 定时器2输出不允许 */
T2MOD |= 0x01; /* ;可以设置为向上/下计数:此程序中为向上达到0xff时溢出*/
EXF2=0; /* 定时器2外部标志位清除*/
TCLK=0;RCLK=0; /* 不用于波特率发生器*/
EXEN2=0; /* 视T2EX(P1.1)端信号无效*/
TH2=MSB_reload_value; /* 填入初始化值*/
TL2=LSB_reload_value;
RCAP2H=MSB_reload_value; /* 重载值 */
RCAP2L=LSB_reload_value;
C_T2=0; /* 定时模式*/
CP_RL2=0; /* 重载模式*/
EA=1; /* 中断允许*/
ET2=1; /* 允许T2中断*/
TR2=0;
#endif
}
void start_handler(void)
{
WriteCommandLCM(0x01,1);
Lcd_print1(0,0,"1.MDI 2.MANUL ");
Lcd_print1(1,0,"3.RUN 4.ORIRGIN");
WriteCommandLCM(0x0F,1);
WriteCommandLCM(0x06,1);
LocateXY(0,0);
ir_data[2]=LEFT;
while(1)
{
a:
LocateXY(0,0);
while(!(ir_data[2]== ENTER))
{
if(ir_data[2]== RIGHT) goto b;
if(ir_data[2]== GB_DOWN) goto c;
if(ir_data[2]==EXIT) goto e;
}
ir_data[2]=0;
///Jamp_to_user_pragram();
G_input();
break;
b:
LocateXY(6,0);
while(!(ir_data[2]== ENTER))
{
if(ir_data[2]== LEFT) goto a;
if(ir_data[2]== GB_DOWN) goto d;
if(ir_data[2]==EXIT) goto e;
}
ir_data[2]=0;
ManualOperation();
break;
c:
LocateXY(0,1);
while(!(ir_data[2]== ENTER))
{
if(ir_data[2]==RIGHT) goto d;
if(ir_data[2]== GB_UP) goto a;
if(ir_data[2]==EXIT) goto e;
}
ir_data[2]=0;
G_translation();
break;
d:
LocateXY(6,1);
while(!(ir_data[2]== ENTER))
{
if(ir_data[2]== LEFT) goto c;
if(ir_data[2]== GB_UP) goto b;
if(ir_data[2]==EXIT) goto e;
}
ir_data[2]=0;
Return_origin();
break;
}
e: ir_flag=0;
}
#if 1
void DelayXS(unsigned char x) /*延时x秒*/
{
unsigned char TempCycA =(unsigned char)x*DELAY;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--) ;
}
}
#endif
void buf_0xff(void) /*G代码缓冲区付值为0XFF*/
{
unsigned char i;
for(i=0;i<LENTH;i++)
buf[i]=0xff;
}
void getin_system(void) /*进入系统5秒到计时*/
{
unsigned char i=0x30;
Lcd_print("the system of CN");
TR2=1;
for(i=0x35;i>=0x30;i--)
{
DisplayOneChar(5,1,i);
DelayXS(1);
}
TR2=0;
}
void displayX(void)
{
unsigned char display_Pref_x[3]={0,0,0};
if(! ((Pref_x%100)==0)) { kc=200-F*50;goto a;}
display_Pref_x[0]=(unsigned char)(Pref_x/10000)+0x30;
display_Pref_x[1]=(unsigned char)(Pref_x/1000%10)+0x30;
display_Pref_x[2]=(unsigned char)(Pref_x/100%100%10)+0x30;
DisplayOneChar (8,1,display_Pref_x[0]);
DisplayOneChar (9,1,display_Pref_x[1]);
DisplayOneChar (10,1,display_Pref_x[2]);
kc=100-F*30;
a:display_Pref_x[0]=0;
}
void displayY(void)
{
unsigned char display_Pref_y[3]={0,0,0};
if(! ((Pref_y%100)==0)) { kc=200-F*50;goto a;}
display_Pref_y[0]=(unsigned char)(Pref_y/10000)+0x30;
display_Pref_y[1]=(unsigned char)(Pref_y/1000%10)+0x30;
display_Pref_y[2]=(unsigned char)(Pref_y/100%100%10)+0x30;
DisplayOneChar (13,1,display_Pref_y[0]);
DisplayOneChar (14,1,display_Pref_y[1]);
DisplayOneChar (15,1,display_Pref_y[2]);
kc=80-F*20;
a:display_Pref_y[0]=0;
}
void displayXY(void)
{
unsigned char display_Pref_xy[3]={0,0,0};
display_Pref_xy[0]=(unsigned char)(Pref_x/10000)+0x30;
display_Pref_xy[1]=(unsigned char)(Pref_x/1000%10)+0x30;
display_Pref_xy[2]=(unsigned char)(Pref_x/100%100%10)+0x30;
DisplayOneChar (7,1,0x58);
DisplayOneChar (8,1,display_Pref_xy[0]);
DisplayOneChar (9,1,display_Pref_xy[1]);
DisplayOneChar (10,1,display_Pref_xy[2]);
DisplayOneChar (12,1,0x59);
display_Pref_xy[0]=(unsigned char)(Pref_y/10000)+0x30;
display_Pref_xy[1]=(unsigned char)(Pref_y/1000%10)+0x30;
display_Pref_xy[2]=(unsigned char)(Pref_y/100%100%10)+0x30;
DisplayOneChar (13,1,display_Pref_xy[0]);
DisplayOneChar (14,1,display_Pref_xy[1]);
DisplayOneChar (15,1,display_Pref_xy[2]);
}
void Jamp_to_user_pragram(void)
{
ACC=0X00;
B=0X00;
PSW=0X00;
SP=0X00;
DPH=0X00;
DPL=0X00;
IE=0X00;
IP=0X00;
PCON=0X00;
P0=0X00;
P1=0X00;
P2=0X00;
P3=0X00;
SFST=SFST&0XE0;
SFDT=0X00;
SFCM=0X00;
SFAL=0X00;
RCAP2L=0X00;
RCAP2H=0X00;
TL2=0X00;
TH2=0X00;
T2CON=0X00;
SCON=0X00;
TCON=0X00;
TMOD=0X00;
TL0=0X00;
TH0=0X00;
TL1=0X00;
TH1=0X00;
SFCF=SFCF|0X80;
SFCF=SFCF&0XBC;
((void (code*)(void))0x0000)();
}
void main(void)
{
LCMInit();
TandC_Tnit();
getin_system(); /*进入系统5秒到计时*/
buf_0xff(); /*G代码缓冲区付值为0XFF*/
s=&buf;
TAI_BI=1; /*提笔*/
ReadXYFromNVRAM();
while(1) /*主循环*/
{
start_handler();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -