51单片机LCD12864程序移植到STM32F103C


 


#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_exti.h"
/*****************LCD12864和LCD1206      GPIOA_Pin0-7为D0-D7********************/
#define RS_CLR         GPIO_ResetBits(GPIOC, GPIO_Pin_13)  //0
#define RS_SET         GPIO_SetBits(GPIOC, GPIO_Pin_13)    //1
#define RW_CLR         GPIO_ResetBits(GPIOC, GPIO_Pin_14)  //0
#define RW_SET         GPIO_SetBits(GPIOC, GPIO_Pin_14)    //1
#define EN_CLR         GPIO_ResetBits(GPIOC, GPIO_Pin_15)
#define EN_SET         GPIO_SetBits(GPIOC, GPIO_Pin_15)
#define PSB_CLR     GPIO_ResetBits(GPIOB, GPIO_Pin_0)
#define PSB_SET     GPIO_SetBits(GPIOB, GPIO_Pin_0)
#define RES_CLR     GPIO_ResetBits(GPIOB, GPIO_Pin_1)
#define RES_SET     GPIO_SetBits(GPIOB, GPIO_Pin_1)
/****************SolenoidValv输出,输出控制继电器(共5路)*******************/
#define SolenoidValveLeft1_CLR             GPIO_ResetBits(GPIOB, GPIO_Pin_15)
#define SolenoidValveLeft1_SET             GPIO_SetBits(GPIOB, GPIO_Pin_15)
#define SolenoidValveLeft2_CLR             GPIO_ResetBits(GPIOA, GPIO_Pin_8)
#define SolenoidValveLeft2_SET             GPIO_SetBits(GPIOA, GPIO_Pin_8)
#define SolenoidValveRight1_CLR            GPIO_ResetBits(GPIOA, GPIO_Pin_11)
#define SolenoidValveRight1_SET         GPIO_SetBits(GPIOA, GPIO_Pin_11)
#define SolenoidValveRight2_CLR            GPIO_ResetBits(GPIOA, GPIO_Pin_12)
#define SolenoidValveRight2_SET         GPIO_SetBits(GPIOA, GPIO_Pin_12)
#define SolenoidValve3_CLR                     GPIO_ResetBits(GPIOA, GPIO_Pin_15)
#define SolenoidValve3_SET                     GPIO_SetBits(GPIOA, GPIO_Pin_15)

/*******************中断按钮输入和按键指示灯*********************************/
//#define TimeAdd1                         EXTI_Line3            //有问题的

#define LED_ON                                             GPIO_SetBits(GPIOA, GPIO_Pin_10)        //按钮指示灯
#define LED_OFF                                         GPIO_ResetBits(GPIOA, GPIO_Pin_10)    //按钮指示灯

#define CloseTimeReduce_EXTI                EXTI_Line4                //左边关闭的时间增加        B4
#define OpenStopTimeAdd_EXTI                 EXTI_Line5                //左边打开的时间减少        B5
#define OpenStopTimeReduce_EXTI            EXTI_Line6              //左边打开的时间增加        B6
#define CloseTimeAdd_EXTI                        EXTI_Line7                //打开后停留的时间增加    B7
#define OpenTimeReduce_EXTI                    EXTI_Line8                //打开后停留的时间减少    B8
#define OpenTimeAdd_EXTI                         EXTI_Line9                //左边关闭的时间减少        B9
#define Zero_EXTI                                     EXTI_Line10                //清零                                    B10
#define Stop_EXTI                                     EXTI_Line11                //暂停                                    B11
#define LeftKey_EXTI                                EXTI_Line12                //左边遥控器输入                B12
#define RightKey_EXTI                                EXTI_Line13                //右边遥控器输入                B13
#define RightOpenTimeReduce_EXTI         EXTI_Line14                //备用(暂时用不到)            B14
/
#define CloseTimeReduceKey_0                GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)//读取按键CloseTimeReduce_0                     (B4)
#define OpenStopTimeAddKey_0                GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)//读取按键OpenStopTimeAdd_0                     (B5)
#define OpenStopTimeReduceKey_0            GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)//读取按键OpenStopTimeReduce_0             (B6)
#define CloseTimeAddKey_0                        GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)//读取按键CloseTimeAdd_0                         (B7)
#define OpenTimeReduceKey_0                    GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)//读取按键OpenTimeReduce_0                     (B8)
#define OpenTimeAddKey_0                        GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)//读取按键OpenTimeAdd_0                             (B9)
#define ZeroKey_0                                        GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)//读取按键Zero_0                                         (B10)
#define StopKey_0                                        GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)//读取按键Stop_0                                         (B11)
#define LeftKey_0                                      GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)//读取按键LeftKEY_0                                 (B12)
#define RightKey_0                                     GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)//读取按键RightKEY_0                                 (B13)
#define RightOpenTimeReduceKey_0         GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)//读取按键RightOpenTimeReduceKey_0  (B14)

#define CloseTimeReduceKey_Pres            1
#define OpenStopTimeAddKey_Pres            2
#define OpenStopTimeReduceKey_Pres    3
#define CloseTimeAddKey_Pres                4
#define OpenTimeReduceKey_Pres            5
#define OpenTimeAddKey_Pres                    6
#define ZeroKey_Pres                                7
#define StopKey_Pres                                8
#define LeftKey_Pres                                 9            
#define RightKey_Pres                                10        
#define RightOpenTimeReduceKey_Pres    11         
/**************************变量声明***************************************/
unsigned int  CloseStopTime=50;            //伸出后停留时间(OSTime)
unsigned int     CloseTime=200;                    //左边默认关闭延时时间
unsigned int     OpenTime=300;                        //左边默认打开延时时间

unsigned int     MostOpenTime=10000;            //最大打开延时时间
unsigned int     MostCloseTime=10000;        //最大关闭延时时间
int                         acc=0;                                    //显示当前运行的总次数
int                         mostacc=10000;                    //最大总次数
unsigned int     Auto=0;                                    //自动运行Auto的标志位
unsigned int     cca=0;                                    //暂停and开始的标志位
unsigned char table[ ]={"Freq :"};         //显示Freq :    显示在次数前面
unsigned char Open[ ] ={"Open :"};        //显示Open :    显示在Open时间的前面
unsigned char Close[ ]={"Close:"};        //显示Close:    显示在Close时间的前面
unsigned char Round[ ]={"ci"};                //显示ci            显示在次数的后面(也可以显示“次”)
unsigned char OSTime[ ] ={"OSTim:"};    //显示OSTime    显示在OSTime
unsigned char ms[ ] ={"ms"};                    //显示ms        
                    /*这个直接在函数里面写了*/    //显示ms            显示在所有时间的后面因为单位是毫秒    
/**************************函数声明***************************************/
void Delayms(u16);                                                    //延时ms
void Delayus(u16);                                                    //延时us
void SolenoidValve_GPIO_Configuration(void);//电磁阀GPIO初始化
void LCD12864_GPIO_Configuration(void);      //LCD12864GPIO初始化
void LED_GPIO_Configuration(void);                //按键指示灯LED初始化函数
void Key_Init(void);                                            //按键初始化函数
void EXTI_GPIO_Init4(void);                                //打开复用时钟PB4
void EXTI_GPIO_Init9_5(void);                                //打开复用时钟PB5, PB6,PB7,PB8,PB9
void EXTI_GPIO_Init15_10(void);                        //打开复用时钟PB10,PB11
void led(void);                                                        //按键LED指示灯函数
void Ziyunxing(void);                                            //运行
void LCD1602Init(void);                                        //LCD1602初始化
void xianshi(void);                                                //显示杂项
void xianshiOpen(void);                                        //显示Open
void xianshiClose(void);                                    //显示Close
void xianshiOpenStopTime(void);                        //显示OSTime
void disOpenTime(unsigned int x);                    //lcd写入数据5位
void disCloseTime(unsigned int x);                //lcd写入数据5位
void disOprTime(unsigned int x);                    //lcd写入数据5位
void disAcc(unsigned int x);                            //lcd写入数据5位
void GengXinLcd(void);                                        //更新LCD要显示的内容
void LeftOn(void);                                                //左边电磁阀和溢流阀运行函数
void RighttOn(void);                                            //右边电磁阀和溢流阀运行函数
void LeftAndRightOn(void);                                //左边右边电磁阀和溢流阀运行函数
/**************************延时***********************************/
void Delayms(u16 ms)
{                     
  u16 i=0;  
  while(ms--)   
  {  
    i=12000;  
    while(i--);  
  }  
} 
void Delayus(u16 us)
{
    u16 i=0;
    while(us--)
    {
        i=10;
        while(i--);
    }
}
/*************功能概要:SolenoidValve_GPIO初始化 电磁阀用到的GPIO初始化************/
void SolenoidValve_GPIO_Configuration()                                              
{
  GPIO_InitTypeDef GPIO_InitStructure;
    
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA |RCC_APB2Periph_AFIO, ENABLE);                          
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);                //把stm32 PB3 PB4 PA15作为普通IO使用
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE);                          
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
  GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE);                          
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
  GPIO_Init(GPIOC, &GPIO_InitStructure);
}

/***************************LCD12864_GPIO_Configuration初始化***********************************/
void LCD12864_GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure; 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE); //使能AFIO时钟    
//D0-D7
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3
                |GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //OD
  GPIO_Init(GPIOA, &GPIO_InitStructure);
//PSB,RES
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //OD
  GPIO_Init(GPIOB, &GPIO_InitStructure);
//RS,RW,EN
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
  GPIO_Init(GPIOC, &GPIO_InitStructure);
}
/***************LED_GPIO_Configuration初始化(按键反应指示灯)**********/
void LED_GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure; 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能AFIO时钟    
//按键灯LED
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //OD
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*****************打开复用时钟PB3,PB4********************/
void EXTI_GPIO_Init4(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;       //外部中断初始化
    GPIO_InitTypeDef GPIO_InitStructure;         
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);//使能AFIO时钟
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
    /******************配置EXTI_Line4**********************************/
    EXTI_ClearITPendingBit(EXTI_Line4);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource4);//PB4
    EXTI_InitStructure.EXTI_Line=EXTI_Line4;                                 //PB4,对应:EXTI_Line4
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       //中断事件
    EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Falling;   //下降沿触发
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;                                 //中断线使能
    EXTI_Init(&EXTI_InitStructure);                                             //配置

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);               //NVIC3
    NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;               //外部中断4
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢先优先级0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;               //子优先级2    
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;                 //使能
    NVIC_Init(&NVIC_InitStructure);                                                   //配置
}
/**************打开复用时钟PB5, PB6,PB7,PB8,PB9****************/
void EXTI_GPIO_Init9_5(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;   //外部中断初始化
    GPIO_InitTypeDef GPIO_InitStructure; 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);//使能AFIO时钟
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
    /******************配置EXTI_Line5**********************************/
    EXTI_ClearITPendingBit(EXTI_Line5);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource5);//PB5
    EXTI_InitStructure.EXTI_Line=EXTI_Line5;                                     //PB5,对应:EXTI_Line5
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;               //中断事件
    EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Falling;       //下降沿触发
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;                                      //中断线使能
    EXTI_Init(&EXTI_InitStructure);                                                 //配置
    /******************配置EXTI_Line6**********************************/
    EXTI_ClearITPendingBit(EXTI_Line6);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource6);//PB6
    EXTI_InitStructure.EXTI_Line=EXTI_Line6;                                     //PB6,对应:EXTI_Line6
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;           //中断事件
    EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Falling;          //下降沿触发
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;                                      //中断线使能
    EXTI_Init(&EXTI_InitStructure);                                                 //配置
    /******************配置EXTI_Line7**********************************/
    EXTI_ClearITPendingBit(EXTI_Line7);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource7);//PB3
    EXTI_InitStructure.EXTI_Line=EXTI_Line7;                                     //PB3,对应:EXTI_Line3
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;           //中断事件
    EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Falling;       //下降沿触发
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;                                      //中断线使能
    EXTI_Init(&EXTI_InitStructure);                                                 //配置
/******************配置EXTI_Line8**********************************/
    EXTI_ClearITPendingBit(EXTI_Line8);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource8);//PB3
    EXTI_InitStructure.EXTI_Line=EXTI_Line8;                                     //PB3,对应:EXTI_Line3
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;           //中断事件
    EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Falling;       //下降沿触发
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;                                      //中断线使能
    EXTI_Init(&EXTI_InitStructure);                                                 //配置
/******************配置EXTI_Line9**********************************/
    EXTI_ClearITPendingBit(EXTI_Line9);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource9);//PB9
    EXTI_InitStructure.EXTI_Line=EXTI_Line9;                                     //PB9,对应:EXTI_Line9
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;           //中断事件
    EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Falling;       //下降沿触发
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;                                      //中断线使能
    EXTI_Init(&EXTI_InitStructure);                                                 //配置
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);                   //NVIC2
    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;               //外部中断2
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;     //抢先优先级0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;                   //子优先级2    
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;                     //使能
    NVIC_Init(&NVIC_InitStructure);                                                       //配置
}
/*****************打开复用时钟PB10,PB11********************/
void EXTI_GPIO_Init15_10(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;   //外部中断初始化
    GPIO_InitTypeDef GPIO_InitStructure; 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);//使能AFIO时钟
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
    /******************配置EXTI_Line10**********************************/
    EXTI_ClearITPendingBit(EXTI_Line10);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource10);//PB10
    EXTI_InitStructure.EXTI_Line=EXTI_Line10;                                 //PB10,对应:EXTI_Line10
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       //中断事件
    EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Falling;   //下降沿触发
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;                                 //中断线使能
    EXTI_Init(&EXTI_InitStructure);                                             //配置
    /******************配置EXTI_Line11**********************************/
    EXTI_ClearITPendingBit(EXTI_Line11);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource11);//PB11
    EXTI_InitStructure.EXTI_Line=EXTI_Line11;                                 //PB11,对应:EXTI_Line11
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       //中断事件
    EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Falling;   //下降沿触发
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;                                 //中断线使能
    EXTI_Init(&EXTI_InitStructure);                                             //配置
    /******************配置EXTI_Line12**********************************/
    EXTI_ClearITPendingBit(EXTI_Line12);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource12);//PB12
    EXTI_InitStructure.EXTI_Line=EXTI_Line12;                                 //PB12,对应:EXTI_Line12
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       //中断事件
    EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Falling;   //上下降沿触发
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;                                 //中断线使能
    EXTI_Init(&EXTI_InitStructure);                                             //配置
        /******************配置EXTI_Line13**********************************/
    EXTI_ClearITPendingBit(EXTI_Line13);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource13);//PB13
    EXTI_InitStructure.EXTI_Line=EXTI_Line13;                                 //PB13,对应:EXTI_Line13
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       //中断事件
    EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Falling;   //上下降沿触发
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;                                 //中断线使能
    EXTI_Init(&EXTI_InitStructure);                                             //配置
        /******************配置EXTI_Line14**********************************/
    EXTI_ClearITPendingBit(EXTI_Line14);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);//PB14
    EXTI_InitStructure.EXTI_Line=EXTI_Line14;                                 //PB14,对应:EXTI_Line14
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       //中断事件
    EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Falling;   //下降沿触发
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;                                 //中断线使能
    EXTI_Init(&EXTI_InitStructure);                                             //配置

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);               //NVIC3
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;       //外部中断15_10
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢先优先级0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;               //子优先级2    
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;                 //使能
    NVIC_Init(&NVIC_InitStructure);                                                   //配置
}
/*************:LCD12864 写指令***************************************/
void LcdWriteCom(unsigned char com)
{
    Delayus(300);
    GPIOA->ODR=com;
    RS_CLR;
    RW_CLR;
    EN_CLR;
    Delayus(5);
    EN_SET;
    Delayus(5);
    EN_CLR;
    Delayus(5);
}
/************:LCD12864写数据***************************************/
void LcdWriteDate(unsigned char date)
{
//    while(LCD_Check_Busy());
    Delayus(300);
    GPIOA->ODR=date;
    RS_SET;
    RW_CLR;
    EN_CLR;
    Delayus(5);
    EN_SET;
    Delayus(5);
    EN_CLR; 
    Delayus(5);    
}
/********** :LCD12864初始化*****************************************/
void LCD1602Init(void)
{
    LcdWriteCom(0x38);  //设置16*2显示,8位数据接口

     RES_CLR;  
     Delayms(2);  
     RES_SET;  
     Delayms(2);  
      
     PSB_SET;                      //当PSB=1,设置为并行数据模式
     Delayms(2);   
     LcdWriteCom(0x30);  //选择基本指令集,和,8位数据模式
     Delayms(2);  
     LcdWriteCom(0x0c);  //开显示,无游标,不反白 
     Delayms(2);   
     LcdWriteCom(0x01);  //清除显示,并将DDRAM的地址计数器AC设为00H.  
     Delayms(2);  
     LcdWriteCom(0x06);  //设置,外部读写数据后,地址计数器AC会自动加1 
     Delayms(2);  
     LcdWriteCom(0x80);  //将DDRAM 的地址计数器 AC 设为 0.  
     Delayms(2); 
} 
/***********设置显示位置,以下是光标定位函数*********************/  
void Position(u8 X, u8 Y)   
{  
   switch(X){  
      case 1: LcdWriteCom(0x80+Y); break;  
      case 2: LcdWriteCom(0x90+Y); break;  
      case 3: LcdWriteCom(0x88+Y); break;  
      case 4: LcdWriteCom(0x98+Y); break;  
    }  
} 
/*********************LCD12864显示"Frequency:(或者"次数:")" 和"MS"**********************/
void xianshi(void)
{
        unsigned char index,index1;
    //已运行次数
        LcdWriteCom(0x80);
        for(index=0;index<6;index++)
        {
            LcdWriteDate(table[index]);  //写入数据             
        }
        Delayus(5);
    //显示“ci”
        LcdWriteCom(0x80+0x07);
        for(index1=0;index1<2;index1++)
        {
            LcdWriteDate(Round[index1]);  //写入数据             
        }
        //显示ms
        LcdWriteCom(0x90+0x7);
        for(index1=0;index1<2;index1++)
        {
            LcdWriteDate(ms[index1]);  //写入数据             
        }
        LcdWriteCom(0x88+0x7);
        for(index1=0;index1<2;index1++)
        {
            LcdWriteDate(ms[index1]);  //写入数据             
        }
        LcdWriteCom(0x98+0x7);
        for(index1=0;index1<2;index1++)
        {
            LcdWriteDate(ms[index1]);  //写入数据             
        }
}

/*************************LCD12864显示Open****************************************/
void xianshiOpen(void)
{
        unsigned char index;
        LcdWriteCom(0x98);
        for(index=0;index<6;index++)
        {
            LcdWriteDate(Open[index]);  //写入数据             
        }
}
/*****************************LCD12864显示Close****************************************/
void xianshiClose(void)
{
        unsigned char index;
        LcdWriteCom(0x88);
        for(index=0;index<6;index++)
        {
            LcdWriteDate(Close[index]);  //写入数据             
        }
}
/*****************************LCD12864显示OpenStopTime****************************************/
void xianshiOpenStopTime(void)
{
        unsigned char index;
        LcdWriteCom(0x90);
        for(index=0;index<6;index++)
        {
            LcdWriteDate(OSTime[index]);  //写入数据             
        }
}
/*****************************LCD12864显示运行次数Acc************************************/
void disAcc(unsigned int x)
{
                unsigned char a[]={"000000"}; //定义字符数组显示数字
        unsigned char shiwan,wan,qian,bai,shi,ge,index;
                shiwan=x/100000;
                wan=x%100000/10000;
        qian=x%100000%10000/1000;
        bai=x%100000%10000%1000/100;
        shi=x%100000%10000%1000%100/10;
        ge=x%100000%10000%1000%100%10;

                a[0]=shiwan;
        a[1]=wan;
                a[2]=qian;
                a[3]=bai;
                a[4]=shi;
                a[5]=ge;
                LcdWriteCom(0x80+0x03);
                for(index=0;index<6;index++)
                {
                    LcdWriteDate(0x30+a[index]);  //写入数据             
                }
}

/*****************************LCD12864显示间隔时间OpenTime****************************************/
void disOpenTime(unsigned int x)
{
                unsigned char a[]={"00000"}; //定义字符数组显示数字
        unsigned char wan,qian,bai,shi,ge,index;
                wan=x/10000;
        qian=x%10000/1000;
        bai=x%10000%1000/100;
        shi=x%10000%1000%100/10;
        ge=x%10000%1000%100%10;
                
                a[0]=wan;
                a[1]=qian;
                a[2]=bai;
                a[3]=shi;
                a[4]=ge;
                LcdWriteCom(0x98+0x03);
                for(index=0;index<5;index++)
                {
                    LcdWriteDate(0x30+a[index]);  //写入数据             
                }
}
/*****************************LCD12864显示间隔时间CloseTime****************************************/
void disCloseTime(unsigned int x)
{
           unsigned char a[]={"00000"}; //定义字符数组显示数字
        unsigned char wan,qian,bai,shi,ge,index;
                wan=x/10000;
        qian=x%10000/1000;
        bai=x%10000%1000/100;
        shi=x%10000%1000%100/10;
        ge=x%10000%1000%100%10;

        a[0]=wan;
                a[1]=qian;
                a[2]=bai;
                a[3]=shi;
                a[4]=ge;
                LcdWriteCom(0x88+0x03);
                for(index=0;index<5;index++)
                {
                    LcdWriteDate(0x30+a[index]);  //写入数据             
                }
}
/*****************************LCD12864显示间隔时间OprTime****************************************/
void disOprTime(unsigned int x)
{
           unsigned char a[]={"00000"}; //定义字符数组显示数字
        unsigned char wan,qian,bai,shi,ge,index;
                wan=x/10000;
        qian=x%10000/1000;
        bai=x%10000%1000/100;
        shi=x%10000%1000%100/10;
        ge=x%10000%1000%100%10;
                a[0]=wan;
                a[1]=qian;
                a[2]=bai;
                a[3]=shi;
                a[4]=ge;
                LcdWriteCom(0x90+0x03);
                for(index=0;index<5;index++)
                {
                    LcdWriteDate(0x30+a[index]);  //写入数据             
                }
}
/*****************************************按键led指示灯函数************************************/
void led()
{
    LED_ON;
    Delayms(50);
    LED_OFF;
}
/*********************************更新显示数据**********************************/
void GengXinLcd(void)
{
    Delayms(50);
    /**********************************************************/
    disAcc(acc);                                    //显示总次数
    xianshi();                                         //显示杂项
    /*************************reset*************************/
    disOpenTime(OpenTime);                //显示延时时间OpenTime
    disCloseTime(CloseTime);            //显示延时时间CloseTime
    xianshiOpen();                                //显示字体Open
    xianshiClose();                                //显示字体Close
    xianshiOpenStopTime();                //显示字体OpenStop
    disOprTime(CloseStopTime);        //显示伸出停留时间OprTime
}
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//返回值:
//0,没有任何按键按下
u8 KEY_Scan(u8 mode)
{     
    static u8 key_up=1;//按键按松开标志
    if(mode)key_up=1;  //支持连按          
    if(key_up&&(CloseTimeReduceKey_0==0||OpenStopTimeAddKey_0==0||OpenStopTimeReduceKey_0==0||CloseTimeAddKey_0==0||OpenTimeReduceKey_0==0||OpenTimeAddKey_0==0||ZeroKey_0==0||StopKey_0==0||LeftKey_0==0||RightKey_0==0||RightOpenTimeReduceKey_0==0))
    {
        Delayms(5);//去抖动 
        key_up=0;
        if(CloseTimeReduceKey_0==0)
            return CloseTimeReduceKey_Pres;
        else if(OpenStopTimeAddKey_0==0)
            return OpenStopTimeAddKey_Pres;
        else if(OpenStopTimeReduceKey_0==0)
            return OpenStopTimeReduceKey_Pres;
        else if(CloseTimeAddKey_0==0)
            return CloseTimeAddKey_Pres;
        else if(OpenTimeReduceKey_0==0)
            return OpenTimeReduceKey_Pres;
        else if(OpenTimeAddKey_0==0)
            return OpenTimeAddKey_Pres;
        else if(ZeroKey_0==0)
            return ZeroKey_Pres;
        else if(StopKey_0==0)
            return StopKey_Pres;    
        else if(LeftKey_0==0)                        
            return LeftKey_Pres;
        else if(RightKey_0==0)
            return RightKey_Pres;
        else if(RightOpenTimeReduceKey_0==0)
            return RightOpenTimeReduceKey_Pres; 
    }    
    else if(CloseTimeReduceKey_0==1||OpenStopTimeAddKey_0==1||OpenStopTimeReduceKey_0==1||CloseTimeAddKey_0==1||OpenTimeReduceKey_0==1||OpenTimeAddKey_0==1||ZeroKey_0==1||StopKey_0==1||LeftKey_0==1||RightKey_0==1||RightOpenTimeReduceKey_0==1)key_up=1;          
        return 0;// 无按键按下
}
/***********************左边输出,同时泄压的函数*******************************/
void LeftOn(void)
{
    SolenoidValveLeft1_CLR;            //左1关闭
    SolenoidValveLeft2_SET;            //左2打开
    SolenoidValveRight1_CLR;        //右1关闭
    SolenoidValveRight2_CLR;        //右2关闭
    SolenoidValve3_SET;                    //溢流阀打开

    Delayms(CloseTime);                    //关闭延时
    SolenoidValveLeft1_CLR;
    SolenoidValveLeft2_CLR;
    SolenoidValveRight1_CLR;
    SolenoidValveRight2_CLR;
    SolenoidValve3_CLR;                        //溢流阀关闭

    Delayms(CloseTime);                        //左边关闭延时
/*************************************************************/
    SolenoidValveLeft1_SET;                //左1打开
    SolenoidValveLeft2_CLR;                //左2关闭
    SolenoidValveRight1_CLR;            //右1关闭
    SolenoidValveRight2_CLR;            //右2关闭
    SolenoidValve3_SET;                        //溢流阀打开

    Delayms(OpenTime);                        //打开延时
    
    SolenoidValveLeft1_CLR;                //左1关闭
    SolenoidValveLeft2_CLR;                //左2关闭
    SolenoidValveRight1_CLR;                //右1关闭
    SolenoidValveRight2_CLR;                //右2关闭
    SolenoidValve3_CLR;                //溢流阀关闭

    Delayms(CloseStopTime);        //伸出停留的时间(OSTime)
    /*************************set****************************/
    acc+=1;                                        //每运行1次就加1
}
/***********************右边输出,同时泄压的函数*******************************/
void RightOn(void)
{
    SolenoidValveLeft1_CLR;            //左1关闭
    SolenoidValveLeft2_CLR;            //左1关闭
    SolenoidValveRight1_CLR;        //右1关闭
    SolenoidValveRight2_SET;        //右2打开
    SolenoidValve3_SET;                    //溢流阀打开

    Delayms(CloseTime);                    //关闭延时
    SolenoidValveLeft1_CLR;
    SolenoidValveLeft2_CLR;
    SolenoidValveRight1_CLR;
    SolenoidValveRight2_CLR;
    SolenoidValve3_CLR;                        //溢流阀关闭

    Delayms(CloseTime);                        //左边关闭延时
/*************************************************************/
    SolenoidValveLeft1_CLR;                //左1关闭
    SolenoidValveLeft2_CLR;                //左2关闭
    SolenoidValveRight1_SET;            //右1打开
    SolenoidValveRight2_CLR;            //右2关闭
    SolenoidValve3_SET;                        //溢流阀打开

    Delayms(OpenTime);                        //打开延时
    
    SolenoidValveLeft1_CLR;                //左1关闭
    SolenoidValveLeft2_CLR;                //左2关闭
    SolenoidValveRight1_CLR;                //右1关闭
    SolenoidValveRight2_CLR;                //右2关闭
    SolenoidValve3_CLR;                //溢流阀关闭

    Delayms(CloseStopTime);        //伸出停留的时间(OSTime)
    /*************************set****************************/
    acc+=1;                                        //每运行1次就加1
}
/***********************右边输出,同时泄压的函数*******************************/
void LeftAndRightOn(void)
{
    SolenoidValveLeft1_CLR;            //左1关闭
    SolenoidValveLeft2_SET;            //左1打开
    SolenoidValveRight1_CLR;        //右1关闭
    SolenoidValveRight2_SET;        //右2打开
    SolenoidValve3_SET;                    //溢流阀打开

    Delayms(CloseTime);                    //关闭延时
    SolenoidValveLeft1_CLR;
    SolenoidValveLeft2_CLR;
    SolenoidValveRight1_CLR;
    SolenoidValveRight2_CLR;
    SolenoidValve3_CLR;                        //溢流阀关闭

    Delayms(CloseTime);                        //左边关闭延时
/*************************************************************/
    SolenoidValveLeft1_SET;                //左1关闭
    SolenoidValveLeft2_CLR;                //左2关闭
    SolenoidValveRight1_SET;            //右1打开
    SolenoidValveRight2_CLR;            //右2关闭
    SolenoidValve3_SET;                        //溢流阀打开

    Delayms(OpenTime);                        //打开延时
    
    SolenoidValveLeft1_CLR;                //左1关闭
    SolenoidValveLeft2_CLR;                //左2关闭
    SolenoidValveRight1_CLR;                //右1关闭
    SolenoidValveRight2_CLR;                //右2关闭
    SolenoidValve3_CLR;                //溢流阀关闭

    Delayms(CloseStopTime);        //伸出停留的时间(OSTime)
    /*************************set****************************/
    acc+=1;                                        //每运行1次就加1
}
/**************************中断3好像用不了**********************************/
/*
void EXTI3_IRQHandler(void)            //:EXTI3 增加回来的Time
{        
    if(EXTI_GetITStatus(EXTI_Line3) != RESET)    //TimeJian
  {
            led();
            CloseTime-=100;
         //判断间隔时间的最大最小值
        if(CloseTime<=100)
        {
            CloseTime=100;
        }
    EXTI_ClearITPendingBit(EXTI_Line3);        //清除标志位
    }
}*/
/***************************************外部中断EXTI4*****************************************/
void EXTI4_IRQHandler(void)                                        
{        
     if(EXTI_GetITStatus(CloseTimeReduce_EXTI) != RESET)                            //判断是否按下了CloseTimeReduce按钮(即左C+)
   {
            Delayms(5);//延时消抖动
            if(CloseTimeReduceKey_0==0)    
            {
                led();
                CloseTime-=50;
                //判断间隔时间的最大最小值
                if(CloseTime<=50)
                {
                    CloseTime=50;
                }
                //GengXinLcd();                                    //更新显示数据,
                while(CloseTimeReduceKey_0==0);                                //松手检测
            }
            EXTI_ClearITPendingBit(CloseTimeReduce_EXTI);            //清除标志位
   }
}
/**********************外部中断EXTI9_5****************************/
void EXTI9_5_IRQHandler(void)                                        
{                
     if(EXTI_GetITStatus(OpenTimeReduce_EXTI) != RESET)                                //判断是否按下了OpenTimeReduce按钮(即左O-)
   {
            Delayms(5);                                                                                                    //延时消抖动
            if(OpenTimeReduceKey_0==0)                            //再次确认
            {
                led();                                                                                                            //指示灯
                OpenTime-=50;                                                                                    //LeftOpenTime减少                    
                if(OpenTime<=50)                                        //判断间隔时间的最大最小值
                {
                    OpenTime=50;
                }
                //GengXinLcd();                                    //更新显示数据,
                while(OpenTimeReduceKey_0==0);                                //松手检测
            }
            EXTI_ClearITPendingBit(OpenTimeReduce_EXTI);                                    //清除标志位
   }
     
    if(EXTI_GetITStatus(OpenTimeAdd_EXTI) != RESET)                    //判断是否按下了OpenTimeAdd按钮(即左O+)
    {
        Delayms(5);//延时消抖动
        if(OpenTimeAddKey_0==0)            
        {        
            led();
            OpenTime+=50;
            if(OpenTime>=MostOpenTime)
            {
                OpenTime=MostOpenTime;
            }
            //GengXinLcd();                                    //更新显示数据,
            while(OpenTimeAddKey_0==0);                                //松手检测
        }
        EXTI_ClearITPendingBit(OpenTimeAdd_EXTI);            
  }
    if(EXTI_GetITStatus(OpenStopTimeAdd_EXTI) != RESET)                    //检测到OpenStopTimeAdd按下(即OST+)
  {
        Delayms(5);//延时消抖动
        if(OpenStopTimeAddKey_0==0)                //再次确认
        {
            led();
            CloseStopTime+=50;                                                                    //+100ms
            if(CloseStopTime>=MostOpenTime)                                            //最大时间
            {
                CloseStopTime=MostOpenTime;                                                //判断是否大于最大时间
            }
            //GengXinLcd();                                    //更新显示数据,
            while(OpenStopTimeAddKey_0==0);                                //松手检测
        }
        EXTI_ClearITPendingBit(OpenStopTimeAdd_EXTI);                        //清除标志位
  }
    if(EXTI_GetITStatus(OpenStopTimeReduce_EXTI) != RESET)        //检测到OpenStopTimeReduce按下(即OST-)
  {
        Delayms(5);//延时消抖动
        if(OpenStopTimeReduceKey_0==0)    //再次确认
        {
            led();
            CloseStopTime-=50;                                                            //-100ms
            if(CloseStopTime<=50)                                                    //最少时间
            {
                CloseStopTime=50;                                                
            }
            //GengXinLcd();                                    //更新显示数据,
            while(OpenStopTimeReduceKey_0==0);                                //松手检测
        }
        EXTI_ClearITPendingBit(OpenStopTimeReduce_EXTI);            //清除标志位 
  }
    if(EXTI_GetITStatus(CloseTimeAdd_EXTI) != RESET)                //判断是否按下了CloseTimeReduce按钮(即左C-)    
  {
            Delayms(5);                                                                //延时消抖动
            if(CloseTimeAddKey_0==0)//再次确认
            {            
                led();                                                                        //指示灯
                CloseTime+=50;                                                        //LeftCloseTime增加
                if(CloseTime>=MostCloseTime)                            //判断是否超过最大值
                {
                    CloseTime=MostCloseTime;                                //最大值
                }
                //GengXinLcd();                                    //更新显示数据,
                while(CloseTimeAddKey_0==0);                                //松手检测
            }
            EXTI_ClearITPendingBit(CloseTimeAdd_EXTI);            //清除标志位
    }
}
/***************************************外部中断EXTI15_10*****************************************/
void EXTI15_10_IRQHandler(void)                                        
{        
     if(EXTI_GetITStatus(RightOpenTimeReduce_EXTI) != RESET)                                //判断是否按下了备用按钮
   {
            Delayms(5);                                                                    
            if(RightOpenTimeReduceKey_0==0)                        
            {
                led();                                                                                                            //指示灯                                                
                Auto+=1;                                                                            
                if(Auto==10)
                {
                    Auto=0;
                }
                while(RightOpenTimeReduceKey_0==0);                                //松手检测
            }
            EXTI_ClearITPendingBit(RightOpenTimeReduce_EXTI);                                //清除标志位
   }
     if(EXTI_GetITStatus(Zero_EXTI) != RESET)                                //判断是否按下了Zero按钮
   {
            Delayms(5);                                                                    
            if(ZeroKey_0==0)                    
            {
                led();                                                                            //指示灯
                acc=0;                                                                            //清零
                //GengXinLcd();                                                                //更新显示数据,
                while(ZeroKey_0==0);                                                //松手检测
            }
            EXTI_ClearITPendingBit(Zero_EXTI);                        //清除标志位
   }
     if(EXTI_GetITStatus(Stop_EXTI) != RESET)                    //判断是否按下了Stop按钮
   {
            Delayms(5);                                                                    
            if(StopKey_0==0)                    
            {
                led();                                                                            //指示灯
                cca+=1;                                                                            
                if(cca==10)
                {
                    cca=0;
                }
                while(StopKey_0==0);                                //松手检测
            }
            EXTI_ClearITPendingBit(Stop_EXTI);                                //清除标志位
   }
     if(EXTI_GetITStatus(LeftKey_EXTI)!= RESET)    //判断是否按下了LeftKey按钮
   {
            Delayms(3); 
            if(LeftKey_0==0)                                                //再次确认
            {
                cca=0;                                                                //自动标志位关闭 为0
                Delayms(50);    
                if(RightKey_0==0)                                            //判断是否同时按下了RightKey0
                {
                    led();                                                            //指示灯
                    LeftAndRightOn();                                        //左右边输出,同时泄压的函数
                    while(RightKey_0==0);                                //松手标志
                }
                else                                                                    //如果只按下了LeftKey0
                {
                    led();                                                            //指示灯
                    LeftOn();                                                        //左边输出,同时泄压的函数
                    while(LeftKey_0==0);                                    //松手检测
                }
            }
            EXTI_ClearITPendingBit(LeftKey_EXTI);        //清除标志位
   }
     if(EXTI_GetITStatus(RightKey_EXTI)!= RESET)//判断是否按下了RightKey按钮
   {    
            Delayms(3);
            if(RightKey_0==0)                                                //再次确认
            {
                cca=0;                                                                //自动标志位关闭 为0
                Delayms(50);
                if(LeftKey_0==0)                                            //判断是否同时按下了LeftKey0
                {
                    led();                                                            //指示灯
                    LeftAndRightOn();                                        //左右边输出,同时泄压的函数
                    while(LeftKey_0==0);                                    //松手标志
                }
                else                                                                    //如果只按下了RightKey0
                {
                    led();                                                            //指示灯
                    RightOn();                                                    //左边输出,同时泄压的函数
                    while(RightKey_0==0);                                //松手检测
                }
            }
            EXTI_ClearITPendingBit(RightKey_EXTI);    //清除标志位
   }
}

/******************************自动运行函数********************************/
void Ziyunxing(void)
{
/*************************reset*************************/
    //电磁阀3 4
    SolenoidValveLeft1_CLR;            //左1关闭
    SolenoidValveLeft2_SET;            //左1打开
    SolenoidValveRight1_CLR;        //右1关闭
    SolenoidValveRight2_SET;        //右2打开
    SolenoidValve3_SET;                    //溢流阀打开

    Delayms(CloseTime);                    //关闭延时
    SolenoidValveLeft1_CLR;
    SolenoidValveLeft2_CLR;
    SolenoidValveRight1_CLR;
    SolenoidValveRight2_CLR;
    SolenoidValve3_CLR;                        //溢流阀关闭
    Delayms(CloseTime);                        //左边关闭延时
/*************************************************************/
    //电磁阀1 2
    SolenoidValveLeft1_SET;                //左1打开
    SolenoidValveLeft2_CLR;                //左2关闭
    SolenoidValveRight1_SET;            //右1打开
    SolenoidValveRight2_CLR;            //右2关闭
    SolenoidValve3_SET;                        //溢流阀打开
    
    Delayms(OpenTime);                        //打开延时
    
    SolenoidValveLeft1_CLR;                //左1关闭
    SolenoidValveLeft2_CLR;                //左2关闭
    SolenoidValveRight1_CLR;                //右1关闭
    SolenoidValveRight2_CLR;                //右2关闭
    SolenoidValve3_CLR;                //溢流阀关闭

    Delayms(CloseStopTime);        //伸出停留的时间(OSTime)
/*************************set****************************/
    acc+=1;                                        //每运行1次就加1
}
/**************************主函数******************************************/
int main(void)
{
    SolenoidValve_GPIO_Configuration();      //电磁阀GPIO初始化
    LcdWriteCom(0xe2);        //reset
    Delayms(100);                    //延时一段时间时间,等待LCD1602稳定
    LCD12864_GPIO_Configuration();                 //LCD  GPIO初始化
    acc=0;                                                                //这个变量是运行的次数
    EXTI_GPIO_Init15_10();                                //外部中断15_10初始化
    EXTI_GPIO_Init9_5();                                    //外部中断9_5初始化
    EXTI_GPIO_Init4();                                        //外部中断4初始化
    LCD1602Init();                                                //lcd1206初始化
    Delayms(10);                                                    //延时一段时间时间,等待LCD1602稳定
    while(1)
    {
        while(1)
        {
            GengXinLcd();                                    //更新显示数据,
            /***************************备用功能****************************************/
            /*if(Auto%2==1)                                //判断是否按下自运行(备用)
            {
                while(1)
                {
                    LED_ON;                                        //指示灯
                    if(Auto%2==0)break;                //开始
                            //
                }
            }*/
            /*************************自动检测板子功能**********************************/
            if(cca%2==1)                                    //判断是否按下暂停
            {
                while(1)
                {
                    LED_ON;                                        //指示灯
                    if(cca%2==0)break;                //开始
                    GengXinLcd();                            //更新显示数据,
                    Ziyunxing();                            //自运行
                }
            }
            if(acc>=mostacc)break;                 //到达最大次数
        }
        while(1)                                                //次数到了后
        {
            LED_ON;                                                //指示灯
            if(acc>=0&acc<mostacc)break;     //判断是否 清零了,跳出循环 重新开始运行
            GengXinLcd();                                    //更新显示数据,
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_35831134/article/details/90290583