中断法独立按键实验及while();语句分析

中断法独立按键实验及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);一样的道理。


版权声明:本文为qq_27965109原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。