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

测试现象 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值