首先打开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)); //等待计数到0SysTick->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_Hvoid Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);#endif
LED.c:
#include "stm32f10x.h" // Device headervoid 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或0if(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或0else 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或0else 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或0else 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或0else 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或0else 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或0else 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或0else 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或0else 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或0else 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_Hvoid 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 headervoid 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_Hvoid 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);elseGPIOB->ODR = 0XFFFF;}
}
整体在keil中的文件架构为:
现在编译后把hex文件导入proteus中就能仿真了。