嵌入式 > 技术百科 > 详情

stm8 GPIO按键输入

发布时间:2020-12-16 发布时间:
|

第一步:配置GPIO


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

这个寄存器只能读。越看越像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 的内容?PB、PC和其他端口和其他外设的也有。

其实端口都可以直接位操作,一般人我不告诉他。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灯点亮或是熄灭。




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
用于MAX7456随屏显示器SPI