设计一个计数显示器,可对生产流水线上物品或包装进行计数显示,用三位数码管显示计数,当计数达到某一设定值时,输出一个正脉冲包装命令(可用点亮LED灯模拟)。要求计数值可按键清零;设定值可通过按键修改。
#include "stm32f10x.h"
typedef unsigned int uint32t;
void SEG_GPIO_Config(void);//数码管GPIO初始化
void LED_GPIO_Config(void);//LED灯和按键GPIO初始化
void wei_GPIO_Config(void);//数码管位选择GPIO初始化
void show(int num); //数码管显示数据函数
void GPIO_NF(uint32t x);//LED灯控制开和灭函数
void select(int num1);//数码管位号选择显示函数,0各位显示,1十位显示
char num[3]={0x000b,0x000d,0x000E};//数码管位选择数据
//char num[3]={0x000E,0x000d,0x000b};//数码管位选择数据
u16 number[]={0xff3f,0xff06,0xff5b,0xff4f,0xff66,0xff6d,0xff7d,0xff07,0xff7f,0xff6f};//共阴极0到9显示数据
#define ON 1
#define OFF 0 //标志led开关操作数据
int jishu=0;//计数值初始化0
int sdjishuzhi=1;//计数设定值初始化最少1.
void SEG_GPIO_Config(void)//数码管GPIO初始化
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStruct);
}
void LED_GPIO_Config(void)//LED灯和按键GPIO初始化
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,&GPIO_InitStruct);
}
void wei_GPIO_Config(void)//数码管位选择GPIO初始化
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStruct);
}
void show(int num)//数码管显示数据
{
GPIO_Write(GPIOA,number[num]);//a端口写数据显示
}
void GPIO_NF(uint32t x)//LED灯控制开和灭
{
if(x) GPIO_ResetBits(GPIOB,GPIO_Pin_4);//开灯
else GPIO_SetBits(GPIOB, GPIO_Pin_4);//灭灯
}
void select(int num1)//数码管位号选择显示函数,0各位显示,1十位显示
{
GPIO_Write(GPIOC,num[num1]);//c端口写数据控制数码管显示操作
}
void delay (uint32t count)//延时操作函数
{
uint32t x=80000;
for(;count!=0;count--)
{
for(;x!=0;x--);
};
}
int main()
{
int z;
int rra[]={0,0,0};//存十位和各位数据的数组
int i=0;
SEG_GPIO_Config();
LED_GPIO_Config();
wei_GPIO_Config();//一系gpio列初始化
GPIO_NF(OFF);
while(1)
{
// jishu=943;
// z=jishu;
// for(int i=0;i<3;i++)
// {
// rra[i]=z%10;
// z=z/10;
// }
// for(int i=0;i<3;i++)//数码管依次显示操作
// {
// select(i);
// show( rra[i] );
// delay (900);
// }
z=jishu;
for(int i=0;i<3;i++)//存数字操作
{
rra[i]=z%10;
z=z/10;
}
for(int i=0;i<3;i++)//数码管依次显示操作
{
select(i);
show( rra[i] );
delay (900);
}
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0)==0) jishu++;//一号按键低电平模仿计数
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0)==0);//等待检测************************************完
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0) sdjishuzhi++;//二号按键加一增加设定值并显示操作
if(sdjishuzhi>=1000)sdjishuzhi=1; //按键值大于等于一百为最小设定值
z=sdjishuzhi;
for(int i=0;i<3;i++)
{
rra[i]=z%10;
z=z/10;
}
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0)//等待松开并持续显示设定值
{
for(int i=0;i<3;i++)//显示设定值
{
select(i);
show( rra[i] );
delay (900);
}
};
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2)==0) sdjishuzhi+=10;//三号按键加十增加设定值并显示操作
if(sdjishuzhi>=1000)sdjishuzhi=1; //按键值大于等于一百为最小设定值
z=sdjishuzhi;
for(int i=0;i<3;i++)
{
rra[i]=z%10;
z=z/10;
}
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2)==0)//等待松开并持续显示设定值
for(int i=0;i<3;i++)//显示设定值
{
select(i);
show( rra[i] );
delay (900);
};
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3)==0) //计数值复位0操作
{
jishu=0;
GPIO_NF(OFF);//灯灭操作
}
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3)==0);//等待松开
if(jishu==sdjishuzhi) //计数值等于设定值,灯亮,持续显示计数值并复位才能下次计数
{
GPIO_NF(ON);
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3)==1)//显示计数值等待复位
{
z=jishu;
for(int i=0;i<3;i++)
{
rra[i]=z%10;
z=z/10;
}
for(int i=0;i<3;i++)
{
select(i);
show( rra[i] );
delay (900);
}
};
jishu=0;//复位成功,计数值为零
}
}
}