stm32三位计数显示器

设计一个计数显示器,可对生产流水线上物品或包装进行计数显示,用三位数码管显示计数,当计数达到某一设定值时,输出一个正脉冲包装命令(可用点亮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;//复位成功,计数值为零
         }  
    
  }
}

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值