• 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. }

  • 相关阅读:
    流量再利用!佳信客服准备的企微拉新复购攻略来袭!
    定积分的应用:几何应用与物理应用
    掌动智能云网络流量分析的重要性
    【我的世界Minecraft-MC】常见及各种指令大杂烩【2022.8版】
    Spring Security 从入门到精通之获取认证用户信息(四)
    C++音视频开发技能树(初级)
    jmeter连接达梦DM8数据库
    计算机网络-应用层详解(持续更新中)
    使用 gpg 对Linux下的文件加密
    sql语句-如何以一个表中的数据为条件据查询另一个表中的数据
  • 原文地址:https://blog.csdn.net/2301_78922485/article/details/140347891