实现按下复位键KEY1即可切换LED1灯的亮灭。KEY与PA4相连,通过PA4的引脚关联PD5引脚的LED1亮灭。
#include<iostm8l151k4.h>
void Delay(unsigned int ms)
{
unsigned int x , y;
for(x = ms; x > 0; x--)
for(y = 2000; y > 0; y--);
}
int main(void)
{
PA_DDR_bit.DDR4 = 0; //配置PA4为输入模式
PA_CR1_bit.C14 = 1; //配置PA4为带上拉输入
PA_CR2_bit.C24 = 0; //配置PA4为禁止中断
PD_DDR_bit.DDR5 = 1; //配置PD5为输出模式
PD_CR1_bit.C15 = 1; //配置PD5为带上拉电阻的输出
PD_CR2_bit.C25 = 1; //配置PD5为高速输出模式
while(1)
{
if(PA_IDR_bit.IDR4 == 0) //判断PA4是 否已经 按下了
{
Delay(2); //调用延时函数,进行按下消抖
while(PA_IDR_bit.IDR4 == 0); //等待松手
Delay(2); //调用延时函数,进行松手消抖
PD_ODR ^= (1 << 5); //通过异或取反控制LED1
}
}
}
根据电路图可知,KEY1按下,PA4=0为低电平
电路图:
最后一句代码的解释:
PD_ODR ^= (1 << 5); //通过异或取反控制LED1
等效于PD_ODR = PD_ODR ^(1 << 5)
^是异或运算,(1<<5)其实就是0x20,上面的意思是当PA4 == 0 时,PortD_ODR的第5位取反,其余位状态不变,即为1左移5位,二进制即为 0010 0000
相当于,每次按下KEY1,当PA4 == 0的之后,函数几对ODR5的状态进行翻转。因此实现了LED1的亮灭!
补充:
和 0 “与” A&0 = 0 清零操作,一般把低8位清零 A & FF00
和 1 “或” A|1 = 1 置一操作
和 1 “异或” A^ 1 = 0 取反操作