本帖最后由 千年老姚 于 2023-1-3 17:31 编辑
各位冬至好!刚才看完了第十和第十一集,以下为简略版笔记
若笔记有误,请各位指正:lol
第七章:按键点灯
一.按键的原理
1.按键的原理:
常开按键/常闭按键——实验箱上都是常开按键
10k上拉,300Ω限流
机械开关会有震动,闭合时不会马上稳定接通,因此在开关瞬间会有一连串的抖动。
二.按键的代码和实现过程
- //省略部分代码
- #define KEY1 P32 // 定义一个按键,引脚选择P32
- #define KEY1 P33 // 定义一个按键,引脚选择P33
- .......
- /*****按下点亮,松开熄灭******/
- if (KEY1== 0) //运算赋值,判断按键是否有被按下
- {
- Delay_ms(10);
- if (KEY1== 0)
- {
- printf("按键P32已经按下\r\n");
- }
- }
-
- /***按下熄灭,松开点亮****/
- if (KEY2== 0) //运算赋值,判断按键是否有被按下
- {
- Delay_ms(10);
- if (KEY2== 0)
- {
- printf("按键P33已经按下\r\n");
- }
- }
复制代码
三.按键的应用
- /*****按下点亮,松开熄灭******/
- if (KEY1== 0) //运算赋值,判断按键是否有被按下
- {
- Delay_ms(10);
- if (KEY1== 0)
- {
- printf("按键P32已经按下\r\n");
- P60 = 0; //led0点亮
- P40 = 0;
- }
- }
- else //如果没按下
- {
- P60 = 1; //LED0熄灭
- P40 = 0;
- }
复制代码
-
- /***按下熄灭,松开点亮****/
- if (KEY2== 0) //运算赋值,判断按键是否有被按下
- {
- Delay_ms(10);
- if (KEY2== 0)
- {
- printf("按键P33已经按下\r\n");
- P40 = 0;
- P67 = 1;
- }
- }
- else
- {
- P67 = 0;
- }
复制代码
- /***按键按下一次,led状态改变一次***/
- if (KEY2== 0) //运算赋值,判断按键是否有被按下
- {
- Delay_ms(10);
- if (KEY2== 0)
- {
- printf("按键P33已经按下,LED取反一次\r\n");
- P40 = 0;
- P67 = !P67; //LED熄灭
- //delay_ms(500);//取长延时,但是效果不好。
- while(KEY2 == 0)
- {
-
- }
- }
-
- }
- else
- {
- P67 = 0;
- }
-
- //while的位置可以使得按键按下后执行出来的状态不一样,具体要看场景应用
复制代码
- /***按键按下一次,led向左移位***/
- if (KEY2== 0) //运算赋值,判断按键是否有被按下
- {
- Delay_ms(10);
- if (KEY2== 0)
- {
- printf("按键P33已经按下,LED取反一次\r\n");
- P40 = 0;
- P6 = ((P6<<1)+1);
- if (P6 = 0XFF)
- P6 =0XFE ;
- while(KEY2 == 0) //如果按键一直是按下的,一直执行while
- {
-
- }
- }
- }
复制代码
另解:
- u8 LED_Data = 0xfe
- P6 = LED_Data;
- if (KEY2== 0) //运算赋值,判断按键是否有被按下
- {
- Delay_ms(10);
- if (KEY2== 0)
- {
- printf("按键P33已经按下,LED\r\n");
- P40 = 0;
- LED_Data = ((LED_Data<<1)+1);
- if (LED_Data = 0XFF) //本来是直接输出P6,先计算,后输出
- LED_Data =0XFE ;
-
- P6=LED_Data
- while(KEY2 == 0) //如果按键一直是按下的,一直执行while
- {
-
- }
- }
- }
-
- /*初始状态
- 1111 1110——111 1110 0——11 1110 00
- 要想后面不补0——在左移位后+1
- 1111 1110——1111 1101——1111 1011
- 问题:后面全熄灭
- 增加判断语句
- 1111 1101
- 1111 1011 */
复制代码
四.数组的使用
举例:
- /***P32按键按下一次,led向右移位***/
- P6=0XFE; delay_ms(500);
- P6=0XFD; delay_ms(500);
- P6=0XFB; delay_ms(500);
- P6=0XF7; delay_ms(500);
- P6=0XEF; delay_ms(500);
- P6=0XDF; delay_ms(500);
- P6=0XBF; delay_ms(500);
- P6=0X7F; delay_ms(500);
- /*1111 1110 0XFE
- 1111 1101 0XFD
- 1111 1011 0XFB
- 1111 0111 0XF7
- 1110 1111 0XEF
- 1101 1111 0XDF
- 1011 1111 0XBF
- 0111 1111 0X7F
复制代码
而用数组,便可以解决以上问题
数组使用分为如下三步:
1.定义
类型 名称[长度] = { 数值 };
2.使用
赋值:名称[索引] = 数值
在void main ()定义
- u8_LED_DataTab[8]={0XFE,0XFD,0xFB,0XF7,0XEF,0XDF,0XBF,0X7F};
- /***P32按键按下一次,led向右移位***/
- P6=LED_DataTab[num]; delay_ms(500);
- num++;
- if (num>7)
- num = 0; //数组实现流水灯
- LED_DataTab[2] = 0XFE;
- //索引数组 数字-1
复制代码
总结:
1.学会掌握按键的用法
2.掌握数组
课后练习:按下按键,切换led输出不同的效果。 |