首先打開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中就能仿真了。