STM32用标准库编写按键控制LED灯的proteus仿真

首先打开proteus仿真软件,绘制电路图:

或是下载我已经建立好的工程修改:

链接:https://pan.baidu.com/s/1Nx5p3Tif6eHBIVkcPfsj9w?pwd=1234

提取码:1234

第一步复制整个工程文件夹,就不用重新配置的辛苦了,改个名字直接用:

第二步在工程文件夹中新建一个Mycode文件夹:

在Mycode文件夹中新建6个文件:以后这个文件夹就是我们自己写的新模块放到这里了:

这6个文件的内容都很简单:下面一个一个的展示:

Delay.c:

cs 复制代码
#include "stm32f10x.h"

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

Delay.h:

cs 复制代码
#ifndef __DELAY_H
#define __DELAY_H

void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);

#endif

LED.c:

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



void led_init(void)  // led灯的初始化函数
{
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_0 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;            
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStruct);
	
	GPIOB->ODR = 0xFFFF;
}

void LED_set(uint8_t num, uint8_t EN)
{
	//  如果传过来的是0  那就设置为0引脚为1或0
	if(num == 0 && EN == 1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_0);
	}
	else if(num == 0 && EN == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_0);
	}
	//  如果传过来的是1  那就设置为1引脚为1或0
	else if(num == 1 && EN == 1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_1);
	}
	else if(num == 1 && EN == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_1);
	}
	
	//  如果传过来的是2  那就设置为1引脚为1或0
	else if(num == 2 && EN == 1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_2);
	}
	else if(num == 2 && EN == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_2);
	}
	
	//  如果传过来的是3  那就设置为1引脚为1或0
	else if(num == 3 && EN == 1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_3);
	}
	else if(num == 3 && EN == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_3);
	}
	
	//  如果传过来的是4  那就设置为1引脚为1或0
	else if(num == 4 && EN == 1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_4);
	}
	else if(num == 4 && EN == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_4);
	}
	
	//  如果传过来的是5  那就设置为1引脚为1或0
	else if(num == 5 && EN == 1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_5);
	}
	else if(num == 5 && EN == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_5);
	}
	
	//  如果传过来的是6  那就设置为1引脚为1或0
	else if(num == 6 && EN == 1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_6);
	}
	else if(num == 6 && EN == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_6);
	}
	
	//  如果传过来的是7  那就设置为1引脚为1或0
	else if(num == 7 && EN == 1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_7);
	}
	else if(num == 7 && EN == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_7);
	}
	
	//  如果传过来的是8  那就设置为1引脚为1或0
	else if(num == 8 && EN == 1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_8);
	}
	else if(num == 8 && EN == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_8);
	}
	
	//  如果传过来的是9  那就设置为1引脚为1或0
	else if(num == 9 && EN == 1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_9);
	}
	else if(num == 9 && EN == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_9);
	}
}

LED.h:

cs 复制代码
#ifndef __LED_H

#define __LED_H

void led_init(void);  // 初始化LED点亮需要的一切东西

void LED_set(uint8_t num, uint8_t EN);  // 设置LED  参数1是引脚号  参数2是1或0.

#endif

key.c:

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

void key_init(void)   // 按键初始化函数
{
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;    //  GPIO为上拉模式
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_0 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;            
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	GPIOA->ODR = 0xFFFF;
}
uint8_t key_Get(uint8_t num)
{
	uint8_t val=0;
	//如果num==0  就返回引脚0的值
	if(num == 0)
	{
		val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
	}
	

	//如果num==1  就返回引脚1的值
	else if(num == 1)
	{
		val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1);
	}
	
	
	//如果num==2  就返回引脚2的值
	else if(num == 2)
	{
		val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2);
	}
	
	//如果num==3  就返回引脚3的值
	else if(num == 3)
	{
		val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3);
	}
	
	//如果num==4  就返回引脚4的值
	else if(num == 4)
	{
		val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4);
	}
	
	//如果num==5  就返回引脚5的值
	else if(num == 5)
	{
		val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);
	}
	
	//如果num==6  就返回引脚6的值
	else if(num == 6)
	{
		val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6);
	}
	
	//如果num==7  就返回引脚7的值
	else if(num == 7)
	{
		val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7);
	}
	
	//如果num==8  就返回引脚8的值
	else if(num == 8)
	{
		val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8);
	}
	
	//如果num==9  就返回引脚9的值
	else if(num == 9)
	{
		val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9);
	}
	
	return val;
}

key.h:

cs 复制代码
#ifndef __KEY_H
#define __KEY_H


void key_init(void);          // 按键初始化函数

uint8_t key_Get(uint8_t num);  // 按键值获取函数   参数:要获取的引脚号


#endif

最后就是书写main函数了,用来调用自己写的这些个函数,来实现咱们按下按键灯亮的目的:

main.c:

cs 复制代码
#include "stm32f10x.h"                  // Device header
#include "LED.h"
#include "key.h"

int main( void )
{
	led_init();
	key_init();
	
	
	while(1)
	{
		if(key_Get(0) == 0)
			LED_set(0,0);
		if(key_Get(1) == 0)
			LED_set(1,0);
		if(key_Get(2) == 0)
			LED_set(2,0);
		if(key_Get(3) == 0)
			LED_set(3,0);
		if(key_Get(4) == 0)
			LED_set(4,0);
		if(key_Get(5) == 0)
			LED_set(5,0);
		if(key_Get(6) == 0)
			LED_set(6,0);
		if(key_Get(7) == 0)
			LED_set(7,0);
		if(key_Get(8) == 0)
			LED_set(8,0);
		if(key_Get(9) == 0)
			LED_set(9,0);
		else
			GPIOB->ODR = 0XFFFF;
		
	}
}

整体在keil中的文件架构为:

现在编译后把hex文件导入proteus中就能仿真了。

相关推荐
redcocal6 小时前
地平线秋招
python·嵌入式硬件·算法·fpga开发·求职招聘
辰哥单片机设计10 小时前
门磁模块详解(防盗感应开关 STM32)
stm32·单片机·嵌入式硬件·传感器
夜间去看海10 小时前
基于51单片机的自动清洗系统(自动洗衣机)
嵌入式硬件·51单片机·proteus·洗衣机
yrx02030710 小时前
stm32 IIC总线busy解决方法
stm32·单片机·嵌入式硬件
YHPsophie12 小时前
ATGM331C-5T杭州中科微BDS/GNSS全星座定位授时模块应用领域
经验分享·笔记·单片机·信息与通信·交通物流
Archie_IT13 小时前
【STM32系统】基于STM32设计的SD卡数据读取与上位机显示系统(SDIO接口驱动、雷龙SD卡)——文末资料下载
arm开发·stm32·单片机·嵌入式硬件
辰哥单片机设计13 小时前
1×4矩阵键盘详解(STM32)
stm32·单片机·嵌入式硬件·矩阵·传感器
wmkswd13 小时前
CAN总线-STM32上CAN外设
stm32·单片机·嵌入式硬件
Ruohongxu13 小时前
LAN8720A-CP-TR-ABC QFN-24 以太网收发器芯片
单片机