STC8H8K32U工控板运行程序标志位显示

该代码是一个基于STC8H单片机的工业控制系统程序,主要用于控制气缸和电机的运动流程。系统包含OLED显示、I2C通信、EEPROM存储、按键检测、自动运行模式等功能。程序实现了气缸和电机的进退控制,并通过传感器检测到位状态,同时记录运行次数到EEPROM。主要功能模块包括初始化、延时函数、I2C通信、OLED显示驱动、EEPROM读写、自动运行流程、手动控制等。系统通过状态机实现多任务处理,并具有防抖动按键检测机制。

延时变慢定位

RunLocal++;

dis_Val3(RunLocal);

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!KEY_3) //输入端口低电平

{

delay_ms(200); //

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!KEY_3) //输入端口高电平

{

delay_ms(200); // //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

RunTime_A=0;

dis_Val1(RunTime_A);

write_ee_S(IAP_ADDRES_S,RunTime_A);

}

}

//归零

/***************动作流程**********************/

/***开启动 开模 气缸进 关前气缸 关后气缸******/

/***等待机械手 电机进 关前电机 关后电机 ******/

/***气缸退 关前气缸 关后气缸 延时等待 ******/

/***气缸进 关前气缸 关后气缸 电机退 ******/

/***关前电机 关后电机 检测自动开关 重复循环***/

/***L1786 CODE 7630 2026 5 30EEPROM***********/

#include "stc8h.h" //包含此头文件后,不需要再包含"reg51.h"头文件

#include "stdio.h"

#include "intrins.h"

#define high 1

#define low 0

#define OPEN 1

#define OFF 0

typedef unsigned char u8;

typedef unsigned int u16;

typedef unsigned long u32;

#define IAP_ADDRES_S 0X0000 //EEPROM首地址

#define IAP_ADDRES_M 0X0200 //EEPROM首地址

sbit OLED_SCL=P2^7; //

sbit OLED_SDA=P2^6; //

u16 RunTime_A,RunTime_B; //

u16 RunLocal=0; //

u16 MARK=0; //

sbit Motora_In1=P1^0; // 电机前信号

sbit Motora_In2=P1^1; // 电机前信号

sbit Motorb_In1=P1^4; // 电机后信号

sbit Motorb_In2=P1^5; // 电机后信号

sbit INT_1=P3^2; // 自动启动

sbit INT_2=P3^3; // 开模信号

sbit INT_3=P3^4; // 机械手到位

sbit INT_4=P3^5; // 气缸前到位

sbit INT_5=P3^6; // 气缸后到位

sbit INT_6=P3^7; // 电机前到位

sbit INT_7=P4^1; // 电机后到位

sbit INT_8=P4^2; // 气缸前退停

sbit INT_9=P4^3; // 气缸后退停

sbit INT_10=P4^4; // 电机前退停

sbit INT_11=P2^0; // 电机后退停

sbit INT_12=P2^1; // 手动气缸进

sbit INT_13=P2^2; // 手动气缸退

sbit INT_14=P2^3; // 手动电机进

sbit INT_15=P2^4; // 手动电机退

sbit INT_16=P2^5; //

//输入信号

sbit OUT_1=P0^6; // 前气缸进

sbit OUT_2=P0^4; // 前气缸退

sbit OUT_3=P0^3; // 后气缸进

sbit OUT_4=P0^2; // 后气缸退

sbit OUT_5=P0^1; // 运行显示

sbit OUT_6=P0^0; //

sbit OUT_7=P4^6; // 警报

sbit OUT_8=P4^5; // 动作完成

//输出信号

sbit KEY_1=P0^5; //

sbit KEY_2=P4^7; //

sbit KEY_3=P1^6; //

sbit KEY_4=P1^7; //

sbit KEY_5=P1^3; //

sbit KEY_6=P5^4; //

sbit KEY_7=P4^0; //

sbit KEY_8=P0^7; //

//按键

u8 Counter; //步进计数器

u8 kcounter,kstatus; //按键计数标志 按键状态标志

bit Auto_Flag;

bit Cylinder_1,Cylinder_2; //气缸进标志位

bit Cylinder_3,Cylinder_4; //气缸进标志位

bit Motor_1,Motor_2; //电机进标志位

bit Motor_3,Motor_4; //电机进标志位

#define MAIN_Fosc 24000000UL

u8 code show1\[\]=

{

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",0*/

0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"1",1*/

0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*"2",2*/

0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/*"3",3*/

0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*"4",4*/

0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*"5",5*/

0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,/*"6",6*/

0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*"7",7*/

0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8",8*/

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,/*"9",9*/

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x1F,0x01,0x01,0x01,0x01,0x1F,0x00,/*"A",10*/

0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,/*"D",11*/

0x08,0xF8,0x00,0xF8,0x00,0xF8,0x08,0x00,0x00,0x03,0x3E,0x01,0x3E,0x03,0x00,0x00,/*"W",12*/

0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,/*"O",13*/

0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,/*"N",14*/

};

u8 code show2\[\]=

{

0x08,0x08,0x08,0x08,0x88,0x78,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,

0x20,0x10,0x48,0x46,0x41,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0x40,0x40,0x00,/*"左",0*/

0x08,0x08,0x08,0x08,0xC8,0x38,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,

0x08,0x04,0x02,0x01,0xFF,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xFF,0x00,0x00,0x00,/*"右",1*/

0x80,0x60,0xF8,0x07,0x00,0x04,0x74,0x54,0x55,0x56,0x54,0x54,0x74,0x04,0x00,0x00,

0x00,0x00,0xFF,0x00,0x03,0x01,0x05,0x45,0x85,0x7D,0x05,0x05,0x05,0x01,0x03,0x00,/*"停",2*/

0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,

0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,/*"止",3*/

0x00,0x00,0x00,0xFC,0x44,0x44,0x44,0x45,0x46,0x44,0x44,0x44,0x44,0x7C,0x00,0x00,

0x40,0x20,0x18,0x07,0x00,0xFC,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFC,0x00,0x00,/*"启",4*/

0x40,0x44,0xC4,0x44,0x44,0x44,0x40,0x10,0x10,0xFF,0x10,0x10,0x10,0xF0,0x00,0x00,

0x10,0x3C,0x13,0x10,0x14,0xB8,0x40,0x30,0x0E,0x01,0x40,0x80,0x40,0x3F,0x00,0x00,/*"动",5*/

0x00,0x04,0x84,0x84,0x94,0xE4,0x85,0x86,0x84,0xC4,0xB4,0x84,0x84,0x84,0x80,0x00,

0x80,0x60,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"产",6*/

0x20,0x20,0x20,0xBE,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBE,0x20,0x20,0x20,0x00,

0x00,0x80,0x80,0xAF,0xAA,0xAA,0xAA,0xFF,0xAA,0xAA,0xAA,0xAF,0x80,0x80,0x00,0x00,/*"量",7*/

0x40,0x40,0x42,0xCC,0x00,0x80,0x88,0x88,0xFF,0x88,0x88,0xFF,0x88,0x88,0x80,0x00,

0x00,0x40,0x20,0x1F,0x20,0x40,0x50,0x4C,0x43,0x40,0x40,0x5F,0x40,0x40,0x40,0x00,/*"进",8*/

0x40,0x40,0x42,0xCC,0x00,0x00,0xFF,0x49,0x49,0xC9,0x49,0x49,0x7F,0x80,0x00,0x00,

0x00,0x40,0x20,0x1F,0x20,0x40,0x5F,0x48,0x44,0x40,0x41,0x42,0x45,0x58,0x40,0x00,/*"退",9*/

0x00,0x00,0x04,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x04,0xFC,0x00,0x00,0x00,

0x00,0x80,0x40,0x20,0x18,0x06,0x01,0x00,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x00,/*"刀",10*/

0x00,0x10,0x88,0xC4,0x33,0x40,0x48,0x48,0x48,0x7F,0x48,0xC8,0x48,0x48,0x40,0x00,

0x02,0x01,0x00,0xFF,0x00,0x02,0x0A,0x32,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x00,/*"待",11*/

0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,

0x04,0x03,0x00,0xFF,0x00,0x83,0x60,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x78,0x00,/*"机",12*/

0x20,0x10,0x4C,0x47,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0xD4,0x04,0x04,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x30,0x40,0xF0,0x00,/*"气",13*/

0x50,0x48,0x47,0x44,0xFC,0x44,0x44,0x44,0x00,0x04,0x04,0xFC,0x04,0x04,0x04,0x00,

0x00,0x3E,0x20,0x20,0x3F,0x10,0x10,0x7E,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x00,/*"缸",14*/

0x80,0x80,0x88,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0x88,0x80,0x80,0x00,

0x20,0x20,0x10,0x08,0x04,0x02,0x01,0xFF,0x01,0x02,0x04,0x08,0x10,0x20,0x20,0x00,/*"未",15*/

0x08,0x08,0xE8,0x29,0x2E,0x28,0xE8,0x08,0x08,0xC8,0x0C,0x0B,0xE8,0x08,0x08,0x00,

0x00,0x00,0xFF,0x09,0x49,0x89,0x7F,0x00,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,0x00,/*"前",16*/

0x00,0x00,0x00,0xFC,0x24,0x24,0x24,0x24,0x22,0x22,0x22,0x23,0x22,0x20,0x20,0x00,

0x40,0x20,0x18,0x07,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,/*"后",17*/

0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,

0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00,/*"电",18*/

0x08,0x04,0x23,0x22,0x26,0x2A,0x22,0xFA,0x24,0x23,0x22,0x26,0x2A,0x02,0x02,0x00,

0x01,0x09,0x09,0x09,0x19,0x69,0x09,0x09,0x49,0x89,0x7D,0x09,0x09,0x09,0x01,0x00,/*"等",19*/

0x10,0x10,0xD0,0xFF,0x90,0x00,0x10,0xD0,0x10,0xD0,0x10,0xFF,0x10,0x92,0x14,0x00,

0x04,0x03,0x00,0xFF,0x00,0x41,0x31,0x0F,0x01,0xBF,0x41,0x27,0x38,0x47,0xF0,0x00,/*"械",20*/

0x00,0x00,0x24,0x24,0x24,0x24,0x24,0xFC,0x22,0x22,0x22,0x23,0x22,0x00,0x00,0x00,

0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,/*"手",21*/

};

//==========================================================================

void delay_ms(u8 ms)

{

u16 i;

do

{

i=MAIN_Fosc/1000;

while(--i);

}

while(--ms);

}

/************按键计数器状态寄存器归零************/

void key_reset()

{

kcounter=0; //计数器归零

kstatus=0; //状态计数器归零

}

/************按键计数器状态寄存器加一************/

void Key_ValAdd()

{

kcounter++; //按键计数器加一

kstatus++; //按键状态标志加一

}

/***********按键计数器加一状态寄存器归零*********/

void Key_Clear()

{

kcounter++; //按键计数器加一

kstatus=0; //按键状态标志归零

}

/*----关闭IAP----------------------------*/

void IapIdle()

{

IAP_CONTR = 0; //关闭IAP功能

IAP_CMD = 0; //清除命令寄存器

IAP_TRIG = 0; //清除触发寄存器

IAP_ADDRH = 0x80; //将地址设置到非IAP区域

IAP_ADDRL = 0;

}

/*-从ISP/IAP/EEPROM区域读取一字节-*/

char IapRead(int addr)

{

char dat;

IAP_CONTR = 0x80; //使能IAP

IAP_TPS = 12; //设置等待参数12MHz

IAP_CMD = 1; //设置IAP读命令

IAP_ADDRL = addr; //设置IAP低地址

IAP_ADDRH = addr >> 8; //设置IAP高地址

IAP_TRIG = 0x5a; //写触发命令(0x5a)

IAP_TRIG = 0xa5; //写触发命令(0xa5)

nop();

dat = IAP_DATA; //读IAP数据

IapIdle(); //关闭IAP功能

return dat;

}

/*-写一字节数据到ISP/IAP/EEPROM区域-*/

void IapProgram(int addr, char dat)

{

IAP_CONTR = 0x80; //使能IAP

IAP_TPS = 12; //设置等待参数12MHz

//IAP_TPS = 12; //设置等待参数12MHz

IAP_CMD = 2; //设置IAP写命令

IAP_ADDRL = addr; //设置IAP低地址

IAP_ADDRH = addr >> 8; //设置IAP高地址

IAP_DATA = dat; //写IAP数据

IAP_TRIG = 0x5a; //写触发命令(0x5a)

IAP_TRIG = 0xa5; //写触发命令(0xa5)

nop();

IapIdle(); //关闭IAP功能

}

/*---扇区擦除---------------*/

void IapErase(int addr)

{

IAP_CONTR = 0x80; //使能IAP

IAP_TPS = 12; //设置等待参数12MHz

IAP_CMD = 3; //设置IAP擦除命令

IAP_ADDRL = addr; //设置IAP低地址

IAP_ADDRH = addr >> 8; //设置IAP高地址

IAP_TRIG = 0x5a; //写触发命令(0x5a)

IAP_TRIG = 0xa5; //写触发命令(0xa5)

nop(); //

IapIdle(); //关闭IAP功能

}

/*************Pin Define***************/

void Oled_delay(u16 ms)

{

u16 i,j;

for(i=0;i<ms;i++)

for(j=0;j<5;j++);

}

/*************Pin Define***************/

void Initial_LY096BG30();

void Delay_50ms(u16 Del_50ms);

void fill_picture(u8 fill_Data);

void IIC_Start();

void IIC_Stop();

void Write_IIC_Command(u8 IIC_Command);

void Write_IIC_Data(u8 IIC_Data);

bit Write_IIC_Byte(u8 IIC_Byte);

/*******************IIC Start******************/

void IIC_Start()

{

OLED_SCL=high;

Oled_delay(2);

OLED_SDA=high;

Oled_delay(2);

OLED_SDA=low;

Oled_delay(2);

OLED_SCL=low;

}

/*************IIC Stop*************************/

void IIC_Stop()

{

OLED_SDA=low;

Oled_delay(2);

OLED_SCL=high;

Oled_delay(2);

OLED_SDA=high;

}

/*****************IIC Write byte***************/

bit Write_IIC_Byte(u8 IIC_Byte)

{

unsigned char i;

bit Ack_Bit; //应答信号

for(i=0;i<8;i++)

{

if(IIC_Byte & 0x80) //1?0?

OLED_SDA=high;

else

OLED_SDA=low;

OLED_SCL=high;

Oled_delay(2);

OLED_SCL=low;

IIC_Byte<<=1; //loop

}

OLED_SDA=high; //释放IIC SDA总线为主器件接收从器件产生应答信号

Oled_delay(2);

OLED_SCL=high; //第9个时钟周期

Oled_delay(2);

Ack_Bit=OLED_SDA; //读取应答信号

OLED_SCL=low;

return Ack_Bit;

}

/*************IIC Write Command*****************/

void Write_IIC_Command(u8 IIC_Command)

{

IIC_Start();

Write_IIC_Byte(0x78); //Slave address,SA0=0

Write_IIC_Byte(0x00); //write command

Write_IIC_Byte(IIC_Command);

IIC_Stop();

}

/****************IIC Write Data*****************/

void Write_IIC_Data(u8 IIC_Data)

{

IIC_Start();

Write_IIC_Byte(0x78);

Write_IIC_Byte(0x40); //write data

Write_IIC_Byte(IIC_Data);

IIC_Stop();

}

/***********************Initial code*********************/

void Initial_LY096BG30()

{

Write_IIC_Command(0xAE); //display off

Write_IIC_Command(0x20); //Set Memory Addressing Mode

Write_IIC_Command(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid

Write_IIC_Command(0xb0); //Set Page Start Address for Page Addressing Mode,0-7

Write_IIC_Command(0xc8); //Set COM Output Scan Direction

Write_IIC_Command(0x00); //---set low column address

Write_IIC_Command(0x10); //---set high column address

Write_IIC_Command(0x40); //--set start line address

Write_IIC_Command(0x81); //--set contrast control register

Write_IIC_Command(0x7f);

Write_IIC_Command(0xa1); //--set segment re-map 0 to 127

Write_IIC_Command(0xa6); //--set normal display

Write_IIC_Command(0xa8); //--set multiplex ratio(1 to 64)

Write_IIC_Command(0x3F); //

Write_IIC_Command(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content

Write_IIC_Command(0xd3); //-set display offset

Write_IIC_Command(0x00); //-not offset

Write_IIC_Command(0xd5); //--set display clock divide ratio/oscillator frequency

Write_IIC_Command(0xf0); //--set divide ratio

Write_IIC_Command(0xd9); //--set pre-charge period

Write_IIC_Command(0x22); //

Write_IIC_Command(0xda); //--set com pins hardware configuration

Write_IIC_Command(0x12);

Write_IIC_Command(0xdb); //--set vcomh

Write_IIC_Command(0x20); //0x20,0.77xVcc

Write_IIC_Command(0x8d); //--set DC-DC enable

Write_IIC_Command(0x14); //

Write_IIC_Command(0xaf); //--turn on oled panel

}

/***************显示计数器值******************/

void dis_Val(u8 s)

{

u8 x,y;

u16 i=0;

u8 A1,A2;

A1=s/10;

A2=s-A1*10;

for(y=0;y<2;y++) //百位显示

{

Write_IIC_Command((u8)(0XB2+y)); //纵向页 1011

Write_IIC_Command(0X00); //横向离左部边缘开始的距离

Write_IIC_Command(0X10); //横向第四个字

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1x+y\*8+A1\*16); //0--A字符表

}

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1x+y\*8+A2\*16); //0--A字符表

}

}

}

/***************设置参数显示******************/

void dis_Val0(u16 s)

{

u16 s1,s2; //高低字节

u8 A1,A2,A3; //个十百位

u8 x,y; //显示坐标

s1=s; //

s2=s>>8; //

A1=s2/100;

A2=(s2-A1*100)/10;

A3=s2-A1*100-A2*10;

for(y=0;y<2;y++) //百位显示

{

Write_IIC_Command((u8)(0XB2+y)); //纵向页 1011

Write_IIC_Command(0X00); //横向离左部边缘开始的距离

Write_IIC_Command(0X10); //横向第四个字

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1x+y\*8+A1\*16);//0--A字符表

}

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1x+y\*8+A2\*16);

Oled_delay(2);

}

}

for(y=0;y<2;y++) //十位显示

{

Write_IIC_Command((u8)(0XB2+y)); //纵向页

Write_IIC_Command(0X00); //横向离左部边缘开始的距离

Write_IIC_Command(0X11); //横向第五个字

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1x+y\*8+A3\*16);

Oled_delay(2);

}

}

// 高八位显示

A1=s1/100;

A2=(s1-A1*100)/10;

A3=s1-A1*100-A2*10;

for(y=0;y<2;y++) //百位显示

{

Write_IIC_Command((u8)(0XB2+y)); //纵向页 1011

Write_IIC_Command(0X00); //横向离左部边缘开始的距离

Write_IIC_Command(0X14); //横向第四个字

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1x+y\*8+A1\*16);//0--A字符表

}

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1x+y\*8+A2\*16);

Oled_delay(2);

}

}

for(y=0;y<2;y++) //十位显示

{

Write_IIC_Command((u8)(0XB2+y)); //纵向页

Write_IIC_Command(0X00); //横向离左部边缘开始的距离

Write_IIC_Command(0X15); //横向第五个字

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1x+y\*8+A3\*16);

Oled_delay(2);

}

}

// 低八位显示

}

/***************设置参数显示RunTime_A******************/

void dis_Val1(u16 s)

{

u8 x,y;

u8 A1,A2,A3;

A1=s/100;

A2=(s-A1*100)/10;

A3=s-A1*100-A2*10;

for(y=0;y<2;y++) //百位显示

{

Write_IIC_Command((u8)(0XB4+y)); //纵向页 1011

Write_IIC_Command(0X00); //横向离左部边缘开始的距离

Write_IIC_Command(0X10); //横向第四个字

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1x+y\*8+A1\*16);//0--A字符表

}

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1x+y\*8+A2\*16);

Oled_delay(2);

}

}

for(y=0;y<2;y++) //十位显示

{

Write_IIC_Command((u8)(0XB4+y)); //纵向页

Write_IIC_Command(0X00); //横向离左部边缘开始的距离

Write_IIC_Command(0X11); //横向第五个字

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1x+y\*8+A3\*16);

Oled_delay(2);

}

}

dis_Val0(s); //

}

/***************设置参数显示RunTime_B******************/

void dis_Val2(u16 s)

{

u8 x,y;

u8 A1,A2,A3;

A1=s/100;

A2=(s-A1*100)/10;

A3=s-A1*100-A2*10;

for(y=0;y<2;y++) //百位显示

{

Write_IIC_Command((u8)(0XB4+y)); //纵向页 1011

Write_IIC_Command(0X00); //横向离左部边缘开始的距离

Write_IIC_Command(0X14); //横向第四个字

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1x+y\*8+A1\*16); //0--A字符表

}

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1x+y\*8+A2\*16);

Oled_delay(2);

}

}

for(y=0;y<2;y++) //十位显示

{

Write_IIC_Command((u8)(0XB4+y)); //纵向页

Write_IIC_Command(0X00); //横向离左部边缘开始的距离

Write_IIC_Command(0X15); //横向第五个字

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1x+y\*8+A3\*16);

Oled_delay(2);

}

}

}

/***************运行流程显示*****************/

void dis_Val3(u16 s)

{

u8 x,y;

u8 A1,A2,A3;

A1=s/100;

A2=(s-A1*100)/10;

A3=s-A1*100-A2*10;

for(y=0;y<2;y++) //百位显示

{

Write_IIC_Command((u8)(0XB0+y)); //纵向页 1011

Write_IIC_Command(0X00); //横向离左部边缘开始的距离

Write_IIC_Command(0X16); //横向第四个字

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1x+y\*8+A1\*16); //0--A字符表

}

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1x+y\*8+A2\*16);

Oled_delay(2);

}

}

for(y=0;y<2;y++) //十位显示

{

Write_IIC_Command((u8)(0XB0+y)); //纵向页

Write_IIC_Command(0X00); //横向离左部边缘开始的距离

Write_IIC_Command(0X17); //横向第五个字

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1x+y\*8+A3\*16);

Oled_delay(2);

}

}

}

/********************显示待机**********************/

void Diswait()

{

u8 x,y;

u16 Cnt=32;

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //竖向第一行 待

Write_IIC_Command(0x00);

Write_IIC_Command(0x10); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*11); //字符表第7个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //竖向第一行 机

Write_IIC_Command(0x00);

Write_IIC_Command(0x11); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*12); //字符表第8个字

}

}

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //竖向第一行 清空

Write_IIC_Command(0x00);

Write_IIC_Command(0x12); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(0X00); //字符表第7个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //竖向第一行 清空

Write_IIC_Command(0x00);

Write_IIC_Command(0x13); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(0X00); //字符表第7个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //竖向第一行 清空

Write_IIC_Command(0x00);

Write_IIC_Command(0x14); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(0X00); //字符表第7个字

}

}

//

}

/****************显示等待机械手****************/

void Wait_Machine()

{

u8 x,y;

u16 Cnt=32;

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //竖向第一行 等

Write_IIC_Command(0x00);

Write_IIC_Command(0x10); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*19); //字符表第7个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //竖向第一行 待

Write_IIC_Command(0x00);

Write_IIC_Command(0x11); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*11); //字符表第8个字

}

}

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //竖向第一行 机

Write_IIC_Command(0x00);

Write_IIC_Command(0x12); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*12); //字符表第7个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //竖向第一行 械

Write_IIC_Command(0x00);

Write_IIC_Command(0x13); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*20); //字符表第7个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //竖向第一行 手

Write_IIC_Command(0x00);

Write_IIC_Command(0x14); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*21); //字符表第7个字

}

}

//

}

/********************显示启动**********************/

void DiStart()

{

u8 x,y;

u16 Cnt=32;

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //竖向第一行 启

Write_IIC_Command(0x00);

Write_IIC_Command(0x16); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*4); //字符表第7个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //竖向第一行 动

Write_IIC_Command(0x00);

Write_IIC_Command(0x17); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*5); //字符表第8个字

}

}

//

}

/*************读EEPROM************************/

void red_eeprom(void)

{

u16 s1,s2;

s1=IapRead(IAP_ADDRES_S);

s2=IapRead(IAP_ADDRES_S+1);

s2=s2<<8; //

RunTime_A=s1+s2; //

s1=IapRead(IAP_ADDRES_M);

s2=IapRead(IAP_ADDRES_M+1);

s2=s2>>8; //

RunTime_B=s1+s2; //

}

/***************************************/

void write_ee_S(u16 IAPADDRES_S,dat)

{

u16 s1,s2;

IapErase(IAPADDRES_S); //扇区擦除

s1=dat;

s2=dat>>8;

IapProgram(IAPADDRES_S,s1); /**/

IapProgram(IAPADDRES_S+1,s2); /**/

}

/***************************************/

void write_ee_M(u16 IAPADDRES_M,dat)

{

u16 s1,s2;

IapErase(IAPADDRES_M); //扇区擦除

s1=dat;

s2=dat>>8;

IapProgram(IAPADDRES_M,s1); /**/

IapProgram(IAPADDRES_M+1,s2); /**/

}

/********************IO_rst**********************/

void IO_int()

{

P_SW2 |= 0x80; //扩展寄存器(XFR)访问使能

P0M1 = 0x00; P0M0 = 0x00; //设置为推挽输出

P1M1 = 0x00; P1M0 = 0x33; //设置1.0 1.1 1.4 1.5强推挽

P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口

P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口

P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口

P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口

}

/********************picture**********************/

void cleardisp()

{

u8 x,y;

for(y=0;y<8;y++)

{

Write_IIC_Command((u8)(0xb0+y));

Write_IIC_Command(0x00);

Write_IIC_Command(0x10);

for(x=0;x<128;x++) //横向像素

{

Write_IIC_Data(0X00);

}

}

}

/***************显示气缸前进******************/

void Cylinder_Forword()

{

u8 x,y;

u16 Cnt=32;

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x10); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*13); //字符表第7个字

}

}

//气

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x11); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*14); //字符表第8个字

}

}

//缸

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x12); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*16); //字符表第7个字

}

}

//前

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x13); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*8); //字符表第8个字

}

}

//进

}

/***************显示气缸后退******************/

void Cylinder_Back()

{

u8 x,y;

u16 Cnt=32;

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x10); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*13); //字符表第7个字

}

}

//气

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x11); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*14); //字符表第8个字

}

}

//缸

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x12); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*17); //字符表第7个字

}

}

//后

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x13); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*9); //字符表第8个字

}

}

//退

}

/***************显示电机前进******************/

void Motor_Forword()

{

u8 x,y;

u16 Cnt=32;

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x10); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*18); //字符表第7个字

}

}

//电

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x11); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*12); //字符表第8个字

}

}

//机

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x12); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*16); //字符表第7个字

}

}

//前

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x13); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*8); //字符表第8个字

}

}

//进

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x14); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(0X00); //字符表第8个字

}

}

//清空

}

/***************显示电机后退******************/

void Motor_Back()

{

u8 x,y;

u16 Cnt=32;

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x10); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*18); //字符表第7个字

}

}

//电

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x11); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*12); //字符表第8个字

}

}

//机

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x12); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*17); //字符表第7个字

}

}

//后退

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x13); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*9); //字符表第8个字

}

}

//退

}

/***************显示电机停止******************/

void Motor_Stop()

{

u8 x,y;

u16 Cnt=32;

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x10); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*18); //字符表第7个字

}

}

//电

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x11); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*12); //字符表第8个字

}

}

//机

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x12); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*2); //字符表第7个字

}

}

//停

for(y=0;y<2;y++)

{

Write_IIC_Command((u8)(0XB0+y)); //

Write_IIC_Command(0x00);

Write_IIC_Command(0x13); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2x+y\*16+Cnt\*3); //字符表第8个字

}

}

//止

}

/***************气缸前进******************/

void TwoCylinderForword()

{

Cylinder_1=1;

Cylinder_2=1;

do

{

if(Cylinder_1==1) //前气缸未复位

{

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_4) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_4) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

Cylinder_1=0;

OUT_1=1; //关前气缸

}

}

}

//前气缸进停止

if(Cylinder_2==1) //前气缸未复位

{

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_5) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_5) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

Cylinder_2=0;

OUT_3=1; //关后气缸

}

}

}

//后气缸进停止

}

while(Cylinder_1||Cylinder_2); // 循环

Diswait();

}

/***************气缸后退******************/

void TwoCylinder_Back()

{

Cylinder_3=1;

Cylinder_4=1;

do

{

if(Cylinder_3==1) //前气缸未复位

{

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_8) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_8) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

Cylinder_3=0;

OUT_2=1; //关前气缸

}

}

}

//前气缸退停止

if(Cylinder_4==1) //前气缸未复位

{

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_9) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_9) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

Cylinder_4=0;

OUT_4=1; //关后气缸

}

}

}

}

//后气缸退停止

while(Cylinder_3||Cylinder_4); //检测运行气缸退两个标志位

Diswait();

}

/***************电机前进******************/

void TwoMotor_Forword()

{

Motor_1=1; //

Motor_2=1; //

Motora_In1=1; // 电机前信号

Motora_In2=0; // 电机前信号

Motorb_In1=1; // 电机后信号

Motorb_In2=0; // 电机后信号

do

{

if(Motor_1==1)

{

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_6) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_6) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

Motor_1=0;

Motora_In1=1; // 电机前信号

Motora_In2=1; // 电机前信号

}

}

}

//前电机进停止

if(Motor_2==1)

{

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_7) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_7) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

Motor_2=0;

Motorb_In1=1; // 电机后信号

Motorb_In2=1; // 电机后信号

}

}

}

//后电机进停止

}

while(Motor_1||Motor_2); //或循环

Diswait();

}

/***************电机后退******************/

void TwoMotor_Back()

{

Motor_3=1; //

Motor_4=1; //

Motora_In1=0; // 电机前信号

Motora_In2=1; // 电机前信号

Motorb_In1=0; // 电机后信号

Motorb_In2=1; // 电机后信号

do

{

if(Motor_3==1) //前气缸未复位

{

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_10) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_10) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

Motor_3=0;

Motora_In1=1; // 电机前信号

Motora_In2=1; // 电机前信号

}

}

}

//电机前退停止

if(Motor_4==1) //前气缸未复位

{

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_11) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_11) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

Motor_4=0;

Motorb_In1=1; // 电机后信号

Motorb_In2=1; // 电机后信号

}

}

}

}

//电机后退停止

while(Motor_3||Motor_4); //检测运行气缸退两个标志位

Diswait();

}

/***************自动运行******************/

/***按启动进入自动运行程序显示启动********/

/***等待开模信号开模延时200毫秒气阀前进***/

/***************自动运行******************/

void Auto_Run()

{

DiStart(); //显示启动

Cylinder_Forword();

do

{

kstatus=0; //检测开模信号

for(;kstatus<10;) //输入端口循环5次

{

if(!INT_2) //输入端口低电平

{

kstatus++; //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_2) //输入端口高电平

{ //

kstatus=0; //按键计数器加一 状态标志归零

}

}

//开模信号 前后气缸开 加同时检测前进到位 信号

delay_ms(200); //延时200毫秒

OUT_1=0; //前气缸进

OUT_3=0; //后气缸进

Cylinder_1=1;

Cylinder_2=1;

do

{

if(Cylinder_1==1) //前气缸未复位

{

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_4) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_4) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

Cylinder_1=0;

OUT_1=1; //关前气缸

}

}

}

//前气缸进停止

if(Cylinder_2==1) //前气缸未复位

{

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_5) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_5) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

Cylinder_2=0;

OUT_3=1; //关后气缸

}

}

}

//后气缸进停止

}

while(Cylinder_1||Cylinder_2); // 循环

Wait_Machine(); //

kstatus=0;

for(;kstatus<10;) //输入端口循环5次

{

if(!INT_3) //输入端口低电平

{

kstatus++; //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_3) //输入端口高电平

{ //

kstatus=0; //按键计数器加一 状态标志归零

}

}

//等待机械手信号

Motor_Forword(); // 显示电机前进

Motora_In1=1; // 电机前信号

Motora_In2=0; // 电机前信号

Motorb_In1=1; // 电机后信号

Motorb_In2=0; // 电机后信号

Motor_1=1; //

Motor_2=1; //

do

{

if(Motor_1==1) //电机前进标志

{

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_6) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_6) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

Motor_1=0;

Motora_In1=1; // 电机前信号

Motora_In2=1; // 电机前信号

}

}

}

//前电机进停止

if(Motor_2==1)

{

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_7) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_7) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

Motor_2=0;

Motorb_In1=1; // 电机后信号

Motorb_In2=1; // 电机后信号

}

}

}

//后电机进停止

}

while(Motor_1||Motor_2); //或循环

Motor_Stop(); //显示电机停止

delay_ms(200);

dis_Val(8);

Cylinder_Back(); //显示气缸后退

OUT_2=0; //前气缸退

OUT_4=0; //后气缸退

Cylinder_3=1;

Cylinder_4=1;

do

{

if(Cylinder_3==1) //前气缸未复位

{

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_8) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_8) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

Cylinder_3=0;

OUT_2=1; //关前气缸

}

}

}

//前气缸退停止

if(Cylinder_4==1) //前气缸未复位

{

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_9) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_9) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

Cylinder_4=0;

OUT_4=1; //关后气缸

}

}

}

}

//后气缸退停止

while(Cylinder_3||Cylinder_4); //检测运行气缸退两个标志位

Motor_Back(); // 显示电机退

Motora_In1=0; // 电机前信号

Motora_In2=1; // 电机前信号

Motorb_In1=0; // 电机后信号

Motorb_In2=1; // 电机后信号

Motor_3=1; //

Motor_4=1; //

do

{

if(Motor_3==1) //前气缸未复位

{

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_10) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_10) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

Motor_3=0;

Motora_In1=1; // 电机前信号

Motora_In2=1; // 电机前信号

}

}

}

//电机前退停止

if(Motor_4==1) //前气缸未复位

{

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_11) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_11) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

Motor_4=0;

Motorb_In1=1; // 电机后信号

Motorb_In2=1; // 电机后信号

}

}

}

}

//电机后退停止

while(Motor_3||Motor_4); //检测运行气缸退两个标志位

delay_ms(200); //

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(~!KEY_5) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(!KEY_5) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

dis_Val(0); //退出自动循环

Auto_Flag=0;

Diswait();

}

}

}

while(Auto_Flag);

}

/******************** 主函数 **************************/

void main(void)

{

bit Run_Flag; //自动运行监测位

Run_Flag=0;

IO_int();

Initial_LY096BG30();

cleardisp();

Diswait();

red_eeprom();

RunTime_A++;

write_ee_S(IAP_ADDRES_S,RunTime_A);

dis_Val1(RunTime_A);

dis_Val2(RunTime_B);

if(RunTime_A<350)

Run_Flag=0;

else if(RunTime_A>350)

{

Run_Flag=1;

do

{

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

OUT_6=~OUT_6;

if(!INT_16) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

delay_ms(100);

}

else if(~!INT_16) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

delay_ms(1000);

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

OUT_6=0;

RunTime_A=0;

dis_Val1(RunTime_A);

write_ee_S(IAP_ADDRES_S,RunTime_A);

Run_Flag=0; //解锁 退出循环

delay_ms(100); //

}

}

}

while(Run_Flag);

}

while(1)

{

OUT_5=~OUT_5; //

delay_ms(50); //

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_1) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_1) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

dis_Val(1);

Auto_Run(); //

}

}

//开自动

RunLocal++; //1

dis_Val3(RunLocal);

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_12) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_12) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

OUT_1=0; //前气缸进

OUT_3=0; //后气缸进

Cylinder_Forword();

TwoCylinderForword();

}

}

//气缸进

RunLocal++; //2

dis_Val3(RunLocal);

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_13) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_13) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

OUT_2=0; //前气缸退

OUT_4=0; //后气缸退

Cylinder_Back(); //显示气缸后退

TwoCylinder_Back();

}

}

//气缸退

RunLocal++; //3

dis_Val3(RunLocal);

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_14) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_14) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

Motor_Forword(); // 显示电机前进

TwoMotor_Forword();

}

}

//电机进

RunLocal++; //4

dis_Val3(RunLocal);

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!INT_15) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!INT_15) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

Motor_Back(); // 显示电机退

TwoMotor_Back();

}

}

//电机退

RunLocal++; //5

dis_Val3(RunLocal);

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!KEY_1) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!KEY_1) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

RunTime_A++;

if(RunTime_A>999)

RunTime_A=0;

dis_Val1(RunTime_A);

write_ee_S(IAP_ADDRES_S,RunTime_A);

}

}

//计数加 //6

RunLocal++;

dis_Val3(RunLocal);

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!KEY_2) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!KEY_2) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

if(RunTime_A==0)

RunTime_A=999;

else

RunTime_A--;

dis_Val1(RunTime_A);

write_ee_S(IAP_ADDRES_S,RunTime_A);

}

}

//计数减

MARK=20; //7

dis_Val3(MARK);

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!KEY_3) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!KEY_3) //输入端口高电平

{

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

RunTime_A=0;

dis_Val1(RunTime_A);

write_ee_S(IAP_ADDRES_S,RunTime_A);

}

}

//归零

RunLocal++; //8

dis_Val3(RunLocal);

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!KEY_5) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!KEY_5) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

RunTime_B++;

if(RunTime_B>999)

RunTime_B=0;

dis_Val2(RunTime_B);

write_ee_M(IAP_ADDRES_M,RunTime_B);

}

}

//计数加

RunLocal++; //9

dis_Val3(RunLocal);

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!KEY_6) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!KEY_6) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

if(RunTime_B==0)

RunTime_B=999;

else

RunTime_B--;

dis_Val2(RunTime_B);

write_ee_M(IAP_ADDRES_M,RunTime_B);

}

}

//计数减

RunLocal++; //10

dis_Val3(RunLocal);

key_reset();

for(;kcounter<10;) //输入端口循环5次

{

if(!KEY_7) //输入端口低电平

{

Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一

}

else if(~!KEY_7) //输入端口高电平

{ //

Key_Clear(); //按键计数器加一 状态标志归零

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{

RunTime_B=0;

dis_Val2(RunTime_B);

write_ee_M(IAP_ADDRES_M,RunTime_B);

}

}

RunLocal=0;

dis_Val3(RunLocal);

//归零

}

} //L1786 CODE 7630 2026 5 30EEPROM

相关推荐
BT-BOX2 小时前
基于STM32物联网WiFi云平台温湿度烟雾报警器设计
stm32·嵌入式硬件·物联网
小慧10242 小时前
STM 32 TIM定时器(1)
单片机·嵌入式硬件
崇山峻岭之间13 小时前
单片机LCD实验
单片机·嵌入式硬件
m0_3771081414 小时前
STM32-adc
stm32·单片机·嵌入式硬件
【云轩】15 小时前
如何设计一台能模拟电机的电子负载:一个硬件工程师的实战笔记
笔记·嵌入式硬件
SmartRadio15 小时前
STM32WLE5 LoRa Smart TDMA 完整协议栈实现(工程级可直接编译)-【1】
javascript·stm32·单片机·嵌入式硬件·lora·自组网·smart tdma
Jason_zhao_MR17 小时前
纳秒级抖动×24小时零丢帧:RK3576工业级EtherCAT主站全拆解
大数据·人工智能·单片机·嵌入式
Deitymoon19 小时前
FreeRTOS——中断实验
stm32·单片机
嵌入式×边缘AI:打怪升级日志19 小时前
# 超声波测距 — HC-SR04 + 定时器输入捕获
单片机·定时器·超声波