您的位置:首页 > 其它

基于STM32CT117E竞赛板(STM32f103RB)按键控制LED流水灯

2018-01-08 14:32 573 查看
基于STM32CT117E竞赛板(STM32f103RB)按键控制LED,单片机与LED通过M74HC57连接,我们要进行GPIO的初始化,LED灯端口为GPIOC_Pin_8-GPIOC_Pin_15脚设置为复用推挽输出,另外也要初始化与M74HC57上的LE(锁存控制端)连接的GPIOD_Pin_2脚。此程序中按键设置(按照CT117E竞赛板上的按键B1、B2、B3、B4对应程序中的N_K1、N_K2、N_K3、N_K4对应端口为GPIOA_Pin_0、GPIOA_Pin_8、GPIOB_Pin_1、GPIOB_Pin_2初始化为复用浮空输入)
要注意GPIO时钟初始化
#include "stm32f10x_gpio.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"#include "stm32f10x.h"#include "core_cm3.h"#include "misc.h"#define LED0 GPIO_Pin_8#define LED1 GPIO_Pin_9#define LED2 GPIO_Pin_10#define LED3 GPIO_Pin_11#define LED4 GPIO_Pin_12#define LED5 GPIO_Pin_13#define LED6 GPIO_Pin_14#define LED7 GPIO_Pin_15#define LED_ALL (LED0 | LED1 | LED2 | LED3 | LED4 | LED5 | LED6 | LED7)#define LED_PORT GPIOC#define N_LE GPIO_Pin_2#define N_LE_PORT GPIOD#define SWN 4 /*????*/#define N_K1 GPIO_Pin_0#define N_K2 GPIO_Pin_8#define N_K3 GPIO_Pin_1#define N_K4 GPIO_Pin_2#define N_K1C GPIOA#define N_K2C GPIOA#define N_K3C GPIOB#define N_K4C GPIOB#define LED_OUT(x) GPIO_SetBits(LED_PORT,LED_ALL), \GPIO_ResetBits(LED_PORT, x<<8), \GPIO_SetBits(N_LE_PORT,N_LE), \GPIO_ResetBits(N_LE_PORT,N_LE)typedef enum{ FALSE = 0, TRUE}y_bool;static y_bool led_t = TRUE; //发光标记static y_bool rl = TRUE; //左移右移标记static y_bool km = TRUE; //移动快慢的标记static y_bool key_t = FALSE; //按键检测标记void SystemInit(){}//?????void init(){GPIO_InitTypeDef GPIO_InitStructure;//????RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD , ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);//??LED??GPIO_InitStructure.GPIO_Pin = LED_ALL ;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(LED_PORT , &GPIO_InitStructure);/*??N_LE??*/ GPIO_InitStructure.GPIO_Pin=N_LE;GPIO_Init(N_LE_PORT , &GPIO_InitStructure);/*???????*/GPIO_InitStructure.GPIO_Pin = N_K1 | N_K2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(N_K1C , &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = N_K3 | N_K4;GPIO_Init(N_K3C , &GPIO_InitStructure);/*滴答定时器时钟*/ //SysTick_Config(8000);}//SysTick中断void SysTick_Handler(){static uint16_t i = 0;if(++i >= 1000) i = 0;if(i % 20 == 0)key_t = TRUE;if(i%500 == 0)led_t = TRUE;}/*时钟的的定义(快慢)*/void SysT(){if(km)SysTick_Config(8000);else SysTick_Config(2000);}/*Led显示*/void Led(){static uint8_t led_b = 0x01;LED_OUT(led_b);//数据输出SysT();//调用时钟if(rl)//判断左移还是右移{led_b <<= 1;if((led_b << 1) == 0x00)led_b = 0x01;}else{led_b >>= 1;if((led_b >> 1) == 0x00)led_b = 0x80;}}/*按键检测函数*/uint8_t key_c(){static uint8_t key_o = 0x0f;uint8_t i, key_n, x;const uint16_t key_pin[SWN] = {N_K1, N_K2, N_K3, N_K4}; //各个按键的引脚const GPIO_TypeDef* key_port[SWN] = {N_K1C, N_K2C, N_K3C, N_K4C};//各个按键的端口for(key_n = 0, i = 0; i < SWN; i++)//将按键的当前值复 值到key_n变量中{key_n <<= 1;if(GPIO_ReadInputDataBit((GPIO_TypeDef*)key_port[i], key_pin[i])) key_n |= 0x01; }x = (key_n ^ key_o) & key_o;//检测有无按键按下key_o = key_n;//当前按键值作为下一次比较的直return x;}/*按键处理函数*/void key_d(uint8_t x){if(x & 0x08)rl = !rl;if(x & 0x04)km = !km;}int main(){uint8_t key_dn;init();while(1){if(led_t){led_t = FALSE;Led(); //调用发光二极管的移动}/*按键一检测(左右移动)*/if(key_t){key_t = FALSE;key_dn = key_c();//调用按键检测}if(key_dn){key_d(key_dn);//调用按键处理key_dn = 0x00;} }}
我把按键检测标记放在嘀嗒定时器的中断函数中,嘀嗒定时器定时时间为1ms,每中断1000次(1s),则LED移动一位,所以嘀嗒定时器也用做延时。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: