机械按键按下或者松开有抖动,一般在20ms内。
If(按键是否按下)
{
//延时20ms消去抖动
if(按键是否按下) //按键再次确认按下
{
//执行按键功能
while(按键是否松开):
}
}
就是说,延时函数的依据是必须有:
WTST = 0; //设置程序指令延时参数,
EAXFR =1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
中的第一行,否则时间就对不上
最终的代码:
//课后任务2:按一下亮一颗灯,在按一下亮两颗灯,直到全亮(变量+加法和乘法)
if( P32== 0 ) //判断P32按钮是否按下,0为按下
{
Delay20ms();//延时20毫秒消抖
if( P32== 0 ) //判断P32按钮是否确实按下
{
state = !state; //变里取反010101
//LED_rksj = _crol_(LED_rksj,1);//左移一位,循环移入每次往前点亮一位
LED_rksj = LED_rksj<<1; //左移一位,右边补0,每次往前多点亮一位
P0 = LED_rksj;//P00端口左移一位输出0V,共阳极LED点亮
num = num +1 ;
if(num>=8)
{
LED_rksj = 0XFF;//送人P0口数据
num = 0 ; //P32按键次数,
}
printf("state: num: %d %d\r\n", (int)state,num);
while(P32 == 0); //等待P32松开
}
}
if( P33== 0 ) //判断P33按钮是否按下,0为按下
{
Delay20ms();//延时20毫秒消抖
if( P33== 0 ) //判断P33按钮是否确实按下
{
state = !state; //变里取反010101
P0 = 0XFF;//P00端口输出3.3V,8位共阳极LED熄灭
printf("state: %d\r\n", (int)state);
while(P33 == 0); //等待P33松开
}
}
}
}
最后就是课后练习:
那么第六课就到此结束
今天开始第07.定时器的学习!
定时器的介绍
问题:.LED三秒闪烁一下,这三秒按下按键但是没有反应了?这怎么办呢?
先看中断的概念:
最大的问题是CPU是单核的:
定时器的介绍问题:.LED三秒闪烁一下,这三秒按下按键但是没有反应了?这怎么办呢?答:因为MCU单核的,同一时间只能执行一个事情,没有特殊情况不能被打断。所以这里就要引入一个特殊的情况,定时器中断。
看下面的代码:
按照上面的代码,是3秒亮,3秒灭:
按下P32 ,在串口助手打印“按键按下”
问题:.LED三秒闪烁一下,这三秒按下按键,但是串口没有反应了?这怎么办呢?
答:因为MCU单核的,同一时间只能执行一个事情,没有特殊情况不能被打断。所以这里就要引入一个特殊的情况,定时器中断。
看下面:
定时器作用:
(1)用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作
(2)替代长时间的Delay;提高程序的运行效率和处理速度(可以打断主循环)
可以打断主循环的延时: