STM32F103实现LED灯、按键、定时器编程

发布者:chunli最新更新时间:2016-09-23 来源: eefocus关键字:STM32F103  LED灯  按键  定时器编程 手机看文章 扫描二维码
随时随地手机看文章
#include "delay.h"
#include "sys.h"
#include "LED.h"
#include "key.h"
#include "timer2.h"
 
/*
程序功能:KEY0按下时,LED0 每秒闪烁一下;同时LED1熄灭(LED0慢闪)。
          KEY1按下时,LED1 每秒闪烁二下;同时LED0熄灭(LED0快闪)。
          WAKE_UP按下,LED0、LED1都熄灭。
硬件:LED0----GPIOA.8
      LED1----GPIOD.2
      KEY0----GPIOC.5
      KEY1----GPIOA.15
      KEY_WAKEUP----GPIOA.0
      TIMER2定时器功能。
软件:KEIL5
按键采用状态机实现按键扫描。在定时器中对按键进行处理。      
时间:2016.8.9
*/
//全局变量     按键状态机 LED0灯闪烁频率 LED1灯闪烁频率
unsigned char flag_20ms=0x0,flag_500ms=0,flag_250ms=0;
//          按键KEY0按下标志 按键KEY1按下标志
unsigned char  flag_key0=0,flag_key1=0;
 
int main(void)
 {
  
   Led_Init();//LED灯初始化
   key_init();//KEY按键初始化
   Timer2_config(71,2000);  //定时两毫秒   
   
while(1)
    {
     Led_Control(); //LED控制     
     
    }       
 
 }
 
 
#include "sys.h"
#include "delay.h"
#include "key.h"
 
extern unsigned char flag_20ms;
extern unsigned char  flag_key0,flag_key1;
 
void key_init(void)
{
 
    GPIO_InitTypeDef  KEY_InitTypeDef;
 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC,ENABLE);
        
    KEY_InitTypeDef.GPIO_Pin=GPIO_Pin_0;
    KEY_InitTypeDef.GPIO_Mode=GPIO_Mode_IPD;
    KEY_InitTypeDef.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&KEY_InitTypeDef);
 
    KEY_InitTypeDef.GPIO_Pin=GPIO_Pin_5;
    KEY_InitTypeDef.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_Init(GPIOC,&KEY_InitTypeDef);
        
    KEY_InitTypeDef.GPIO_Pin=GPIO_Pin_15;
    KEY_InitTypeDef.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_Init(GPIOA,&KEY_InitTypeDef);
            
    KEY0=1;
    KEY1=1;
    WK_UP=0;
}
 
/*
函数功能:按键扫描函数
输入参数:无
输出参数:返回键码。无按键时返回0;
外部变量:
算法:采用软件延时实现按键扫描。
*/
unsigned char KeyScan(void)
{
unsigned char keynum=0;
   if((KEY0!=1)||(KEY1!=1)||(WK_UP!=0))
   {
   delay_ms(10); 
   if((KEY0!=1)||(KEY1!=1)||(WK_UP!=0)) 
   {
       if(KEY0!=1)
       {
       while(KEY0!=1);
       keynum=1;return keynum;}
       else if(KEY1!=1)
       {while(KEY1!=1);
       keynum=2;return keynum;} 
       else if(WK_UP!=0)
       {while(WK_UP!=0);
       keynum=3;return keynum;} 
       else
         return 0;
   }
   else 
       return keynum;  
   
   }
   else
   return keynum; 
 
}
/*
函数功能:按键扫描函数
输入参数:无
输出参数:返回键码。无按键时返回0;
外部变量:flag_20ms
算法:采用状态机实现按键扫描。
 
*/
unsigned char KeyScan2(void)
{
static unsigned char keynum=0,step1=0;
    if(flag_20ms==0x01)
    {
    flag_20ms=0;
    switch(step1)
        {
        case 0:{//状态1:检测是否有按键按下
                if((KEY0!=1)||(KEY1!=1)||(WK_UP!=0))
                    step1=1;
                else
                    step1=0;
                return 0;
                break;        
                }
        case 1:{//状态2:检测是否真的有按键按下
                if((KEY0!=1)||(KEY1!=1)||(WK_UP!=0))
                {
                 if(KEY0!=1)
                   {step1=2; keynum=1;}
                   else if(KEY1!=1)
                   {step1=2;  keynum=2;}                   
                   else if(WK_UP!=0)
                   {step1=2; keynum=3;}                    
                   else
                   {step1=0; }                
                } 
                return 0;
                break;        
                }
        case 2:{//状态3:检测按键是否弹起
                if((KEY0!=1)||(KEY1!=1)||(WK_UP!=0))
                {step1=2; return 0;}
                else
                { step1=0;return keynum;}
                break;        
                }
        default :return 0;
        }    
    }
return 0;
    
}
/*
函数功能:按键功能解析函数
输入参数:无
输入函数:KeyScan2(); 
输出参数:无
外部变量:flag_key0,flag_key1
*/
 
void keyfunction(void)
{
unsigned char temp;
    temp=KeyScan2();    
    if(temp>0)
    {
        switch(temp)
           {
            case 1:{
            
                  flag_key0=1;  
                   break;
                  }
            case 2:{
            
                  flag_key1=1;  
                   break;
                  }
            case 3:{
                   
                  flag_key0=0;  flag_key1=0; 
                   break;
                  }       
             }   
    
    }
}
 
 
#include "LED.h"
//位带操作 要用到SYS.H
//#define LED0 PAout(8)
//#define LED1 PDout(2)
//不知道为什么,把 Led_InitTypeDef定义成指针变量后,程序运行不成功。灯不亮。
 
extern unsigned char flag_20ms,flag_500ms,flag_250ms;
extern unsigned char  flag_key0,flag_key1;
 
 
void Led_Init(void)
{
     GPIO_InitTypeDef Led_InitTypeDef;
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOA,ENABLE); 
     Led_InitTypeDef.GPIO_Mode=GPIO_Mode_Out_PP; 
     Led_InitTypeDef.GPIO_Speed=GPIO_Speed_50MHz;
     Led_InitTypeDef.GPIO_Pin=GPIO_Pin_8;     
       
     
     GPIO_Init(GPIOA,&Led_InitTypeDef);
     Led_InitTypeDef.GPIO_Pin=GPIO_Pin_2;
     GPIO_Init(GPIOD,&Led_InitTypeDef); 
 
    LED0=1;
    LED1=1; 
}
 
/*
函数功能:KEY0按下时,LED0 每秒闪烁一下。同时LED1熄灭。
          KEY1按下时,LED1 每秒闪烁二下。同时LED0熄灭。
          WAKE_UP按下,LED0、LED1都熄灭。
外部变量:flag_key0,flag_key1,flag_500ms,flag_250ms
输入参数:无
输出参数:无。
 
*/
void Led_Control(void)
{
    if(flag_key0==1)
        {
        if(flag_500ms==1)
            LED0=0;
        else LED0=1;
        }        
    else
        LED0=1;
 
    if(flag_key1==1)
        {
        if(flag_250ms==1)
           LED1=0;
        else LED1=1;
        }
    else
        LED1=1;
}
 
 
 
#include "sys.h"
#include "stm32f10x_tim.h"
#include "led.h"
#include "timer2.h"
#include "key.h"
 
extern unsigned char flag_20ms,flag_500ms,flag_250ms;
 
void Timer2_config(unsigned int presc,unsigned int period)
{
    TIM_TimeBaseInitTypeDef My_TIM2_Init; 
    NVIC_InitTypeDef  My_NVIC_Init;    
 
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
    
    My_TIM2_Init.TIM_Prescaler=presc;
    My_TIM2_Init.TIM_Period=period;
    My_TIM2_Init.TIM_ClockDivision=TIM_CKD_DIV1;
    My_TIM2_Init.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2,&My_TIM2_Init);
    
        
    
    My_NVIC_Init.NVIC_IRQChannel=TIM2_IRQn;
    My_NVIC_Init.NVIC_IRQChannelCmd=ENABLE;
    My_NVIC_Init.NVIC_IRQChannelPreemptionPriority=1;
    My_NVIC_Init.NVIC_IRQChannelSubPriority=1;
    NVIC_Init(&My_NVIC_Init);
    
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
    TIM_Cmd(TIM2,ENABLE);    
 
 
}
 
 
void TIM2_IRQHandler(void)
{
    static unsigned char temp1,temp2,temp3;
     if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
        {
           
         TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
         if(temp1++>=10)   
            {temp1=0;flag_20ms=0x01;
             keyfunction();
            }
         if(temp2++>=250) 
            { temp2=0;flag_500ms++; 
            if(flag_500ms>1)  flag_500ms=0;}
         if(temp3++>=125) 
            { temp3=0;flag_250ms++; 
                if(flag_250ms>1)
                    flag_250ms=0;
            }
        }
 
 
}

关键字:STM32F103  LED灯  按键  定时器编程 引用地址:STM32F103实现LED灯、按键、定时器编程

上一篇:STM32编程之ds18b20单总线温度传感器操作
下一篇:基于STM32的多功能数字钟

推荐阅读最新更新时间:2024-03-16 15:11

基于STM32F103C8T6+L298N通过PWM控制直流电机
01 前言 原来做的差速小车是基于Arduino控制的,感觉有些简单,也有些基础,Arduino方便简单的同时,可操作性感觉也少了很多,所以想将控制器换成STM32,然后将树莓派作为上位机,STM32作为下位机,通过树莓派和STM32进行通讯,实现对差速移动小车的控制,本人也是寒假期间初学STM32,也是奔着应用去的,所以对于STM32编程原理方面可能不太精通,这里偏重于记录应用层面的知识。 02 PWM调速原理 直流电机驱动是最简单的,给电机通上电就能转,根据电机的公式: 可知:当提高电压时,反电势升高,进而转速升高,电压与转速大致有如图所示的关系。 编辑 所以我们只要控制给电机通电的电压即可控制电机的转速,但是在实际
[单片机]
基于<font color='red'>STM32F103</font>C8T6+L298N通过PWM控制直流电机
stm32f103之串口实验
stm32f103之串口实验,串口相互通讯即用同一个单片机的串口1与串口3相互通讯 串口1,串口3都接到电脑上,选上”Use MicroLIB”这是KEIL自带的一个简易的库,例如你用printf函数的时候,就会从串口1 输出字符串,直接默认定向到串口1。(此程序中两个波特率不匹配,接受会出错,在实践中要设置串口一致的波特率)以下是程序 #ifndef __USART_H//头文件 #define __USART_H #include stdio.h #include sys.h void usart3_init(u32 bound);//如果想串口中断接收,请不要注释以下宏定义 void uart_in
[单片机]
<font color='red'>stm32f103</font>之串口实验
STM32F103学习笔记 (九) 输入捕获实验
这个实验是用 TIM5 的通道 1( PA0) 来做输入捕获, 捕获 PA0 上高电平的脉宽(用 WK_UP 按键输入高电平),通过串口打印高电平脉宽时间。 初始化里边先设置上升沿为输入捕捉,进入捕捉中断后,记录TIM5_CNT的值,然后配置捕获信号为下降沿捕获,当下降沿到来时,发生捕获,并记录此时的 TIM5_CNT 值。这样,前后两次 TIM5_CNT 之差,就是高电平的脉宽, 同时 TIM5 的计数频率我们是知道的,从而可以计算出高电平脉宽的准确时间。 相应的配置步骤为: (1)开启TIM5时钟和GPIO时钟,设置PA0为下拉输入 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5
[单片机]
<font color='red'>STM32F103</font>学习笔记 (九) 输入捕获实验
STM32F103,HAL实现软件I2C,与硬件I2C
1,硬件I2C HAL_I2C_Mem_Write(&hi2c1,0x88,0,I2C_MEMADD_SIZE_8BIT,0,0,0X10);//写 HAL_I2C_Master_Receive(&hi2c1,0x89,(uint8_t*)datatemp,4,0x10);//读 2 软件I2C #ifndef __MYI2C_H__ #define __MYI2C_H__ #include stm32f1xx_hal.h #include main.h #include stdint.h #define CPU_FREQUENCY_MHZ 72 #define MYI2C_SCL_PIN I2C_S
[单片机]
<font color='red'>STM32F103</font>,HAL实现软件I2C,与硬件I2C
基于stm32f103zet6的定时器的学习1(理论知识)
之前就听到网友说定时器这部分比较复杂,难搞,实验室里有个同学也搞了一段时间,不过它属于哪种专研型的人!学着学者,我也来到了定时器这章。 在网上查看了一下,也翻阅了一些书籍,高级定时器,通用定时器,普通定时器这三种就从通用的开始学吧! 一、首先还是将定时器框图分解一下吧,那么令人窒息的框图着实让人恐怖!虽然窒息,但是还是有必要贴上去! 对上面框图中的寄存器名字解释如下 TIMx_ETR:TIMER外部触发引脚ETR:外部触发输入ETRP:分频后的外部触发输入ETRF:滤波后的外部触发输入 ITRx:内部触发x(由另外的定时器触发)TI1F_ED:TI1的边沿检测器。TI1FP1/2:滤波后定时器1/2的输入 TRGI:触发
[单片机]
基于<font color='red'>stm32f103</font>zet6的<font color='red'>定时器</font>的学习1(理论知识)
STM32F103VET与CPLD之间的通信
简介:stm32采用在线调试,将readdata添加到观察窗口,查看它的值,可以看到,当cpld开发板的复位键未按下时,readata=0x0058,当长按cpld复位键时readata=0x0018,按键弹起之后readata=0x0058。 1、先贴CPLD的VHDL编程: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity stm32_cpld is port( cpld_cs:in std_logic;--cpld片选信号,硬件连接:通过SN74LVC4245与STM32的FSMC总
[单片机]
<font color='red'>STM32F103</font>VET与CPLD之间的通信
基于AVR微控制器的ADC按键设计技巧
1 引言 在单片机应用领域中,人机交互的途径和方式灵活多样,但键盘输人仍然是最常见、最重要的方法。通常实现键盘接口的方式有:直接输入、矩阵结构、A/D方式、键盘和显示复用、并行扩展、串口扩充以及用键盘和显示专用控制器件。本设计使用A/D转换的方法,其硬件电路简单,按键电路与MCU的连线少,易修改,而且可以节省MCU有限的I/0资源。但在处理按键数目较多的情况时,往往会出现按键不可靠的问题,如按键没有任何反映,按键功能交叉。本文除了给出A/D按键的硬件电路外.着重介绍利用软件技巧来实现可靠的键盘接口。 2硬件设计 本设计选用的单片机是基于AVR增强型RISC结构的低功耗8位CMOS微控制器ATmegal68「1」该微控制器具有
[模拟电子]
STM32F103ZET6 — TIM6/TIM7
介绍 STM32F103ZET6 定时器资源非常丰富,根据 datasheet 描述,涵盖如下几种类型: 高级定时器 TIM1 / TIM8 通用定时器 TIM2 / TIM3 / TIM4 / TIM5 基本定时器 TIM6/ TIM7 本次描述的重点是基本定时器 TIM6/ TIM7 基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC)提供时钟。实际上,它们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。这2个定时器是互相独立的,不共享任何资源。 时钟 可以看到来自 APB1 的低频时钟经过频率x2
[单片机]
<font color='red'>STM32F103</font>ZET6 — TIM6/TIM7
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved