/***************上料时间参数显示******************/
void dis_timea(uchar s)
{
uchar x,y;
uint i=0;
A1=s/100;
A2=(s-A1*100)/10;
A3=s-A1*100-A2*10;
for(y=0;y<2;y++) //百位显示
{
Write_IIC_Command(0XB2+y); //纵向页
Write_IIC_Command(00); //横向离左部边缘开始的距离
Write_IIC_Command(0X15); //横向第四个字
for(x=0;x<8;x++) //横向像素
{
Write_IIC_Data(show1[x+y*8+A1*16]); //0--A字符表
}
for(x=0;x<8;x++) //横向像素
{
Write_IIC_Data(show1[x+y*8+A2*16]);
}
}
for(y=0;y<2;y++) //十位显示
{
Write_IIC_Command(0XB2+y); //纵向页
Write_IIC_Command(00); //横向离左部边缘开始的距离
Write_IIC_Command(0X16); //横向第五个字
for(x=0;x<8;x++) //横向像素
{
Write_IIC_Data(show1[x+y*8+A3*16]);
}
for(x=0;x<8;x++) //横向像素
{
Write_IIC_Data(0X00); //2025 4 20
}
}
}
/***************设置参数显示******************/
void dis_timeb(uchar s)
{
uchar x,y;
uint i=0;
A1=s/100;
A2=(s-A1*100)/10;
A3=s-A1*100-A2*10;
for(y=0;y<2;y++) //百位显示
{
Write_IIC_Command(0XB4+y); //纵向页
Write_IIC_Command(00); //横向离左部边缘开始的距离
Write_IIC_Command(0X15); //横向第四个字
for(x=0;x<8;x++) //横向像素
{
Write_IIC_Data(show1[x+y*8+A1*16]); //0--A字符表
}
for(x=0;x<8;x++) //横向像素
{
Write_IIC_Data(show1[x+y*8+A2*16]);
}
}
for(y=0;y<2;y++) //十位显示
{
Write_IIC_Command(0XB4+y); //纵向页
Write_IIC_Command(00); //横向离左部边缘开始的距离
Write_IIC_Command(0X16); //横向第五个字
for(x=0;x<8;x++) //横向像素
{
Write_IIC_Data(show1[x+y*8+A3*16]);
}
}
}
/***************显示参数归零******************/
void csgl()
{
uchar x,y;
uint Cnt=32;
//参B0 12 00
for(y=0;y<2;y++)
{
Write_IIC_Command(0xb0+y); //竖向第一行
Write_IIC_Command(0x00);
Write_IIC_Command(0x11); //横向第三个字
for(x=0;x<16;x++) //横向像素
{
Write_IIC_Data(show4[x+y*16+Cnt*0]); //字符表第0个字
}
}
//数B0 13 01
for(y=0;y<2;y++)
{
Write_IIC_Command(0xb0+y); //竖向第一行
Write_IIC_Command(0x00);
Write_IIC_Command(0x12); //横向第四个字
for(x=0;x<16;x++) //横向像素
{
Write_IIC_Data(show4[x+y*16+Cnt*1]); //字符表第1个字
}
}
//归B0 14 02
for(y=0;y<2;y++)
{
Write_IIC_Command(0xb0+y); //竖向第一行
Write_IIC_Command(0x00);
Write_IIC_Command(0x13); //横向第五个字
for(x=0;x<16;x++) //横向像素
{
Write_IIC_Data(show4[x+y*16+Cnt*27]); //字符表第2个字
}
}
//零B0 15 03
for(y=0;y<2;y++)
{
Write_IIC_Command(0xb0+y); //竖向第一行 机
Write_IIC_Command(0x00);
Write_IIC_Command(0x14); //横向第六个字
for(x=0;x<16;x++) //横向像素
{
Write_IIC_Data(show4[x+y*16+Cnt*28]); //字符表第3个字
}
}
}
/***************显示开关数率******************/
void DisRunSpeed()
{
uchar x,y;
uint Cnt=32;
//开B2 10 36
for(y=0;y<2;y++)
{
Write_IIC_Command(0xb2+y); //竖向第一行
Write_IIC_Command(0x00);
Write_IIC_Command(0x10); //横向第三个字
for(x=0;x<16;x++) //横向像素
{
Write_IIC_Data(show4[x+y*16+Cnt*36]); //字符表第0个字
}
}
//关B2 11 37
for(y=0;y<2;y++)
{
Write_IIC_Command(0xb2+y); //竖向第一行
Write_IIC_Command(0x00);
Write_IIC_Command(0x11); //横向第四个字
for(x=0;x<16;x++) //横向像素
{
Write_IIC_Data(show4[x+y*16+Cnt*37]); //字符表第1个字
}
}
//数B2 12 1
for(y=0;y<2;y++)
{
Write_IIC_Command(0xb2+y); //竖向第一行
Write_IIC_Command(0x00);
Write_IIC_Command(0x12); //横向第五个字
for(x=0;x<16;x++) //横向像素
{
Write_IIC_Data(show4[x+y*16+Cnt*1]); //字符表第2个字
}
}
//率B2 13 17
for(y=0;y<2;y++)
{
Write_IIC_Command(0xb2+y); //竖向第一行 机
Write_IIC_Command(0x00);
Write_IIC_Command(0x13); //横向第六个字
for(x=0;x<16;x++) //横向像素
{
Write_IIC_Data(show4[x+y*16+Cnt*17]); //字符表第3个字
}
}
}
/*----------功能判断子程序------------*/
void function(uchar FuncData)
{
uchar func;
func=FuncData;
Dis_Num(func);
display(func); //临时测试
if(func==1) //功能设置循环置为1
{
Initial_LY096BG30(); //初始化显示屏
Infrared_delay(); //上料延时
// DisNumber(0); //功能编号
distest(RunTime_A);
}
if(func==2) //功能设置循环置为2
{
Initial_LY096BG30(); //初始化显示屏
photoelectricity_delay(); //光电延时
distest(RunTime_B);
}
if(func==3) //功能设置循环置为3
{
Initial_LY096BG30(); //初始化显示屏
DisStopData(); //显示电机速度
dishz(FHz); //参数显示 分离lmn百十个位数据
}
if(func==4) //功能设置循环置为4
{
Initial_LY096BG30(); //初始化显示屏
DisMotorSpeed(); //电机速度
distest(CT); //占空比
}
if(func==5) //功能设置循环置为4
{
Initial_LY096BG30(); //初始化显示屏
DisRunSpeed(); //开关数率 计数器
display(total); //
}
}
/*----------参数加-----------------*/
void DataOn( ) /*写数据B子函数*/
{ /*子函数开始*/
valb=valb+1; /**加一**/
if(valb>999)
valb=0; /*大于999归零*/
} /*子函数结束*/
/*----------参数减---------------*/
void DataDown( ) /*写数据B子函数*/
{ /*子函数开始*/
valb=valb-1; /**加一**/
if(valb==0)
valb=999; /*大于999归零*/
} //
/*-----------加减按键处理子程序------*/
void addfunt(int funtt,bit adddec) //功能编号 加减标志
{
int fun;
bit adddecb;
fun=funtt;
adddecb=adddec;
switch(fun)
{ //
case 1: //上升结束延时加
if(adddecb)
{
valb=RunTime_A; //数据交上升结束延时加函数子程序处理
DataOn(); //加函数 display()函数处理lmn
RunTime_A=valb; //处理数据交上升结束延时 存储器
distest(RunTime_A); //参数显示 分离lmn百十个位数据
write_eeprom();
}
else
{ //减
valb=RunTime_A; //数据交上升结束延时减函数子程序处理
DataDown(); //减函数 display()函数处理lmn
RunTime_A=valb; //处理数据交上升结束延时 存储器
distest(RunTime_A); //参数显示 分离lmn百十个位数据
write_eeprom();
}break;
case 2: //下降时间加
if(adddecb)
{
valb=RunTime_B; //数据交下降时间加函数子程序处理
DataOn(); //加函数 display()函数处理lmn
RunTime_B=valb; //处理数据交下降时间 存储器
distest(RunTime_B); //参数显示 分离lmn百十个位数据
write_eeprom();
}
else
{ //下降时间减
valb=RunTime_B; //数据交减函数子程序处理
DataDown(); //减函数 display()函数处理lmn
RunTime_B=valb; //处理数据交下降时间 存储器
distest(RunTime_B); //参数显示 分离lmn百十个位数据
write_eeprom();
}
break;
case 3: //
if(adddecb)
{
FHz = FHz/100; //
FHz=FHz+1; //
if(FHz>=200) //
{
FHz=0; //
}
dishz(FHz); //参数显示 分离lmn百十个位数据
Timer2_Init();
write_eeprom();
// write3(); //写EEPROM lmn百十个位数据
}
else
{
FHz = FHz/100; //
FHz=FHz-1; //
if(FHz==0)
{
FHz=200;
}
dishz(FHz); //参数显示 分离lmn百十个位数据
Timer2_Init(); //
write_eeprom(); //
}
break;
case 4: //占空比
if(adddecb)
{ //开模时间加
CT++; //数据交加函数子程序处理
if(CT>99)
CT=0; //处理数据交开模时间存储器
Timer2_Init(); //定时器2初始化
distest(CT); //参数显示 分离lmn百十个位数据
write_eeprom();
}
else
{ //开模时间减
CT--; //数据交加函数子程序处理
if(CT<1)
CT=99;
Timer2_Init(); //定时器2初始化
distest(CT); //参数显示 分离lmn百十个位数据
write_eeprom();
}
break;
case 5:
if(adddecb)
{ //开模时间加
RunTime_A=0X10; //上料延时
RunTime_B=0X20; //光电延时
FHz=190; //停顿时间
CT=85; //电机速度
total=5;
Timer2_Init(); //定时器2初始化
write_eeprom(); //
display(total); //
csgl();
}
else
{
RunTime_A=0X10; //上料延时
RunTime_B=0X20; //光电延时
FHz=190; //停顿时间
CT=85; //电机速度
total=5;
Timer2_Init(); //定时器2初始化
write_eeprom(); //
display(total); //
csgl();
}
break;
default :break;
}
}
/*************功能设置函数**************/
/*****功能,加减键设定各界面参数*********/
/************** **************/
void funset()
{
while(func) //进入功能设置流程
{
DisSetData(); //显示参数设置加减设置退出
if(func==0) //功能计数器为0返回主程序
break; //功能标志大于等于6功能计数器归零
if(!KEY_ADD) //检测按键加
{ //数据处理
adddecbit=1; //加减处理标志置1
addfunt(func,adddecbit); //调用加减处理功能子函数 func界面号adddecbit加减标志
}
if(!KEY_DEC) //检测按键减
{ //数据处理
adddecbit=0; //加减处理标志置0
addfunt(func,adddecbit); //调用加减处理功能子函数 func界面号adddecbit加减标志
}
if(!Funkey) //再检测功能键
{
func++; //功能标志加一
Delay_50ms(2); //延时等待
Dis_Num(func);
if(func>=6) //功能标志大于等于6归0
{
func=0; //功能计数器归零
Initial_LY096BG30(); //初始化显示屏
} //
function(func); //刷新功能显示界面
}
// 退出检测
RstKey();
for(;kcounter<5;) //按键循环5次
if(!Quitkey) //按键低电平
{
LowVoltKey(); //按键低电平 清除计数器
}
else if(~!Quitkey) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态计数器加一
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
func=0;
cleardisp();
}
}
cleardisp();
Diswait();
Delay_50ms(5);
}
/*****************************/
void MOTORLRUN() //顶进
{
do
{
RstKey(); //按键复位
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT1) //按键低电平
{
LowVoltKey();
}
else if(~!INTPUT1) //按键高电平
{
HighVoltKey();
}
}
if(kstatus>=4) /*按键状态标志大于等于3为有效值*/
{ /*循环检测 */
MOTORRUN_L=0;
}
}
while(MOTORRUN_L);
}
/*****************************/
void MOTORRRUN() //顶退
{
do
{
RstKey(); //按键复位
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT2) //按键低电平
{
LowVoltKey();
}
else if(~!INTPUT2) //按键高电平
{
HighVoltKey();
}
}
if(kstatus>=4) /*按键状态标志大于等于3为有效值*/
{ /*循环检测 */
MOTORRUN_R=0;
}
}
while(MOTORRUN_R);
}
//自动运行 INTPUT3
void AutoRun()
{
/***************检测料满停机信号*********************/
//低电平开始计时 到设定值料满停机
do
{ //定时器检测INTPUTD2
// 高电平 允许开摇摆电机
RstKey(); //
for(;kcounter<5;) //按键循环5次
{
if(!EXIT_0) //P3.2按键低电平
{
LowRst(); //按键低电平 清除计数器
}
else if(~!EXIT_0) //按键高电平
{
HighSet(); //按键计数器加一 状态计数器加一
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
Time_A=0;
Switch_Flag=0; //定时器计时标志
OUT1=1; //放料闸门关
if(Photoele_Flag==0) //光电上料允许
{
MOTORA_CW=0; //上料电机开
MOTORB_CW=0; //排列电机开启
}
}
/******外中断0检测到中断信号 置位Switch_Flag=1***/
/***************检测上料信号*计时到电机停止******/
if(Switch_Flag==1) /*按键状态标志大于等于3为有效值*/
{ //Switch_Flag=1;
LoaderMotorClose(); //"上料电机"显示关
DisWork(); //显示上料
MOTORA_CW=1; //上料电机停止
OUT1=0; //放料闸门开 计时到闸门关闭
for(Time_A=0;Time_A<RunTime_A;Time_A++)
{ //循环延时设定时间值
dis_timea(Time_A); //显示上料时间
Delay_50ms(5); //延时
}
Clear_State(); //清除第一行状态显示
Switch_Flag=0; //上料信号标志复位
MOTORA_CW=0; //上料电机开启
LoaderMotorOpen(); //"上料电机"显示开
OUT1=1;
}
if(dis_Flag==1) //定时器2读到一次低电平 刷新显示
{
dis_Flag=0;
dis_timeb(Time_B);
}
/***************光电低电平定时器计数 主程序显示时间******/
// Photoele_Flag=1 检测光电开关信号 高电平开排列电机 上料电机
if(Photoele_Flag==1)//光电 链条传输 运行关闭态 开摇摆电机
{
LoaderMotorClose(); //"上料电机"显示关
ArrangeMotorClose(); //"排列电机"显示关
MOTORA_CW=1; //上料电机关闭
MOTORB_CW=1; //排列电机关闭
MOTORB_CCW=1; //备用
Delay_50ms(50); //
RstKey(); //满料光电检测
for(;kcounter<10;) //按键循环5次
{
if(!INTPUTD2) //按键低电平
{
LowRst(); //
}
else if(~!INTPUTD2) //按键高电平
{
HighSet(); //
}
}
if(kstatus>=8) /*按键状态标志大于等于3为有效值*/
{ /*循环检测 */
Delay_50ms(10); //
MOTORA_CW=0; //上料电机开
MOTORB_CW=0; //排列电机开
LoaderMotorOpen(); //"上料电机"显示开
ArrangeMotorOpen(); //"排列电机"显示开
Photoele_Flag=0; //定时器中断计时标志 计时到电机停止
} //Clearkey
} //
//光电高电平 重启运行
RstKey(); //排列电机到位
for(;kcounter<10;) //按键循环5次
{
if(!INTPUT0) //按键低电平
{
LowVoltKey(); //按键低电平 清除计数器
}
else if(~!INTPUT0) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态计数器加一
}
}
if(kstatus>=8) /*按键状态标志大于等于3为有效值*/
{
MOTORB_CW=1; //排列电机开
L_EN=1;
R_EN=1;
DisJacking(); //显示顶进
MOTORRUN_L=1; //电机正转标志
MOTORLRUN(); //顶进
L_PWM = 0;
OUT2=1;
L_EN=1;
R_EN=1;
Delay_50ms(5);
DisRetreat(); //显示顶退
MOTORRUN_R=1; //电机反转标志
MOTORRRUN(); //顶退
R_PWM = 0;
OUT2=1;
L_EN=0;
R_EN=0;
DisRetreat(); //清除显示
Clear_State(); //清除第一行状态显示 INTPUT3
//滑槽料满低电平检测
RstKey(); //排列电机到位
for(;kcounter<10;) //按键循环5次
{
if(!INTPUT3) //按键低电平
{
LowVoltKey(); //按键低电平 清除计数器
}
else if(~!INTPUT3) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态计数器加一
}
}
if(kstatus>=8) /*按键状态标志大于等于3为有效值*/
{
//滑槽料满高电平检测
kstatus=0;
for(;kstatus<5;) //排列高电平检测
{
if(~!INTPUT3) //
kstatus++;
else
kstatus=0;
}
}
MOTORB_CW=0; //排列电机开
kstatus=0;
for(;kstatus<5;) //排列高电平检测
{
if(~!INTPUT0) //
kstatus++;
else
kstatus=0;
}
Delay_50ms(10); //延时再检测
}
//检测直流电机
RstKey(); //
for(;kcounter<8;) //按键循环5次
{
kcounter++;
if(~!StartD1) //按键高电平
{
kstatus++; //按键低电平 清除计数器
}
else if(!StartD1) //按键低电平
{
kstatus=0; //按键计数器加一 状态计数器加一
}
}
if(kstatus>=6) /*按键状态标志大于等于3为有效值*/
{
Reset_io(); //关闭输出
RunFlag=0; //自动运行循环标志
cleardisp(); //清除显示
Diswait(); //显示待机
}
//退出自动检测 StartD1
}
while(RunFlag); //
}
/**************定时中断*************************/
void timer0() interrupt 1
{
uchar aa;
aa++; //定时基数变量
if(aa>=200) //定时周期
{
aa=0; //定时基数归零
} //Photoele_Flag=1
//光电停机计时
if(Switch_Flag==1) //外中断0 开闸计时标志
{
Time_A++; //定时器计时开闸时间
if(Time_A>=RunTime_A) //计数器到开闸设定值
{
Time_A=0; //计数器归零
Switch_Flag=0; //开闸计时标志归零
}
}
//开闸计时
}
/*************P3.2下降沿中断**链条上料***********/
void exint0() interrupt 0 //INT0中断入口
{
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(!EXIT_0) //P3.2按键低电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!EXIT_0) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
Switch_Flag=1; //定时器计时标志
} //自动运行函数上料电机停止
//
}
//========================================================================
// 函数: void Timer0_Init(void)
// 描述: 定时器0初始化函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2022-6-2
// 备注:
//========================================================================
void Timer_Init(void)
{
AUXR=0X80; //STC系列的1T 设置
TMOD=0X01; //
TL0=0X32;
TH0=0X53;
ET0=1;
TR0=1;
}
/**************定时器2初始化************/
void Timer2_Init()
{
AUXR|=0x40; //定时器2为12T模式 12MHZ
F_Hz = FHz*100; //*100 总分频20000HZ
T2L = (65536-FOSC/2/F_Hz); //初始化计时值
T2H = (65536-FOSC/2/F_Hz) >> 8;
AUXR |= 0x10; //定时器2开始计时
// INT_CLKO = 0x04; //使能定时器2的时钟输出功能
IE2 |= 0x04; //开定时器2中断
EA = 1; //打开总中断
if(F_Hz == 0||F_Hz == 20000) //当频率值为0或200Hz关闭输出
{
IE2 &= ~0x04; //关闭中断
AUXR &= ~0x10; //定时器2停止计时
// PWM1 = 0;
}
}
/*定时器2扩展外部普通IO中断****************/
/*P2.2低电平开计数器高电平关计数器*/
/******/
void t2int() interrupt 12 //中断入口
{
uint CT0,CT1,CT2,CT3; //
uchar SS; //
SS++; //定时基数变量
if(SS>=200) //定时周期
{
SS=0; //定时基数归零
//计时标志为0 检测低电平信号
if(Photoele_Flag==0) //满料光电检测
{
if(!INTPUTD2) //按键低电平 INTPUTD2 P2.2口
{
Time_B++; //计数满清零
dis_Flag=1; //计数器刷新显示标志
if(Time_B>=RunTime_B) //Auto_Run Time_B++
{
Photoele_Flag=1; //定时器中断计时标志 计时到电机停止
Time_B=0; //计数满清零
}
} //高电平计数器归零
else if(~!INTPUTD2) //按键低电平 INTPUT3 P3.3口
{
Time_B=0; //计数满清零
}
}
}
//
if(MOTORRUN_L==1)
{
CT2++;
if(CT2>=2)
{
CT2 = 0;
CT0++;
if(CT0>=CT)
{
L_PWM = 1; //
}
else
{
L_PWM = 0;
}
if(CT0>=100)
{
CT0 = 0;
}
}
}
//
if(MOTORRUN_R==1)
{
CT3++;
if(CT3>=2)
{
CT3 = 0;
CT1++;
if(CT1>=CT) //占空比
{
R_PWM = 1; //
}
else
{
R_PWM = 0;
}
if(CT1>=100)
{
CT1 = 0;
}
}
}
//
}
/******************** 主函数 **************************/
void main(void)
{
// P_SW2 |= 0x80; //扩展寄存器(XFR)访问使能
func=0;
RunFlag=0; //自动运行循环标志
LED=0;
total=0;
IT0=1; //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
EX0=1; //使能INT0中断
EA=1;
Init_io();
Initial_LY096BG30();
cleardisp();
red_eeprom();
Timer_Init(); //定时器0初始化
Timer2_Init(); //定时器2初始化
dis_Flag=0; //光电显示刷新标志
Run_Flag=0; //自动运行标志
Photoele_Flag=0; //光电低电平计时标志 定时器1读IO口
Valve_Time=0;
cleardisp();
red_eeprom();
display(total); //
Delay_50ms(10);
total++;
write_eeprom(); //
Diswait(); //
Step=5; //步进数
while(1)
{
// OUT2=~OUT2; //
Delay_50ms(5);
cleardisp();
Diswait(); //
RstKey();
for(;kcounter<10;) //按键循环5次
{
if(!Funkey) //按键低电平
{
LowVoltKey();
delay(50); //延时
}
else if(~!Funkey) //按键高电平
{
HighVoltKey();
delay(50); //延时
}
}
if(kstatus>=8) /*按键状态标志大于等于3为有效值*/
{ /*循环检测 */
Initial_LY096BG30(); //初始化显示屏
func+=1; // 功能循环标志
cleardisp();
DisSetData();
function(func); // 功能判断子程序 功能设置散转
funset(); //进入功能设置界面
} //Clearkey
///
//功能键
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(!StartD1) //按键低电平
{
LowVoltKey(); //按键低电平 清除计数器
}
else if(~!StartD1) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态计数器加一
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
cleardisp();
DisDoon(); //显示运行
DisLoaderMotor(); //上料电机
Delay_50ms(5);
DisArrangeMotor(); //排列电机
Delay_50ms(5);
dis_Value(Time_A);
dis_Val(Time_B);
Delay_50ms(10);
LoaderMotorOpen();
ArrangeMotorOpen();
RunFlag=1; //自动运行循环标志
AutoRun(); //自动运行子程序
}
} //参数设置 EEPROM储存
} //L2251 CODE11820 2025 5 68