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





 

posted @ 2014-10-14 23:53  邓小俊  阅读(1571)  评论(0编辑  收藏  举报