历史上的今天
今天是:2025年01月14日(星期二)
2019年01月14日 | STM32F103(按键控制流水灯方向)
2019-01-14 来源:eefocus
1:要求 用按键控制流水灯方向
2:基于Stm32F103RB
3:型号CT117E
/*STM32库头文件*/
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x.h"
#include "core_cm3.h"
#include "misc.h"
GPIO口的设置,还有宏的定义
#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 key_t = FALSE; //按键的检测
void SystemInit()
{
//SystemInit为空为了骗过编译器,没有任何作用
}
/*主函数*/
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;
}
}
}
void init()//GPIO口的初始化 { 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;
}
/*Led显示*/
void Led()
{
static uint8_t led_b = 0x01;
LED_OUT(led_b);//数据的输出
if(rl)//判断左移还是右移
{
if((led_b <<= 1) == 0x00)
led_b = 0x01;
}
else
{
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;
}
/*刚刚入手学习STM32有不足之处,望大家指出*/
史海拾趣
|
刚接触嵌入式操作系统wince,不知从何入手,请大侠指点! 1、怎么实现内核裁减。程序加载后不想启动wince的界面,用自己的。 2、顺便给俺推荐几本书籍… 查看全部问答> |
|
低压通用变频输出电压为380~650V,输出功率为0.75~400kW,工作频率为0~400Hz,它的主电路都采用交?直?交电路。其控制方式经历了以下四代。 1. U/f=C的正弦脉宽调制(SPWM)控制方式 其特点是控制电路结构简单、成本较低,机械特性硬度也较 ...… 查看全部问答> |
|
各位好:我在ad程序里添加了两个变量:float in_voltage[NP]; float step_h[NP];后出现这个错误error: can\\\'t allocate .ebss (sz: 00002898 page: 1) in DRAMH0 (avail: ...… 查看全部问答> |
|
本帖最后由 lelee007 于 2015-5-9 16:18 编辑 哥承认,标题党了,哈哈,不过本帖主题离标题不会偏太远,算是该设计的一个开篇之作。 废话不多扯,我们直奔主题。 我们这里提到的高性能交互,指的就是ALTERA的新一代SOC器件上ARM和FPGA portion ...… 查看全部问答> |




