#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(); //更新显示数据,
}
}
}