中断法独立按键实验及while();语句分析
实验名称及内容:中断法独立按键实验
* 基于小王子stm8s开发板
********************************************************/
include “iostm8s208mb.h”//主控芯片的头文件
/**************常用数据类型定义***************/
define u8 uint8_t
define u16 uint16_t
define u32 uint32_t
typedef unsigned char uint8_t;
typedef unsigned int uint16_t;
typedef unsigned long uint32_t;
/**************端口/引脚定义区域**************/
define LED PI_ODR_ODR0//连接至LED引脚
/****************函数声明区域*****************/
void delay(u16 Count);//延时函数声明
/****************主函数区域*******************/
void main(void)
{
asm(“sim”);//MAIN程序的优先级配置为3级(关总中断)
//EXTI_CR1|=0x08;//配置PB为仅下降沿触发
EXTI_CR1|=0x04;//配置PB为仅上升沿触发
PB_DDR_DDR0=0;//配置PB0端口为输入模式
PB_CR1_C10=1;//配置PB0端口为弱上拉输入模式
PB_CR2_C20=1;//使能PB0端口外部中断
PI_DDR_DDR0=1;//配置PI0端口为输出模式
PI_CR1_C10=1;//配置PI0端口为推挽输出模式
PI_CR2_C20=0;//配置PI0端口低斜率输出
LED=1;//上电后让PI0引脚输出高电平
asm(“rim”);//MAIN程序的优先级由3级降低至0级(开总中断)
//从asm(“rim”);语句开始,若检测到外部中断产生,讲进入中断函数
while(1);//死循环
}
//****************中断函数区域****************
pragma vector=0x05
__interrupt void EXTI_PORTA_IRQHandler(void)
{
}
pragma vector=0x06
__interrupt void EXTI_PORTB_IRQHandler(void)
{
asm(“sim”);
PB_CR2_C20=0;//禁止PB0端口外部中断
while(PB_IDR_IDR0==0); //按键按下,则PB_IDR_IDR0为1,1不等于0,表达式为假,退出循环。这是一个按键检测语句,检测PB_IDR_IDR0即PB0所连接的按键是否被按下。
delay(100);
LED=!LED;
delay(100);
PB_CR2_C20=1;//使能PB0端口外部中断
asm(“rim”);
}
pragma vector=0x07
__interrupt void EXTI_PORTC_IRQHandler(void)
{
}
pragma vector=0x08
__interrupt void EXTI_PORTD_IRQHandler(void)
{
}
pragma vector=0x09
__interrupt void EXTI_PORTE_IRQHandler(void)
{
}
//****************************************************
/******************************************************/
//延时函数delay(),有形参Count用于控制延时函数执行次数,无返回值
/******************************************************/
void delay(u16 Count)
{
u8 i,j;
while (Count–)//Count形参控制延时次数
{
for(i=0;i<50;i++)
for(j=0;j<20;j++);
}
}
下面聊一下按键检测:
由于自己的基础比较差,所以在理解while(PB_IDR_IDR0==0);的原理时废了很大的精力。一直理解不了这个带分号的while语句的意义。
while(PB_IDR_IDR0==0);这是一条语句,当判断条件为真,为死循环,一直等待,当判断条件为假,退出循环。
同理,while(!1);
while(!PB_IDR_IDR0);当PB_IDR_IDR0为1时(被按下),判断条件为假,退出循环。当PB_IDR_IDR0位0时(未被按下),判断条件为真,死循环,一直等待。
while(!KEY1);一样的道理。