做作业的效率出乎意外的高,我又回来更新啦!!!
今天的笔记是第10、11个视频
第七章·按键点灯
1.按键的原理
有的是按下之后两个引脚导通;
有的是按键之后两个引脚断开。
根据电路图分析,SW17弹起,P3.2联通VCC,属于高电平。SW17按下,P3.2接地,属于低电平。
机械开关的抖动:
2.如何按键消抖
思路:
按键按下后,存在5-10ms的抖动,我们只需要在这个时间之后在进行一次检测,就可以实现消抖的效果。
代码实现:
- while (1)
- {
- if (按键 == 0)
- {
- //按键消抖
- delay(20);
- while (按键 == 0);
- delay(20);
- }
- }
复制代码
(代码和冲哥演示的有不同,因为是打狗棒)
3.1按键按下LED点亮,松开熄灭
- if (P31 == 1)
- {
- //按键消抖
- delay(20);
- while (P31 == 1){
- delay(20);
- P20 = 1;
- }
- }
- else
- {
- P20 = 0;
- }
复制代码
3.2按键按下LED熄灭,松开点亮
- if (P32 == 1) //按下状态
- {
- //按键消抖
- delay(20);
- while (P32 == 1){
- delay(20);
- P20 = 0;
- }
- }
- else
- {
- P20 = 1;
- }
复制代码
3.3按键按下一次,LED状态改变一次
- if (P32 == 0)
- {
- //按键消抖
- delay(20);
- while (P32 == 0);
- delay(20);
- P20 = ~P20; //取反改变状态
- }
复制代码
3.4按键按下一次,LED往左边走一个。
- u8 LED_Data = 0xFE;
-
- void main()
- {
-
- // 初始化
- sys_init();
- usb_init();
- P2 = LED_Data;
-
- // 主循环
- while (1)
- {
- if (P32 == 0)
- {
- //按键消抖
- delay(20);
- while (P32 == 0);
- delay(20);
- /*
- 思路:
- 通过位操作代码移动0位亮灯。由于默认补0,所以在完成后+1进行补1的操作。
- 通过while循环来判断是否达到1111 1111 也就是 0xFF
- 当达到,重置为0xFE
- */
- LED_Data = ((LED_Data <<1 ) +1 );
- while( LED_Data == 0xFF ){
- LED_Data=0xFE;
- }
- P2 = LED_Data;
- }
- }
- }
复制代码
4.数组的使用
定义一个数组,把所有亮灯的方式按顺序写进去
u8 num = 0;
u8 LED_DateTab[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xBF,0xDF,0x7F}
点灯实现:
P2 = LED_DateTab[num];
delay(500);
num++;
while(num>7){
num=0;
}
|