• STM8的GPIO驱动


    芯片的外设一般按照这么几个流程来进行,GPIO,外部中断,定时器,串口,ADC,IIC,SPI,下面我就按照各个模式来写

       首先是GPIO,STM8的GPIO拥有复用功能,这句话告诉我们必然需要配置IO的复用功能才能使用,看这张表


    DDR决定输入输出方向,CR1 CR2决定输入输出模式,上拉,下拉,推挽,开漏等

    主要依靠这几个寄存器

    还有一个控制寄存器2,懒得传了


    按照这张表,输出写输出寄存器,输入读输入寄存器,就能完成GPIO的操作了

    以下是操作代码

     

    #include "key.h"
    
    u8 keyValue = 0;
    #define KEY1_IN (GPIOD->IDR&0X80)
    #define KEY2_IN (GPIOE->IDR&0X08)
    
    
    static void Delay(u16 nCount)
    {
      /* Decrement nCount value */
      while (nCount != 0)
      {
        nCount--;
      }
    
    }
    
    
    void KeyInit(void)
    {
        //D7初始化
        GPIOD->DDR &= ~(1<<7);//设置为输入
        GPIOD->CR1 |=  (1<<7);
        GPIOD->CR2 &= ~(1<<7);//10 上拉输入
        
        //E3初始化
        GPIOE->DDR &= ~(1<<3);//设置为输入
        GPIOE->CR1 |=  (1<<3);
        GPIOE->CR2 &= ~(1<<3);//10 上拉输入
    }
    
    u8 KeyScan(void)
    {
        if(KEY1_IN == 0)
        {
            Delay(16000);
            if(KEY1_IN == 0)
            {
                keyValue = KEY_VALUE1;
                return KEY_VALUE1;
            }
        }
        if(KEY2_IN == 0)
        {
            Delay(16000);
            if(KEY2_IN == 0)
            {
                keyValue = KEY_VALUE2;
                return KEY_VALUE2;
            }
        }
        return 0;
    }

    #ifndef __KEY_H_
    #define __KEY_H_
    #include "stm8s.h"
    
    //按键使用D7 E3
    //按键按下低电平,按键松开高电平
    
    #define KEY_VALUE1  1
    #define KEY_VALUE2  2
    
    extern u8 keyValue;
    
    
    void KeyInit(void);
    
    u8 KeyScan(void);
    
    
    
    #endif
    
    
    
    
    
    

    #include "led.h"
    
    void LedInit(void)
    {
        
        //D1初始化
        GPIOD->DDR |= (1<<1);//设置为输出
        GPIOD->CR1 |= 1<<1;
        GPIOD->CR2 &= ~(1<<1);//10 推挽输出
        
        //d0
        GPIOD->DDR |= (1<<0);//设置为输出
        GPIOD->CR1 |= 1<<0;
        GPIOD->CR2 &= ~(1<<0);//10 推挽输出
        
        //c3
        GPIOC->DDR |= (1<<3);//设置为输出
        GPIOC->CR1 |= 1<<3;
        GPIOC->CR2 &= ~(1<<3);//10 推挽输出
        LedSet(1,1);
        LedSet(2,1);
        LedSet(3,1);
    }
    
    void LedSet(u8 ch,u8 value)
    {
        
        switch(ch)
        {
        case 1:
            if(value)GPIOD->ODR |= 1<<1;
            else GPIOD->ODR &= ~(1<<1);
            break;
        case 2:
            if(value)GPIOD->ODR |= 1<<0;
            else GPIOD->ODR &= ~(1<<0);
            break;
        case 3:
            if(value)GPIOC->ODR |= 1<<3;
            else GPIOC->ODR &= ~(1<<3);
            break;
        }
    }
    
    

     

    #ifndef __LED_H_
    #define __LED_H_
    #include "stm8s.h"
    
    //led1  PD1 swim
    //led2  pd0 
    //led3  pc3 d12_cs
    
    void LedInit(void);
    
    void LedSet(u8 ch,u8 value);
    
    
    
    #endif
    
    
    
    
    

  • 相关阅读:
    使用dataInput:DescriptionViewer对输入的数据进行校验
    Nunit2.6.2调试.net4类库
    使用WCF RIA服务支持ASP.NET验证
    偶遇 Lc.exe已退出代码为1
    android程序连接后端web service时,提示:Permission denied
    设置XP系统的自动登录
    DomainDataSource的自动刷新
    安装CentOS时,显示 NET:Registered protocol family 2
    清除SqlServer2008的日志
    http://www.cnblogs.com/KnightsWarrior/archive/2010/08/27/1809739.html(博客主)
  • 原文地址:https://www.cnblogs.com/dengxiaojun/p/4279405.html
Copyright © 2020-2023  润新知