Proteus-32单片机驱动四位数码管实现数字显示全解析

实现环境

  • Proteus8.17
  • Keil5 MDK 536
  • 实现步骤

  • 选择STM32微控制器:在Proteus元件库中找到并放置STM32微控制器(如STM32F103C8)。
  • 添加四位数码管:在元件库中找到四位数码管(如7段数码管),并将其放置在电路中。
  • 连接电路
  • 将数码管的段选引脚(a, b, c, d, e, f, g, dp)连接到STM32的GPIO引脚。

  • 将数码管的位选引脚(通常为4个,对应每一位数码管)连接到STM32的GPIO引脚。

  • 确保数码管的共阴极或共阳极连接正确(共阴极接地,共阳极接VCC)。

  • 电路连接图

    位选、段选初始化代码实现

    
    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_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_duanma_Display(GPIO_TypeDef* GPIOx,u8 val)
    {
    	uint16_t display_val = val << 7;
    	
    	GPIO_Write(GPIOx,display_val);
    	display_val =0xff;
    }

    数码管显示函数

    //数码管显示函数
    
    void smg_data(char weizhi,char num)
    {
    //		4位数码管1~4引脚接线要求。(接线错误扣4分)学号:(2227010255)
    //学号尾号0~4,1~4引脚从PA1~PA4依次连接
    //学号尾号5~9,1~4引脚从PA4~PA1依次连接
    	  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
    	}
    //	
    //	if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7) == 0)			//读PB11输入寄存器的状态,如果为0,则代表按键2按下
    //	{
    //		delayms(40);											//延时消抖
    //		while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7) == 0);	//等待按键松手
    //		//Delay_ms(2);											//延时消抖
    //		KeyNum = 7;												//置键码为2
    //	}
    //	
    	
    	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);
    				//delay100(10000);	
    				smg_data(2,keyValue/100%10);
    				//delay100(10000);	
    				smg_data(3,keyValue/10%10);
    				
    				smg_data(4,keyValue%10);
    				delay100(5000);	
    				//printf("count=%d",keyValue);
    				keyValue++;
    			 // delay100(10000);
    				if(keyValue ==1250)
    				{
    					keyValue=1200;
    				}
    		
    		}
    		
    			if(mode==0)
    		{
    
    				smg_data(1,keyValue/1000);
    				//delay100(10000);	
    				smg_data(2,keyValue/100%10);
    				//delay100(10000);	
    				smg_data(3,keyValue/10%10);
    				
    				smg_data(4,keyValue%10);
    				delay100(5000);	
    				//printf("count=%d",keyValue);
    				keyValue++;
    			 // delay100(10000);
    				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)
    {
    //		4位数码管1~4引脚接线要求。(接线错误扣4分)学号:(2227010255)
    //学号尾号0~4,1~4引脚从PA1~PA4依次连接
    //学号尾号5~9,1~4引脚从PA4~PA1依次连接
    	  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
    	}
    //	
    //	if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7) == 0)			//读PB11输入寄存器的状态,如果为0,则代表按键2按下
    //	{
    //		delayms(40);											//延时消抖
    //		while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7) == 0);	//等待按键松手
    //		//Delay_ms(2);											//延时消抖
    //		KeyNum = 7;												//置键码为2
    //	}
    //	
    	
    	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);
    				//delay100(10000);	
    				smg_data(2,keyValue/100%10);
    				//delay100(10000);	
    				smg_data(3,keyValue/10%10);
    				
    				smg_data(4,keyValue%10);
    				delay100(5000);	
    				//printf("count=%d",keyValue);
    				keyValue++;
    			 // delay100(10000);
    				if(keyValue ==1250)
    				{
    					keyValue=1200;
    				}
    		
    		}
    		
    			if(mode==0)
    		{
    
    				smg_data(1,keyValue/1000);
    				//delay100(10000);	
    				smg_data(2,keyValue/100%10);
    				//delay100(10000);	
    				smg_data(3,keyValue/10%10);
    				
    				smg_data(4,keyValue%10);
    				delay100(5000);	
    				//printf("count=%d",keyValue);
    				keyValue++;
    			 // delay100(10000);
    				if(keyValue ==1250)
    				{
    					keyValue=1200;
    				}
    				
    		
    		}
    		
    	}
    }
    

    设计效果

  • 按键1清零
  • 按键2赋值显示8266
  • 测试现象 

    作者:瓢儿菜2018

    物联沃分享整理
    物联沃-IOTWORD物联网 » Proteus-32单片机驱动四位数码管实现数字显示全解析

    发表回复