1.第一个按键:按下一次,LED1亮,再次按下LED1灭
2.第二个按键:按下一次,LED1亮,按下第二次LED2亮..... 按下第四次LED4亮,按下第五次,LED1亮,依次往复。
3.第三个按键:按下所有LED灭
4.第四个按键:按下所有LED都亮了
四个基础练习的效果动图
按键开关通常为机械式开关,因为机械触点有弹性。 在闭合和断开的瞬间都会伴随弹性抖动。 抖动时间: 一般为5ms~10ms
按键的抖动对于人类来说是感觉不到的,但对单片机来说,是一个很“漫长”的过程,因为单片机处理的速度在“微秒”级,而按键抖动的时间至少在“毫秒”级
软件消抖的方法是不断检测按键值,直到按键值稳定。
实现方法:假设未按键时输入为1,按键后输入为0,抖动时不确定。 可以做以下检测:检测到按键输入为0之后,延时5ms~10ms,再次检测,如果按键还为0,那么就认为有按键输入。 延时的5ms~10ms恰好避开了抖动期。
if(0==BUTTON1)//判断是否有按键按下
{
delay(10); //延时一段时间(10ms)去除前沿抖动
if(0==BUTTON1)//再次确认是否有按键按下
{
while(0==BUTTON1);//按键抬起继续往下执行,没有则继续等待
LED1 = ~LED1; //按下一次,LED1亮,再次按下LED1灭
}
按下一次,LED1亮,按下第二次LED2亮..... 按下第四次LED4亮,按下第五次,LED1亮,依次往复。 利用C语言的取模运算符,1%4 = 1 , 2%4=2 , 3%4=3 , 4%4=0 , 5%4=1 , 6%4=2...
//定义全局变量count,a
if(0==BUTTON2)
{
delay(10);//延迟10ms
if(0==BUTTON2)
{
while(!BUTTON2);//按键抬起继续往下执行,没有则继续等待
count++;//每按下BUTTON2按键抬起时,变量count加1
a = count%4;
switch(a)
{
case 1:
P0= 0xfe; //11111110 LED1亮
break;
case 2:
P0= 0xfd;//11111101 LED2亮
break;
case 3:
P0= 0xfb; //11111011 LED3亮
break;
case 0:
P0=0xf7;//11110111 LED4亮
break;
default :
P0=0xff;
break;
}
}
}
P0口为高电平时LED熄灭,低电平全亮
if(0==BUTTON3)
{
delay(10);
if(0==BUTTON3)
{
while(0==BUTTON3);
P0 = 0xff; //P0 = 0x00 全亮
}
}
void main()
{
while(1)
{
task1();
task2();
task3();
task4();
}
}
#define u16 unsigned int 等效于typedef unsigned int u16;
#define u8 unsigned char 等效于typedef unsigned char u8;
为什么要这样定义,这样写非常直观,不用担心平台的不同可移植性好,它的字节数一看就知道,u16是16位2个字节,
全部0条评论
快来发表一下你的评论吧 !