• 51单片机-第三节-LCD1602调试工具,矩阵键盘


    一、LCD调试工具函数:

    使用:

    所有函数,前两个参数,均为指定显示位置。

    四个参数的,第四个参数,为保留位数,少的保留后面(123,2 -> 23),多的前面补零。

    二、矩阵键盘:

    1.矩阵键盘的原理:

    通过行和列来具体检测每个按键的情况:

    如电脑分辨率1920*1080个LED,只需1920+1080个接口即可控制。

    单片机中,16个按键只需8个接口(4行+4列)。

    使用方法:依次给行赋值 0111,1011,1101,1110,每次赋值后检测列的状态,列为0说明接通了。

    2. 矩阵键盘判断函数封装:

    1. /*
    2. 用途:读取矩阵键盘按键键码、
    3. 使用:按下按键,停留在此函数,松手返回键码,没按下返回0。
    4. */
    5. unsigned char MatrixKey()
    6. {
    7. unsigned char KeyNumber = 0;
    8. //第一列
    9. P1 = 0xFF;
    10. P1_3 = 0;
    11. if (P1_7 == 0) { Delay(20); while (P1_7 == 0); Delay(20); KeyNumber = 1; }
    12. if (P1_6 == 0) { Delay(20); while (P1_6 == 0); Delay(20); KeyNumber = 5; }
    13. if (P1_5 == 0) { Delay(20); while (P1_5 == 0); Delay(20); KeyNumber = 9; }
    14. if (P1_4 == 0) { Delay(20); while (P1_4 == 0); Delay(20); KeyNumber = 13; }
    15. //第二列
    16. P1 = 0xFF;
    17. P1_2 = 0;
    18. if (P1_7 == 0) { Delay(20); while (P1_7 == 0); Delay(20); KeyNumber = 2; }
    19. if (P1_6 == 0) { Delay(20); while (P1_6 == 0); Delay(20); KeyNumber = 6; }
    20. if (P1_5 == 0) { Delay(20); while (P1_5 == 0); Delay(20); KeyNumber = 10; }
    21. if (P1_4 == 0) { Delay(20); while (P1_4 == 0); Delay(20); KeyNumber = 14; }
    22. //第三列
    23. P1 = 0xFF;
    24. P1_1 = 0;
    25. if (P1_7 == 0) { Delay(20); while (P1_7 == 0); Delay(20); KeyNumber = 3; }
    26. if (P1_6 == 0) { Delay(20); while (P1_6 == 0); Delay(20); KeyNumber = 7; }
    27. if (P1_5 == 0) { Delay(20); while (P1_5 == 0); Delay(20); KeyNumber = 11; }
    28. if (P1_4 == 0) { Delay(20); while (P1_4 == 0); Delay(20); KeyNumber = 15; }
    29. //第四列
    30. P1 = 0xFF;
    31. P1_0 = 0;
    32. if (P1_7 == 0) { Delay(20); while (P1_7 == 0); Delay(20); KeyNumber = 4; }
    33. if (P1_6 == 0) { Delay(20); while (P1_6 == 0); Delay(20); KeyNumber = 8; }
    34. if (P1_5 == 0) { Delay(20); while (P1_5 == 0); Delay(20); KeyNumber = 12; }
    35. if (P1_4 == 0) { Delay(20); while (P1_4 == 0); Delay(20); KeyNumber = 16; }
    36. }

    3.实战:显示按键编号

    1. void main()
    2. {
    3. LCD_Init();
    4. LCD_ShowString(1, 1, "MatrixKey:");
    5. while (1)
    6. {
    7. int KeyNum = MatrixKey();
    8. if (KeyNum)
    9. {
    10. LCD_ShowNum(2, 1, KeyNum, 2);
    11. }
    12. }
    13. }

    4.实战:密码锁

    四位密码锁,1-9号键为对应键码,10为0,11是确认,12是清除。

    1. unsigned char KeyNum = 0;
    2. unsigned int PassWord0 = 4359;//初始密码
    3. unsigned int PassWord = 0;
    4. unsigned int Count = 0;
    5. void main()
    6. {
    7. LCD_Init();
    8. LCD_ShowString(1, 1, "PassWord:");
    9. while (1)
    10. {
    11. KeyNum = MatrixKey();
    12. if (KeyNum)
    13. {
    14. if (KeyNum <= 10 && Count < 4)//按1-10输入
    15. {
    16. PassWord *= 10;
    17. PassWord += KeyNum % 10;
    18. LCD_ShowNum(2, 1, PassWord, 4);
    19. Count++;
    20. }
    21. else if (KeyNum == 11)//按11确认
    22. {
    23. if (PassWord == PassWord0)
    24. {
    25. LCD_ShowString(1, 14, "OK ");
    26. break;
    27. }
    28. else
    29. {
    30. LCD_ShowString(1, 14, "ERR");
    31. PassWord = 0;
    32. Count = 0;
    33. LCD_ShowNum(2, 1, PassWord, 4);
    34. }
    35. }
    36. else if (KeyNum == 12)//按12取消
    37. {
    38. PassWord = 0;
    39. Count = 0;
    40. LCD_ShowNum(2, 1, PassWord, 4);
    41. }
    42. }
    43. }
    44. }

  • 相关阅读:
    机器学习1
    【C++之数组与指针2】利用指针对数组求和
    亚马逊云科技多项新功能与服务,助力各种规模的组织拥抱生成式 AI
    【校招VIP】java开源框架之nginx
    740.删除并获得点数
    HTX 与 Zebec Protocol 展开深度合作,并将以质押者的身份参与 ZBC Staking
    CentOS7 安装mysql8(离线安装)&postgresql14(在线安装)
    OpenMLDB 线上引擎资源需求预估模型,助你快速预估资源消耗
    【无标题】axios的ts封装,记录一下(Vue3项目)
    03Nginx的静态资源部署,反向代理,负载均衡,动静分离的配置
  • 原文地址:https://blog.csdn.net/2301_78922485/article/details/140347891