stm8 GPIO按键输入

第一步:配置GPIO

在点亮第一个LED章节已经讲解了GPIO口的操作,下面我们再来看一个寄存器:

 stm8 GPIO按键输入_第1张图片

这个寄存器只能读。越看越像msp430的操作了。

下面之间看按键初始化和按键读取函数:

void Key_Init(void)
{
  PD_DDR &= 0x7F;  //PD7 输入      PD_DDP第7位置0
  PD_CR1 |= 0x80;    //带上拉输入    PD_CR1第7位置1 
  PD_CR2 &= 0x7F;   //禁止外部中断  PD_CR2第7位置0
}
void Key_Scan(void)
{
  if(PD_IDR_IDR7==0)   
  {
    delay_ms(20);   //延时消抖
    if(PD_IDR_IDR7==0)  //读取PD7的输入状态
    {
      PE_ODR^=0x20;   //PE5取反
    }
  }
}
按键读取函数是不是很像以前写 51 的程序那样?呵呵  O( _ )O~

为什么用PD_IDR_IDR7

打开头文件IOSTM8S105K4.h,是不是看见里面有好多的 Port A bit fields 的内容?PBPC和其他端口和其他外设的也有。

stm8 GPIO按键输入_第2张图片

其实端口都可以直接位操作,一般人我不告诉他。O(_)O哈哈

例如PA0设置为输出输、出高电平:

PA_DDR_DDR0 = 1;  //设置PA0为输出
PA_CR1_C10 = 1;    //可以不写这句 为什么?自己看手册
PA_CR2_C20 = 1;    //推挽输出最大速度10MHz
PA_ODR_ODR0 = 1;  //PA0输出高电平

其实这个也是我看了头文件后感觉有些奇怪,有些像msp430;管他像什么,试试再说,哈哈,果然可以。


再给大家一个延时函数,这个是我自己用示波器测量出来了。 

/*延时xms函数@ HSI  2MHz*/
void delay_ms(u16 xms)
{
  u16 i,j;
  for(i=xms;i>0;i--)
   for(j=330;j>0;j--)   //330这个参数可能单片机内部HSI有差异会不同
   {
      asm("nop");    
   }
}

第二步:下载调试

再看主函数:

int main( void )
{
  System_Init();
  Key_Init();
  Gpio_Init();
  while (1)
  {
    Key_Scan();
  }
}

编译下载,按动按键后 PE5 口的 LED 灯点亮或是熄灭。

 

 

 

你可能感兴趣的:(单片机,IAR,stm8,按键输入)