• 单片机-控制按键点亮LED灯


    1、按键电路图

    定义四个按键引脚 

    1、按键按下 为 输入为低电平

    2、按键不按下 IO有上拉电阻,为高电平

    // 定义 按键的 管教
    sbit KEY1 = P3^1;
    sbit KEY2 = P3^0;
    sbit KEY3 = P3^2;
    sbit KEY4 = P3^3;

    2、LED灯电路图

    LED 输出高电平为亮

    // 定义LED灯 管教
    sbit LED1 = P2^0;
    sbit LED2 = P2^1;
    sbit LED3 = P2^2;
    sbit LED4 = P2^3;

    3、编程思想设计

    1、定义按键管教

    2、定义LED灯管教

    3、定义按键的键值

    4、定义一个函数 来判断按键是否被按下

    5、先判断 按键是否被按下--> 在判断没有按下按键怎么样-->否则返回 没有按下

    static u8 key =1;  // 定义一个不被改变的u8 类型的 变量 key 赋值为1 
    if(mode)key=1;       // 连续扫描按键,这里给 是单词扫描为0 ,多次扫描为1

    if(key=1 && (KEY1==0 || KEY2==0 || KEY3==0 || KEY4==0))  // key1 ==0 为按下, 为什么用 || 或运算符 只有有一个为真,就是那个按键按下了

    1. #include "reg52.h"
    2. // 重新命名类型
    3. typedef unsigned char u8;
    4. typedef unsigned int u16;
    5. // 定义 按键的 管教
    6. sbit KEY1 = P3^1;
    7. sbit KEY2 = P3^0;
    8. sbit KEY3 = P3^2;
    9. sbit KEY4 = P3^3;
    10. // 定义LED灯 管教
    11. sbit LED1 = P2^0;
    12. sbit LED2 = P2^1;
    13. sbit LED3 = P2^2;
    14. sbit LED4 = P2^3;
    15. // 使用宏定义独立按键按下的键值
    16. #define KEY1_PRESS 1
    17. #define KEY2_PRESS 2
    18. #define KEY3_PRESS 3
    19. #define KEY4_PRESS 4
    20. #define KEY_UNPRESS 0
    21. // 延时函数
    22. void delay_times(u16 times)
    23. {
    24. while(times--);
    25. }
    26. // 按键函数
    27. u8 key_scan(u8 mode)
    28. {
    29. static u8 key =1; // 定义一个不被改变的u8 类型的 变量 key 赋值为1
    30. if(mode)key=1; // 连续扫描按键,这里给 是单词扫描为0 ,多次扫描为1
    31. if(key=1 && (KEY1==0 || KEY2==0 || KEY3==0 || KEY4==0)) // key1 ==0 为按下, 为什么用 || 或运算符 只有有一个为真,就是那个按键按下了
    32. {
    33. delay_times(1000); // 消抖 1000us = 10 ms
    34. key =0;
    35. if(KEY1 == 0)
    36. {
    37. return KEY1_PRESS;
    38. }
    39. else if(KEY2 == 0)
    40. {
    41. return KEY2_PRESS;
    42. }
    43. else if(KEY3 == 0)
    44. {
    45. return KEY3_PRESS;
    46. }
    47. else if(KEY4 == 0)
    48. {
    49. return KEY4_PRESS;
    50. }
    51. }
    52. else if(KEY1 ==1 && KEY2 ==1 && KEY3 == 1 && KEY4 ==1) // 这里是判断 按键没有被按下,为什么用 && 与运算 只要条件都为真,那就都为真
    53. {
    54. key =1;
    55. }
    56. return KEY_UNPRESS;
    57. }
    58. // 主函数
    59. void main()
    60. {
    61. u8 key=0;
    62. while(1)
    63. {
    64. key=key_scan(1); // key_scan 有返回值需要被接收
    65. if(key==KEY1_PRESS)
    66. LED1=~LED1; // LED1灯 取反 发光
    67. else if(key==KEY2_PRESS)
    68. LED2=~LED2;
    69. else if(key==KEY3_PRESS)
    70. LED3=~LED3;
    71. else if(key==KEY4_PRESS)
    72. LED4=~LED4;
    73. }
    74. }

    4、实现效果

  • 相关阅读:
    电子电气架构设计之三电系统设计
    【无标题】
    xss-labs靶场1-5关
    网络协议:包丢失&物理层&数据链路层
    Python学习基础笔记九——集合
    2022 CVPR 三维人体重建相关论文汇总(3D Human Reconstruction)
    树莓派Ubuntu20.04设置静态IP后无法联网的问题及解决
    小学生python编程--红包雨
    TS泛型的使用
    程序员必看内容连续集之 SpringBoot05 整合Druid&Redis
  • 原文地址:https://blog.csdn.net/m0_68021259/article/details/132637917