首先打开proteus仿真软件,绘制电路图:
或是下载我已经建立好的工程修改:
链接:https://pan.baidu.com/s/1Nx5p3Tif6eHBIVkcPfsj9w?pwd=1234
提取码:1234
第一步复制整个工程文件夹,就不用重新配置的辛苦了,改个名字直接用:
第二步在工程文件夹中新建一个Mycode文件夹:
在Mycode文件夹中新建6个文件:以后这个文件夹就是我们自己写的新模块放到这里了:
这6个文件的内容都很简单:下面一个一个的展示:
Delay.c:
#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:
#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:
#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:
#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:
#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:
#ifndef __KEY_H
#define __KEY_H
void key_init(void); // 按键初始化函数
uint8_t key_Get(uint8_t num); // 按键值获取函数 参数:要获取的引脚号
#endif
最后就是书写main函数了,用来调用自己写的这些个函数,来实现咱们按下按键灯亮的目的:
main.c:
#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中就能仿真了。