Vp=0; //比例因子比较计数器
for(;kcounter<=3;) /*寄存器复位*/
{
if(~!KeyIn1) /*检测右移为高电平?*/
{ /**/
kcounter++;
}
else if(!KeyIn1) /*检测右移为低电平?*/
{
kcounter=0; /*寄存器复位*/
delays(val3); //电机速度
Vp++;
CP1=!CP1; //输出脉冲
if(Vp>=val4) //比例因子比较计数器加1
{
Vp=0;
vala-=1; //加1
}
}
} //松开右移按键
/*-切断机 2019 11 5 L1601 CODE5749****/
#include <REG52.H>
#include <intrins.H>
#define uint unsigned int
#define uchar unsigned char
uchar code disdt[11]={0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xa3};
uchar kcounter,kstatus; //按键计数标志 按键状态标志
uint val1,val3,vala; /*1切断长度,3电机速度延时,vala台板位置*/
uchar val2,val4; /*2切刀次数4比例因子*/
uint val10; /*电机运行缓冲寄存器*/
sbit BP=P5^4;
sbit CS=P4^7; // 12864PIN4 vala显示缓冲valb加减时间处理缓冲
sbit SID=P1^2; // 12864PIN5
sbit SCLK=P1^3; // 12864PIN6
sbit CLRTOTAL=P1^1;
sbit OUT1=P2^7; /****输出上升信号****/
sbit OUT2=P2^6; /****输出下降信号****/
sbit Motor=P2^5; /****电机信号****/
sbit OUT4=P2^4; /****输出信号****/
sbit CP1=P4^2;
sbit Dir1=P4^3;
sbit En1=P4^4;
sbit CP2=P2^0;
sbit Dir2=P2^1;
sbit En2=P2^2;
sbit INT0PUT=P3^2; /****外中断0****/
sbit KeyOut1=P0^6; /****按键输出总线1****/
sbit KeyOut2=P1^7; /****按键输出总线2****/
sbit KeyIn1=P1^6; /****按键输入总线****/
sbit KeyIn2=P1^5; /****按键输入总线****/
sbit funkey=P1^5;
sbit KeyIn3=P1^4; /****按键输入总线****/
sbit DATAUP=P1^4;
sbit KeyIn4=P1^1; /****按键输入总线****/
sbit DATADOWN=P1^1; //
sbit KeyIn5=P1^0; /****按键输入总线****/
sbit KeyIn6=P0^7; /****按键输入总线****/
sbit ADD1=P1^5; /****参数加****/
sbit DEC1=P1^4; /****参数减****/
sbit Intput1=P3^4; // START
sbit Intput2=P3^3; // 原点 中断
sbit Intput3=P3^5;
sbit Intput4=P3^6;
sbit Intput5=P3^7;
sbit Intput6=P4^1;
#define IAP_ADDRESS 0x0000 //EEPROM首地址 切断长度
#define IAP_ADDRESS_CutTime 0x0200 //EEPROM首地址 切刀次数
#define IAP_ADDRESS_MotSpeed 0x0400 //EEPROM首地址 电机速度
#define IAP_ADDRESS_Proportion_Factor 0x0600 //EEPROM首地址 比例因子
typedef uchar BYTE;
typedef uint WORD;
#define CMD_IDLE 0 //空闲模式
#define CMD_READ 1 //IAP字节读命令
#define CMD_PROGRAM 2 //IAP字节编程命令
#define CMD_ERASE 3 //IAP扇区擦除命令
#define ENABLE_IAP 0x82 //if SYSCLK<20MHz
uint x,l,m,n,k,z; /****个十百代码缓冲**/
uint t1,t2,t3,t4; /****个十百千****/
void delay_iic(int v); /****eeprom读写延时**/
void display11(uint h);
void display22(uchar h);
uchar rd_24c01(char a); /****读EEPROM函数****/
void wr_24c01(char a,char b); /****写EEPROM函数****/
void delay(uint k); /****延时****/
uchar A1=0,B1=0;
uchar func; /*功能标志*/
bit adddecbit;
bit OriginEnBit; //原点检测使能标志,初始化置一确认原点后置零
bit MtAdDc_FLAG; //电机加减速标志 初始化加速置1,加速结束置0
uint aa;
uint MtAdDc_mtspeed; /*电机加减速寄存器*/
uint Zero_mtspeed; /*原点电机运行速度寄存器*/
/*------------------延时子程序------------------------*/
void delay_1ms(uint x)
{
int i, j;
for(i=0;i<x;i++)
for(j=0;j<1500;j++);
}
/*----关闭IAP----------------------------*/
void IapIdle()
{
IAP_CONTR=0; //关闭IAP功能
IAP_CMD=0; //清除命令寄存器
IAP_TRIG=0; //清除触发寄存器
IAP_ADDRH=0x80; //将地址设置到非IAP区域
IAP_ADDRL=0;
}
/*-从ISP/IAP/EEPROM区域读取一字节-*/
BYTE IapReadByte(WORD addr)
{
BYTE dat; //数据缓冲区
IAP_CONTR=ENABLE_IAP; //使能IAP
IAP_CMD=CMD_READ; //设置IAP命令
IAP_ADDRL=addr; //设置IAP低地址
IAP_ADDRH=addr>>8; //设置IAP高地址
IAP_TRIG=0x5a; //写触发命令(0x5a)
IAP_TRIG=0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
dat=IAP_DATA; //读ISP/IAP/EEPROM数据
IapIdle(); //关闭IAP功能
return dat; //返回
}
/*-写一字节数据到ISP/IAP/EEPROM区域-*/
void IapProgramByte(WORD addr, BYTE dat)
{
IAP_CONTR=ENABLE_IAP; //使能IAP
IAP_CMD=CMD_PROGRAM; //设置IAP命令
IAP_ADDRL=addr; //设置IAP低地址
IAP_ADDRH=addr>>8; //设置IAP高地址
IAP_DATA=dat; //写ISP/IAP/EEPROM数据
IAP_TRIG=0x5a; //写触发命令(0x5a)
IAP_TRIG=0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle();
}
/*---扇区擦除---------------*/
void IapEraseSector(WORD addr)
{
IAP_CONTR=ENABLE_IAP; //使能IAP val=IapReadByte(IAP_ADDRESS+1);
IAP_CMD=CMD_ERASE; //设置IAP命令
IAP_ADDRL=addr; //设置IAP低地址
IAP_ADDRH=addr>>8; //设置IAP高地址
IAP_TRIG=0x5a; //写触发命令(0x5a)
IAP_TRIG=0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle();
}
/*-----------------------------------------*/
void red_eeprom(void)
{
t1=IapReadByte(IAP_ADDRESS); //切断长度
t2=IapReadByte(IAP_ADDRESS+1);
t3=IapReadByte(IAP_ADDRESS+2);
t4=IapReadByte(IAP_ADDRESS+3);
val1=t1*1000+t2*100+t3*10+t4;
t1=IapReadByte(IAP_ADDRESS_CutTime); //切断次数
t2=IapReadByte(IAP_ADDRESS_CutTime+1);
t3=IapReadByte(IAP_ADDRESS_CutTime+2);
val2=t1*100+t2*10+t3;
t1=IapReadByte(IAP_ADDRESS_MotSpeed); //电机速度
t2=IapReadByte(IAP_ADDRESS_MotSpeed+1);
t3=IapReadByte(IAP_ADDRESS_MotSpeed+2);
val3=t1*100+t2*10+t3;
t1=IapReadByte(IAP_ADDRESS_Proportion_Factor); //比例因子
t2=IapReadByte(IAP_ADDRESS_Proportion_Factor+1);
t3=IapReadByte(IAP_ADDRESS_Proportion_Factor+2);
val4=t1*100+t2*10+t3;
}
/*------------------延时子程序------------------------*/
void delay1ms(int x) //@12.000MHz 50us
{
unsigned char j,s;
s=x ;
for(s=0;s<x;s++)
for(j=0;j<15;j++);
}
/*------------------延时子程序------------------------*/
void delay(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<121;j++);
}
/****************按键计数器状态寄存器归零*************/
void RstKey()
{
kcounter=0; //按键计数器归零
kstatus=0; //状态寄存器归零
}
/*****************按键低电平检测函数*****************/
void LowVoltKey(void) //按键计数器状态标志加一
{
kcounter++;
kstatus++;
delay(5); //延时
}
/*****************按键高电平检测函数*****************/
void HighVoltKey(void) //按键计数器加一 状态标志归零
{
kcounter++; //按键计数器加一
kstatus=0; //按键状态标志归零
delay(5); //延时
}
/*------------------写命令到LCD-----------------------*/
void write_com(uchar cmdcode)
{
uchar i;
uchar i_data,temp_data1,temp_data2;
EA=0;
i_data=0xf8;
delay_1ms(10);
CS=1;
SCLK=0;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
i_data=cmdcode;
i_data&=0xf0;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
i_data=cmdcode;
temp_data1=i_data&0xf0;
temp_data2=i_data&0x0f;
temp_data1>>=4;
temp_data2<<=4;
i_data=temp_data1|temp_data2;
i_data&=0xf0;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
CS=0;
EA=1;
}
/*-------------------写数据到LCD----------------------*/
void write_data(uchar Dispdata)
{
uchar i;
uchar i_data,temp_data1,temp_data2;
EA=0;
i_data=0xfa;
delay_1ms(10);
CS=1;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
i_data=Dispdata;
i_data&=0xf0;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
i_data=Dispdata;
temp_data1=i_data&0xf0;
temp_data2=i_data&0x0f;
temp_data1>>=4;
temp_data2<<=4;
i_data=temp_data1|temp_data2;
i_data&=0xf0;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
CS=0;
EA=1;
}
/*------------------初始化LCD屏-----------------------*/
void lcd_init()
{
uchar comdata;
delay_1ms(100);
comdata=0x30;
write_com(comdata); /*功能设置:一次送8位数据,基本指令集*/
comdata=0x04;
write_com(comdata); /*点设定:显示字符/光标从左到右移位,DDRAM地址加1*/
comdata=0x0f;
write_com(comdata); /*显示设定:开显示,显示光标,当前显示位反白闪动*/
comdata=0x01;
write_com(comdata); /*清DDRAM*/
comdata=0x02;
write_com(comdata); /*DDRAM地址归位*/
comdata=0x80;
write_com(comdata); /*把显示地址设为0X80,即为第一行的首位*/
}
/*--------参数设置------------------*/
void xscssz()
{
write_com(0X82); /*---参---*/
write_data(0xB2);
write_data(0xCE);
write_com(0X83); /*---数---*/
write_data(0xCA);
write_data(0xFD);
write_com(0X84); /*---设---*/
write_data(0xC9);
write_data(0xE8);
write_com(0X85); /*---置---*/
write_data(0xD6);
write_data(0xC3);
}
/**************台板位置****************/
void TablePosition()
{
write_com(0X90); //
write_data(0XCC);
write_data(0XA8); /*---台----*/
write_com(0X91);
write_data(0XB0);
write_data(0XE5); /*---板----*/
write_com(0X92);
write_data(0XCE);
write_data(0XBB); /*---位----*/
write_com(0X93);
write_data(0XD6);
write_data(0XC3); /*---置----*/
}
/**************台板参数显示************/
void DisTableData()
{
t1=vala/1000;
t2=(vala-t1*1000)/100;
t3=(vala-t1*1000-t2*100)/10;
t4=vala-t1*1000-t2*100-t3*10;
write_com(0x94); /*地址*/
write_data(0xA3); /*半个字符*/
write_data(disdt[t1]); /*千位*/
write_com(0x95); /*地址*/
write_data(0xA3); /*半个字符*/
write_data(disdt[t2]); /*百位*/
write_com(0x96); /*地址*/
write_data(0xA3); /*半个字符*/
write_data(disdt[t3]); /*十位*/
write_com(0x97); /*地址*/
write_data(0xA3); /*半个字符*/
write_data(disdt[t4]); /*个位*/
}
/**************切断长度****************/
void CutteLength()
{
write_com(0X90); //
write_data(0XC7);
write_data(0XD0); /*---切----*/
write_com(0X91);
write_data(0XB6);
write_data(0XCF); /*---断----*/
write_com(0X92);
write_data(0XB3);
write_data(0XA4); /*---长----*/
write_com(0X93);
write_data(0XB6);
write_data(0XC8); /*---度----*/
}
/**************电机速度****************/
void MotorSpeed()
{
write_com(0x90); //
write_data(0xB5);
write_data(0xE7); /*---电----*/
write_com(0x91);
write_data(0xBB);
write_data(0xFA); /*---机----*/
write_com(0x92);
write_data(0xCB);
write_data(0xD9); /*---速----*/
write_com(0x93);
write_data(0xB6);
write_data(0xC8); /*---度----*/
}
/**************切刀次数****************/
void CutteTime()
{
write_com(0X90); //
write_data(0XC7);
write_data(0XD0); /*---切----*/
write_com(0X91);
write_data(0XB5);
write_data(0XB6); /*---刀----*/
write_com(0X92);
write_data(0XB4);
write_data(0XCE); /*---次----*/
write_com(0X93);
write_data(0XCA);
write_data(0XFD); /*---数----*/
}
/**************比例因子****************/
void Proportion_Factor()
{
write_com(0X90); //
write_data(0XB1);
write_data(0XC8); /*---比----*/
write_com(0X91);
write_data(0XC0);
write_data(0XFD); /*---例----*/
write_com(0X92);
write_data(0XD2);
write_data(0XF2); /*---因----*/
write_com(0X93);
write_data(0XD7);
write_data(0XD3); /*---子----*/
}
/*-----显示-状态-----------------------------------*/
void display()
{
write_com(0x80);
write_data(0xB2);
write_data(0xFA); /*---产---*/
write_com(0x81);
write_data(0xC1);
write_data(0xBF); /*---量---*/
TablePosition(); //台板位置
write_com(0X88); //
write_data(0XC7);
write_data(0XD0); /*---切----*/
write_com(0X89);
write_data(0XB6);
write_data(0XCF); /*---断----*/
write_com(0X8A);
write_data(0XB3);
write_data(0XA4); /*---长----*/
write_com(0X8B);
write_data(0XB6);
write_data(0XC8); /*---度----*/
display11(val1);
write_com(0X98); //
write_data(0XC7);
write_data(0XD0); /*---切----*/
write_com(0X99);
write_data(0XB5);
write_data(0XB6); /*---刀----*/
write_com(0X9A);
write_data(0XB4);
write_data(0XCE); /*---次----*/
write_com(0X9B);
write_data(0XCA);
write_data(0XFD); /*---数----*/
display22(val2);
}
/*--------------显示切断长度---------------------*/
void display1(uint h)
{
t1=h/1000;
t2=(h-t1*1000)/100;
t3=(h-t1*1000-t2*100)/10;
t4=h-t1*1000-t2*100-t3*10;
write_com(0x94); /*地址*/
write_data(0xA3); /*半个字符*/
write_data(disdt[t1]); /*千位*/
write_com(0x95); /*地址*/
write_data(0xA3); /*半个字符*/
write_data(disdt[t2]); /*百位*/
write_com(0x96); /*地址*/
write_data(0xA3); /*半个字符*/
write_data(disdt[t3]); /*十位*/
write_com(0x97); /*地址*/
write_data(0xA3); /*半个字符*/
write_data(disdt[t4]); /*个位*/
}
/*--------------显示切断长度---------------------*/
void display11(uint h)
{
t1=h/1000;
t2=(h-t1*1000)/100;
t3=(h-t1*1000-t2*100)/10;
t4=h-t1*1000-t2*100-t3*10;
write_com(0X8C); /*地址*/
write_data(0xA3); /*半个字符*/
write_data(disdt[t1]); /*千位*/
write_com(0X8D); /*地址*/
write_data(0xA3); /*半个字符*/
write_data(disdt[t2]); /*百位*/
write_com(0X8E); /*地址*/
write_data(0xA3); /*半个字符*/
write_data(disdt[t3]); /*十位*/
write_com(0X8F); /*地址*/
write_data(0xA3); /*半个字符*/
write_data(disdt[t4]); /*个位*/
}
/*------显示切断次数,电机速度,比例因子----------*/
void display2(uchar h)
{
uchar S1,S2,S3;
S1=h/100;
S2=(h-S1*100)/10;
S3=h-S1*100-S2*10;
write_com(0X94); /*地址*/
write_data(0xA3); /*半个字符*/
write_data(disdt[S1]); /*千位*/
write_com(0X95); /*地址*/
write_data(0xA3); /*半个字符*/
write_data(disdt[S2]); /*百位*/
write_com(0X96); /*地址*/
write_data(0xA3); /*半个字符*/
write_data(disdt[S3]); /*十位*/
}
/*------显示切断次数,电机速度,比例因子----------*/
void display22(uchar h)
{
uchar S1,S2,S3;
S1=h/100;
S2=(h-S1*100)/10;
S3=h-S1*100-S2*10;
write_com(0X9C); /*地址*/
write_data(0xA3); /*半个字符*/
write_data(disdt[S1]); /*百位*/
write_com(0X9D); /*地址*/
write_data(0xA3); /*半个字符*/
write_data(disdt[S2]); /*十位*/
write_com(0X9E); /*地址*/
write_data(0xA3); /*半个字符*/
write_data(disdt[S3]); /*个位*/
write_com(0X9F); /*---CLEAR---*/
write_data(0xB6);
write_data(0xA0);
}
/*---------------显示自动---------------------*/
void disauto()
{ /*开始*/
write_com(0x84); /*地址*/
write_data(0xD7); /*半个字符*/
write_data(0xD4); /*半个字符*/
write_com(0x85); /*地址*/
write_data(0xB6); /*半个字符*/
write_data(0xAF); /*半个字符*/
}
/*---------------显示停止---------------------*/
void disstop()
{ /*开始*/
write_com(0x84); /*停地址*/
write_data(0xCD); /*半个字符*/
write_data(0xA3); /*半个字符*/
write_com(0x85); /*止地址*/
write_data(0xD6); /*半个字符*/
write_data(0xB9); /*半个字符*/
}
/************************rundelay()**********************/
void addtotal()
{
if(val4>9999){val4=0;} /*大于9999归零*/
t1=val4/1000;
t2=(val4-t1*1000)/100;
t3=(val4-t1*1000-t2*100)/10;
t4=val4-t1*1000-t2*100-t3*10; /*分离千 百 十 个三位*/
}
/*------------------开机广告-----------------------*/
void displayAdvertising()
{
write_com(0x06); /*游标的移动方向及指定显示的移位*/
write_com(0X82); /*--切---*/
write_data(0XC7);
write_data(0XD0);
write_com(0x83); /*--断---*/
write_data(0XB6);
write_data(0XCF);
write_com(0x84); /*--机---*/
write_data(0XBB);
write_data(0XFA);
write_com(0x91); /*--自---*/
write_data(0XD7);
write_data(0XD4);
write_com(0x92); /*--动---*/
write_data(0XB6);
write_data(0XAF);
write_com(0x93); /*--控---*/
write_data(0XBF);
write_data(0XD8);
write_com(0x94); /*--制---*/
write_data(0XD6);
write_data(0XC6);
write_com(0x95); /*--器---*/
write_data(0XC6);
write_data(0XF7);
write_com(0x88); /*--手----*/
write_data(0xCA);
write_data(0xD6);
write_com(0x89); /*--机----*/
write_data(0xBB);
write_data(0xFA);
write_com(0x8A);
write_data(0x3A); /*--:----*/
write_data(0x31); /*--1----*/
write_com(0x8B);
write_data(0x33); /*--3----*/
write_data(0x37); /*--7----*/
write_com(0x8C);
write_data(0x37); /*--7----*/
write_data(0x35); /*--5----*/
write_com(0x8D);
write_data(0x30); /*--0----*/
write_data(0x36); /*--6----*/
write_com(0x8E);
write_data(0x31); /*--1----*/
write_data(0x37); /*--7----*/
write_com(0x8F);
write_data(0x39); /*--9----*/
write_data(0x32); /*--2----*/
}
/**************显示刀架上升****/
void Model_Up()
{
write_com(0X84); //刀
write_data(0XB5);
write_data(0XB6);
write_com(0X85); //架
write_data(0XBC);
write_data(0XDC);
write_com(0X86); //上
write_data(0XC9);
write_data(0XCF);
write_com(0X87); //升
write_data(0XC9);
write_data(0XFD);
}
/**************显示刀架下降****/
void Model_Dwon()
{
write_com(0X84); //刀
write_data(0XB5);
write_data(0XB6);
write_com(0X85); //架
write_data(0XBC);
write_data(0XDC);
write_com(0X86); //下
write_data(0XCF);
write_data(0XC2);
write_com(0X87); //降
write_data(0XBD);
write_data(0XB5);
}