YangHY 发表于 2025-12-15 13:05:49

机械按键按下或者松开有抖动,一般在20ms内。

If(按键是否按下)
{
//延时20ms消去抖动

if(按键是否按下) //按键再次确认按下
   {
//执行按键功能
while(按键是否松开):
         }
   }

YangHY 发表于 2025-12-15 13:12:59

就是说,延时函数的依据是必须有:

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松开
                        }
               
                }


        }
       
}


YangHY 发表于 2025-12-15 13:20:53

最后就是课后练习:

那么第六课就到此结束

YangHY 发表于 2025-12-18 08:15:17

今天开始第07.定时器的学习!


定时器的介绍
问题:.LED三秒闪烁一下,这三秒按下按键但是没有反应了?这怎么办呢?

先看中断的概念:


YangHY 发表于 2025-12-18 08:19:36

最大的问题是CPU是单核的:



定时器的介绍问题:.LED三秒闪烁一下,这三秒按下按键但是没有反应了?这怎么办呢?答:因为MCU单核的,同一时间只能执行一个事情,没有特殊情况不能被打断。所以这里就要引入一个特殊的情况,定时器中断。

YangHY 发表于 2025-12-18 08:22:25

看下面的代码:

YangHY 发表于 2025-12-18 08:32:02

按照上面的代码,是3秒亮,3秒灭:

按下P32 ,在串口助手打印“按键按下”

YangHY 发表于 2025-12-18 08:35:20

问题:.LED三秒闪烁一下,这三秒按下按键,但是串口没有反应了?这怎么办呢?

YangHY 发表于 2025-12-18 08:39:34

答:因为MCU单核的,同一时间只能执行一个事情,没有特殊情况不能被打断。所以这里就要引入一个特殊的情况,定时器中断。
看下面:

定时器作用:
(1)用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作
(2)替代长时间的Delay;提高程序的运行效率和处理速度(可以打断主循环)

YangHY 发表于 2025-12-18 08:45:06

可以打断主循环的延时:
页: 10 11 12 13 14 15 16 17 18 19 [20] 21 22 23 24 25 26 27 28 29
查看完整版本: 第一课 序言《AI8051U的特点》