proteus 仿真-STM32F103C8T6驱动四位数码管


STM32F103C8T6 介绍

 

 

STM32F103C8T6 是意法半导体(STMicroelectronics)推出的一款高性能、低功耗的32位微控制器,属于STM32F1系列。
它广泛应用于嵌入式系统开发,适用于需要高性能处理、低功耗和丰富外设接口的场景。以下是关于STM32F103C8T6的详细介绍:

1. 基本特性

  • 处理器:ARM Cortex-M3 32位RISC处理器,主频最高可达72MHz。
  • 存储器:
    • 闪存(Flash):64KB。
    • SRAM:20KB。
    • EEPROM:支持外部EEPROM。
  • 工作电压:2.0V至3.6V。
  • 工作温度:-40°C至85°C(工业级)。

2. 外设接口

  • GPIO:
    • 提供多个GPIO引脚,支持多种工作模式(输入、输出、中断、复用功能等)。
  • 通信接口:
    • USART:3个USART接口。
    • SPI:2个SPI接口。
    • I2C:2个I2C接口。
    • CAN:1个CAN接口。
    • USB:支持USB 2.0全速设备。
  • 定时器:
    • 通用定时器:多个通用定时器,支持PWM输入/输出、捕获/比较功能。
    • 高级定时器:支持多通道PWM输出,适用于电机控制。
  • ADC和DAC:
    • ADC:12位模数转换器,支持多通道采样。
    • DAC:2通道12位数模转换器。
  • 其他外设:
    • 外部中断/事件控制器(EXTI)。
    • 看门狗定时器(WDT)。
    • 窗口看门狗定时器(WWDT)。
    • DMA控制器。

3. 低功耗特性

  • 多种低功耗模式:
    • 睡眠模式:CPU暂停运行,外设可继续工作。
    • 停机模式:仅保留基本时钟和少量外设。
    • 待机模式:最低功耗模式,仅保留唤醒功能。
  • 低功耗外设:支持低功耗运行的ADC、定时器等。

4. 开发工具

  • 集成开发环境(IDE):
    • Keil uVision:广泛使用的商业IDE,支持STM32开发。
    • STM32CubeIDE:ST公司官方提供的免费IDE,支持代码生成、调试等功能。
  • 编译器:
    • ARM Compiler:用于编译C/C++代码。
    • GCC for ARM:开源编译器,适用于嵌入式开发。
  • 调试工具:
    • ST-Link:ST公司提供的调试器,支持硬件调试和代码下载。
    • J-Link:第三方调试器,支持多种调试功能。

5. 应用领域

  • 工业自动化:电机控制、传感器数据采集。
  • 物联网(IoT):智能设备、传感器节点。
  • 消费电子:智能家居、穿戴设备。
  • 医疗设备:便携式医疗设备、健康监测设备。
  • 汽车电子:车载娱乐系统、传感器接口。

6. 开发资源

  • 官方文档:ST公司提供了详细的参考手册、数据手册和应用笔记。
  • 开发板:如STM32F103C8T6开发板,方便快速开发和测试。
  • 社区支持:丰富的在线社区资源,包括开发教程、代码示例和问题解答。

7. 优势

  • 高性能:Cortex-M3内核提供高性能处理能力。
  • 低功耗:多种低功耗模式,适合电池供电设备。
  • 丰富的外设:支持多种通信接口和外设,满足多种应用场景。
  • 开发友好:强大的开发工具支持,易于上手。

数码管介绍

 

码管是一种用于显示数字的电子元件,广泛应用于各种电子设备中,如电子表、计算器、电子秤等。以下是关于数码管的详细介绍,包括其类型、工作原理、引脚定义以及如何与微控制器(如STM32)连接和控制。

1. 数码管的类型
数码管主要分为两种类型:共阳极和共阴极。
(1)共阳极数码管
• 特点:所有段的阳极(正极)连接在一起,通过控制阴极(负极)来点亮对应的段。
• 优点:适合使用NPN型三极管或低电平驱动的电路。
• 缺点:在某些情况下,需要额外的电平转换电路。
(2)共阴极数码管
• 特点:所有段的阴极(负极)连接在一起,通过控制阳极(正极)来点亮对应的段。
• 优点:适合使用PNP型三极管或高电平驱动的电路,直接与微控制器连接时较为方便。
• 缺点:在某些情况下,需要额外的电平转换电路。

2. 数码管的引脚定义
数码管通常有8个段(a-g和DP),分别对应数字的各个部分。以下是数码管的引脚定义:

 

延时函数

void delay100(int xms)
{
    while(xms--);
}    

 

段码代码实现

复制代码
unsigned char code[] ={0xC0, 0x79,0x24, 0x30, 0x19, 0x12, 0x02, 0x78,0x00, 0x10, 0x08, 0x03, 0x46,0x21, 0x06, 0x0e};//共阳数码管 显示点     
//段码初始化函数
#define G_GPIO_PIN  GPIO_Pin_1
#define F_GPIO_PIN  GPIO_Pin_2
#define E_GPIO_PIN  GPIO_Pin_3
#define D_GPIO_PIN  GPIO_Pin_4
#define C_GPIO_PIN  GPIO_Pin_5
#define B_GPIO_PIN  GPIO_Pin_6
#define A_GPIO_PIN  GPIO_Pin_7
//段码初始化函数
void smg_duanma(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    //打开时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

    //推挽输出
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = A_GPIO_PIN | B_GPIO_PIN | C_GPIO_PIN | D_GPIO_PIN | E_GPIO_PIN | F_GPIO_PIN | G_GPIO_PIN ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    
    GPIO_SetBits(GPIOB, A_GPIO_PIN | B_GPIO_PIN | C_GPIO_PIN | D_GPIO_PIN | E_GPIO_PIN | F_GPIO_PIN | G_GPIO_PIN);
}    

//段码显示函数
void smg_duanma_Display(GPIO_TypeDef* GPIOx,u8 val)
{
    uint16_t display_val = val << 7;
    
    GPIO_Write(GPIOx,display_val);
    display_val =0xff;
}
复制代码

 

位码代码实现

复制代码
//位码初始化
void smg_weima(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    //打开时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    //推挽输出
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_2 | GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_2 | GPIO_Pin_4);    
}    
复制代码

数码管显示函数

复制代码
//数码管显示函数
void smg_data(char weizhi,char num)
{

      switch(weizhi)
        {
        
            case 1 : 
                    GPIO_SetBits(GPIOA, GPIO_Pin_4);    
                    GPIO_ResetBits(GPIOA, GPIO_Pin_3);
                    GPIO_ResetBits(GPIOA, GPIO_Pin_2);
                    GPIO_ResetBits(GPIOA, GPIO_Pin_1);    
            
            break;
            case 2 :
                    GPIO_ResetBits(GPIOA, GPIO_Pin_4);    
                    GPIO_SetBits(GPIOA, GPIO_Pin_3);
                    GPIO_ResetBits(GPIOA, GPIO_Pin_2);
                    GPIO_ResetBits(GPIOA, GPIO_Pin_1);    
                    break;
            case 3 : 
                    GPIO_ResetBits(GPIOA, GPIO_Pin_4);    
                    GPIO_ResetBits(GPIOA, GPIO_Pin_3);
                    GPIO_SetBits(GPIOA, GPIO_Pin_2);
                    GPIO_ResetBits(GPIOA, GPIO_Pin_1);    
                
                        break;
            case 4 : 
                    GPIO_ResetBits(GPIOA, GPIO_Pin_4);    
                    GPIO_ResetBits(GPIOA, GPIO_Pin_3);
                    GPIO_ResetBits(GPIOA, GPIO_Pin_2);
                    GPIO_SetBits(GPIOA, GPIO_Pin_1);    
                break;
        
        }
        /*
    #define G_GPIO_PIN  GPIO_Pin_1
    #define F_GPIO_PIN  GPIO_Pin_2
    #define E_GPIO_PIN  GPIO_Pin_3
    #define D_GPIO_PIN  GPIO_Pin_4
    #define C_GPIO_PIN  GPIO_Pin_5
    #define B_GPIO_PIN  GPIO_Pin_6
    #define A_GPIO_PIN  GPIO_Pin_7
        */
        switch(num)
        {                                            
            case 0 :  //G不亮 给0亮 给1灭
                    GPIO_ResetBits(GPIOB, A_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, B_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, C_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, D_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, E_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, F_GPIO_PIN);
                    GPIO_SetBits(  GPIOB, G_GPIO_PIN);
                    //smg_duanma_Display(GPIOB,code[0]);
            
            
                            break;
            case 1 : //只有bc亮 给0亮 给1灭
                    GPIO_SetBits(GPIOB, A_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, B_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, C_GPIO_PIN);
                    GPIO_SetBits(GPIOB, D_GPIO_PIN);
                    GPIO_SetBits(GPIOB, E_GPIO_PIN);
                    GPIO_SetBits(GPIOB, F_GPIO_PIN);
                    GPIO_SetBits(  GPIOB, G_GPIO_PIN);
                    //smg_duanma_Display(GPIOB,code[1]);
                        break;
            case 2 : //只有abdf亮 给0亮 给1灭
                    GPIO_ResetBits(GPIOB, A_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, B_GPIO_PIN);
                    GPIO_SetBits(GPIOB, C_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, D_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, E_GPIO_PIN);
                    GPIO_SetBits(GPIOB, F_GPIO_PIN);
                    GPIO_ResetBits(  GPIOB, G_GPIO_PIN);
                    //smg_duanma_Display(GPIOB,code[1]);
                        break;
            case 3 : //只有abcdg亮 给0亮 给1灭
                    GPIO_ResetBits(GPIOB, A_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, B_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, C_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, D_GPIO_PIN);
                    GPIO_SetBits(GPIOB, E_GPIO_PIN);
                    GPIO_SetBits(GPIOB, F_GPIO_PIN);
                    GPIO_ResetBits(  GPIOB, G_GPIO_PIN);
                    //smg_duanma_Display(GPIOB,code[1]);
                        break;
            case 4 : //只有bcfg亮 给0亮 给1灭
                    GPIO_SetBits(GPIOB, A_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, B_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, C_GPIO_PIN);
                    GPIO_SetBits(GPIOB, D_GPIO_PIN);
                    GPIO_SetBits(GPIOB, E_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, F_GPIO_PIN);
                    GPIO_ResetBits(  GPIOB, G_GPIO_PIN);
                    //smg_duanma_Display(GPIOB,code[1]);
                        break;
            case 5 : //只有acdfg亮 给0亮 给1灭
                    GPIO_ResetBits(GPIOB, A_GPIO_PIN);
                    GPIO_SetBits(GPIOB, B_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, C_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, D_GPIO_PIN);
                    GPIO_SetBits(GPIOB, E_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, F_GPIO_PIN);
                    GPIO_ResetBits(  GPIOB, G_GPIO_PIN);
                    //smg_duanma_Display(GPIOB,code[1]);
                        break;
            case 6 : //只有acdefg亮 给0亮 给1灭
                    GPIO_ResetBits(GPIOB, A_GPIO_PIN);
                    GPIO_SetBits(GPIOB, B_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, C_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, D_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, E_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, F_GPIO_PIN);
                    GPIO_ResetBits(  GPIOB, G_GPIO_PIN);
                    //smg_duanma_Display(GPIOB,code[1]);
                        break;
            case 7 : //只有abc亮 给0亮 给1灭
                    GPIO_ResetBits(GPIOB, A_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, B_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, C_GPIO_PIN);
                    GPIO_SetBits(GPIOB, D_GPIO_PIN);
                    GPIO_SetBits(GPIOB, E_GPIO_PIN);
                    GPIO_SetBits(GPIOB, F_GPIO_PIN);
                    GPIO_SetBits(GPIOB, G_GPIO_PIN);
                    //smg_duanma_Display(GPIOB,code[1]);
                        break;
            case 8 : //只有abcdefg亮 给0亮 给1灭
                    GPIO_ResetBits(GPIOB, A_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, B_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, C_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, D_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, E_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, F_GPIO_PIN);
                    GPIO_ResetBits(  GPIOB, G_GPIO_PIN);
                    //smg_duanma_Display(GPIOB,code[1]);
                        break;
            case 9 : //只有abcdfg亮 给0亮 给1灭
                    GPIO_ResetBits(GPIOB, A_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, B_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, C_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, D_GPIO_PIN);
                    GPIO_SetBits(GPIOB, E_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, F_GPIO_PIN);
                    GPIO_ResetBits(  GPIOB, G_GPIO_PIN);
                    //smg_duanma_Display(GPIOB,code[1]);
                        break;
                                                                                                                 
        }

        delay100(200);                                                                    


        GPIO_SetBits(GPIOB, A_GPIO_PIN | B_GPIO_PIN | C_GPIO_PIN | D_GPIO_PIN | E_GPIO_PIN | F_GPIO_PIN | G_GPIO_PIN  );
        GPIO_SetBits(GPIOA, GPIO_Pin_3|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4);

}
复制代码

按键初始化和按键扫描

复制代码
//按键123 pa0 6 7初始化
void Key_Init067(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    /*开启时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        //开启GPIOB的时钟
    
    /*GPIO初始化*/
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_6 ;//|GPIO_Pin_7 ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);                        //将PB1和PB11引脚初始化为上拉输入
}
//按键延时
void delayms(u32 ms)
{
    while(ms--);
}
/**
  * 函    数:按键获取键码
  * 参    数:无
  * 返 回 值:按下按键的键码值,范围:0~2,返回0代表没有按键按下
  * 注意事项:此函数是阻塞式操作,当按键按住不放时,函数会卡住,直到按键松手
  */
uint8_t Key_GetNum067(void)
{
    uint8_t KeyNum = 0;        //定义变量,默认键码值为0
    

    if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0)            //读PB11输入寄存器的状态,如果为0,则代表按键2按下
    {
        delayms(40);                                            //延时消抖
        while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0);    //等待按键松手
        //Delay_ms(2);                                            //延时消抖
        KeyNum = 5;                                                //置键码为2
    }
    if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6) == 0)            //读PB1输入寄存器的状态,如果为0,则代表按键1按下
    {
        delayms(40);                                            //延时消抖
        while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6) == 0);    //等待按键松手
        //Delay_ms(2);                                            //延时消抖
        KeyNum = 6;                                                //置键码为1
    }
    return KeyNum;            //返回键码值,如果没有按键按下,所有if都不成立,则键码为默认值0
}
复制代码

 

主函数代码

复制代码
int main(void)
{
    int keyValue=8266;

    char key=0,mode=1;

    

    //位码初始化
    smg_weima();
    //段码初始化函数
    smg_duanma();
    //按键123 pa0 6 7初始化
    Key_Init067();
    //Usart1_Pin_Init(9600);
    while(1)
    {    
        key =Key_GetNum067();
        if(key==5) //key 1按下
        {
                keyValue=0;
                mode=1;
        
        }
        
        if(key==6) //key 1按下
        {
                keyValue=8266;
                mode=0;
        
        }

        if(mode==1)
        {
                smg_data(1,keyValue/1000);
                smg_data(2,keyValue/100%10);
                smg_data(3,keyValue/10%10);
                smg_data(4,keyValue%10);
                delay100(5000);    
        
                if(keyValue ==1250)
                {
                    keyValue=1200;
                }
        
        }
        
            if(mode==0)
        {

                smg_data(1,keyValue/1000);
                smg_data(2,keyValue/100%10);
                smg_data(3,keyValue/10%10);
                smg_data(4,keyValue%10);
                delay100(5000);    
                keyValue++;
                if(keyValue ==1250)
                {
                    keyValue=1200;
                }
                
        
        }
        
    }
}
复制代码

全部代码实现

复制代码
#include "stm32f10x.h"                  // Device header
#include "stdio.h"
#include "string.h"

void delay100(int xms)
{
    while(xms--);
}    

unsigned char code[] ={0xC0, 0x79,0x24, 0x30, 0x19, 0x12, 0x02, 0x78,0x00, 0x10, 0x08, 0x03, 0x46,0x21, 0x06, 0x0e};//共阳数码管 显示点     
//段码初始化函数
#define G_GPIO_PIN  GPIO_Pin_1
#define F_GPIO_PIN  GPIO_Pin_2
#define E_GPIO_PIN  GPIO_Pin_3
#define D_GPIO_PIN  GPIO_Pin_4
#define C_GPIO_PIN  GPIO_Pin_5
#define B_GPIO_PIN  GPIO_Pin_6
#define A_GPIO_PIN  GPIO_Pin_7
//段码初始化函数
void smg_duanma(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    //打开时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

    //推挽输出
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = A_GPIO_PIN | B_GPIO_PIN | C_GPIO_PIN | D_GPIO_PIN | E_GPIO_PIN | F_GPIO_PIN | G_GPIO_PIN ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    
    GPIO_SetBits(GPIOB, A_GPIO_PIN | B_GPIO_PIN | C_GPIO_PIN | D_GPIO_PIN | E_GPIO_PIN | F_GPIO_PIN | G_GPIO_PIN);
}    

//段码显示函数
void smg_duanma_Display(GPIO_TypeDef* GPIOx,u8 val)
{
    uint16_t display_val = val << 7;
    
    GPIO_Write(GPIOx,display_val);
    display_val =0xff;
}
//位码初始化
void smg_weima(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    //打开时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    //推挽输出
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_2 | GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_2 | GPIO_Pin_4);    
}    

//数码管显示函数
void smg_data(char weizhi,char num)
{

      switch(weizhi)
        {
        
            case 1 : 
                    GPIO_SetBits(GPIOA, GPIO_Pin_4);    
                    GPIO_ResetBits(GPIOA, GPIO_Pin_3);
                    GPIO_ResetBits(GPIOA, GPIO_Pin_2);
                    GPIO_ResetBits(GPIOA, GPIO_Pin_1);    
            
            break;
            case 2 :
                    GPIO_ResetBits(GPIOA, GPIO_Pin_4);    
                    GPIO_SetBits(GPIOA, GPIO_Pin_3);
                    GPIO_ResetBits(GPIOA, GPIO_Pin_2);
                    GPIO_ResetBits(GPIOA, GPIO_Pin_1);    
                    break;
            case 3 : 
                    GPIO_ResetBits(GPIOA, GPIO_Pin_4);    
                    GPIO_ResetBits(GPIOA, GPIO_Pin_3);
                    GPIO_SetBits(GPIOA, GPIO_Pin_2);
                    GPIO_ResetBits(GPIOA, GPIO_Pin_1);    
                
                        break;
            case 4 : 
                    GPIO_ResetBits(GPIOA, GPIO_Pin_4);    
                    GPIO_ResetBits(GPIOA, GPIO_Pin_3);
                    GPIO_ResetBits(GPIOA, GPIO_Pin_2);
                    GPIO_SetBits(GPIOA, GPIO_Pin_1);    
                break;
        
        }
        /*
    #define G_GPIO_PIN  GPIO_Pin_1
    #define F_GPIO_PIN  GPIO_Pin_2
    #define E_GPIO_PIN  GPIO_Pin_3
    #define D_GPIO_PIN  GPIO_Pin_4
    #define C_GPIO_PIN  GPIO_Pin_5
    #define B_GPIO_PIN  GPIO_Pin_6
    #define A_GPIO_PIN  GPIO_Pin_7
        */
        switch(num)
        {                                            
            case 0 :  //G不亮 给0亮 给1灭
                    GPIO_ResetBits(GPIOB, A_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, B_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, C_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, D_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, E_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, F_GPIO_PIN);
                    GPIO_SetBits(  GPIOB, G_GPIO_PIN);
                    //smg_duanma_Display(GPIOB,code[0]);
            
            
                            break;
            case 1 : //只有bc亮 给0亮 给1灭
                    GPIO_SetBits(GPIOB, A_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, B_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, C_GPIO_PIN);
                    GPIO_SetBits(GPIOB, D_GPIO_PIN);
                    GPIO_SetBits(GPIOB, E_GPIO_PIN);
                    GPIO_SetBits(GPIOB, F_GPIO_PIN);
                    GPIO_SetBits(  GPIOB, G_GPIO_PIN);
                    //smg_duanma_Display(GPIOB,code[1]);
                        break;
            case 2 : //只有abdf亮 给0亮 给1灭
                    GPIO_ResetBits(GPIOB, A_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, B_GPIO_PIN);
                    GPIO_SetBits(GPIOB, C_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, D_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, E_GPIO_PIN);
                    GPIO_SetBits(GPIOB, F_GPIO_PIN);
                    GPIO_ResetBits(  GPIOB, G_GPIO_PIN);
                    //smg_duanma_Display(GPIOB,code[1]);
                        break;
            case 3 : //只有abcdg亮 给0亮 给1灭
                    GPIO_ResetBits(GPIOB, A_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, B_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, C_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, D_GPIO_PIN);
                    GPIO_SetBits(GPIOB, E_GPIO_PIN);
                    GPIO_SetBits(GPIOB, F_GPIO_PIN);
                    GPIO_ResetBits(  GPIOB, G_GPIO_PIN);
                    //smg_duanma_Display(GPIOB,code[1]);
                        break;
            case 4 : //只有bcfg亮 给0亮 给1灭
                    GPIO_SetBits(GPIOB, A_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, B_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, C_GPIO_PIN);
                    GPIO_SetBits(GPIOB, D_GPIO_PIN);
                    GPIO_SetBits(GPIOB, E_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, F_GPIO_PIN);
                    GPIO_ResetBits(  GPIOB, G_GPIO_PIN);
                    //smg_duanma_Display(GPIOB,code[1]);
                        break;
            case 5 : //只有acdfg亮 给0亮 给1灭
                    GPIO_ResetBits(GPIOB, A_GPIO_PIN);
                    GPIO_SetBits(GPIOB, B_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, C_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, D_GPIO_PIN);
                    GPIO_SetBits(GPIOB, E_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, F_GPIO_PIN);
                    GPIO_ResetBits(  GPIOB, G_GPIO_PIN);
                    //smg_duanma_Display(GPIOB,code[1]);
                        break;
            case 6 : //只有acdefg亮 给0亮 给1灭
                    GPIO_ResetBits(GPIOB, A_GPIO_PIN);
                    GPIO_SetBits(GPIOB, B_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, C_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, D_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, E_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, F_GPIO_PIN);
                    GPIO_ResetBits(  GPIOB, G_GPIO_PIN);
                    //smg_duanma_Display(GPIOB,code[1]);
                        break;
            case 7 : //只有abc亮 给0亮 给1灭
                    GPIO_ResetBits(GPIOB, A_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, B_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, C_GPIO_PIN);
                    GPIO_SetBits(GPIOB, D_GPIO_PIN);
                    GPIO_SetBits(GPIOB, E_GPIO_PIN);
                    GPIO_SetBits(GPIOB, F_GPIO_PIN);
                    GPIO_SetBits(GPIOB, G_GPIO_PIN);
                    //smg_duanma_Display(GPIOB,code[1]);
                        break;
            case 8 : //只有abcdefg亮 给0亮 给1灭
                    GPIO_ResetBits(GPIOB, A_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, B_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, C_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, D_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, E_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, F_GPIO_PIN);
                    GPIO_ResetBits(  GPIOB, G_GPIO_PIN);
                    //smg_duanma_Display(GPIOB,code[1]);
                        break;
            case 9 : //只有abcdfg亮 给0亮 给1灭
                    GPIO_ResetBits(GPIOB, A_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, B_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, C_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, D_GPIO_PIN);
                    GPIO_SetBits(GPIOB, E_GPIO_PIN);
                    GPIO_ResetBits(GPIOB, F_GPIO_PIN);
                    GPIO_ResetBits(  GPIOB, G_GPIO_PIN);
                    //smg_duanma_Display(GPIOB,code[1]);
                        break;
                                                                                                                 
        }

        delay100(200);                                                                    


        GPIO_SetBits(GPIOB, A_GPIO_PIN | B_GPIO_PIN | C_GPIO_PIN | D_GPIO_PIN | E_GPIO_PIN | F_GPIO_PIN | G_GPIO_PIN  );
        GPIO_SetBits(GPIOA, GPIO_Pin_3|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4);

}


//按键123 pa0 6 7初始化
void Key_Init067(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    /*开启时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        //开启GPIOB的时钟
    
    /*GPIO初始化*/
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_6 ;//|GPIO_Pin_7 ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);                        //将PB1和PB11引脚初始化为上拉输入
}
//按键延时
void delayms(u32 ms)
{
    while(ms--);
}
/**
  * 函    数:按键获取键码
  * 参    数:无
  * 返 回 值:按下按键的键码值,范围:0~2,返回0代表没有按键按下
  * 注意事项:此函数是阻塞式操作,当按键按住不放时,函数会卡住,直到按键松手
  */
uint8_t Key_GetNum067(void)
{
    uint8_t KeyNum = 0;        //定义变量,默认键码值为0
    

    if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0)            //读PB11输入寄存器的状态,如果为0,则代表按键2按下
    {
        delayms(40);                                            //延时消抖
        while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0);    //等待按键松手
        //Delay_ms(2);                                            //延时消抖
        KeyNum = 5;                                                //置键码为2
    }
    if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6) == 0)            //读PB1输入寄存器的状态,如果为0,则代表按键1按下
    {
        delayms(40);                                            //延时消抖
        while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6) == 0);    //等待按键松手
        //Delay_ms(2);                                            //延时消抖
        KeyNum = 6;                                                //置键码为1
    }
    return KeyNum;            //返回键码值,如果没有按键按下,所有if都不成立,则键码为默认值0
}

int main(void)
{
    int keyValue=8266;

    char key=0,mode=1;

    

    //位码初始化
    smg_weima();
    //段码初始化函数
    smg_duanma();
    //按键123 pa0 6 7初始化
    Key_Init067();
    //Usart1_Pin_Init(9600);
    while(1)
    {    
        key =Key_GetNum067();
        if(key==5) //key 1按下
        {
                keyValue=0;
                mode=1;
        
        }
        
        if(key==6) //key 1按下
        {
                keyValue=8266;
                mode=0;
        
        }

        if(mode==1)
        {
                smg_data(1,keyValue/1000);
                smg_data(2,keyValue/100%10);
                smg_data(3,keyValue/10%10);
                smg_data(4,keyValue%10);
                delay100(5000);    
        
                if(keyValue ==1250)
                {
                    keyValue=1200;
                }
        
        }
        
            if(mode==0)
        {

                smg_data(1,keyValue/1000);
                smg_data(2,keyValue/100%10);
                smg_data(3,keyValue/10%10);
                smg_data(4,keyValue%10);
                delay100(5000);    
                keyValue++;
                if(keyValue ==1250)
                {
                    keyValue=1200;
                }
                
        
        }
        
    }
}
复制代码

 

proteus 仿真图

 

仿真效果图

 

源码获取+q群1034207608

 

posted @   瓢儿菜  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示