IT评测·应用市场-qidao123.com

标题: 51单片机教程(十)- 独立按键输入 [打印本页]

作者: 农妇山泉一亩田    时间: 2024-12-2 15:04
标题: 51单片机教程(十)- 独立按键输入
1、项目分析


2、技能准备

1 独立键盘输入




2 认识按键


3 按键分类


1. 独立按键


2. 矩阵按键


1. 逐列扫描法

2. 行列反转法

3 按键抖动




4 按键原理图





3、项目实现

1 1个按键控制1个LED灯亮灭



2 4个按键控制4个LED灯




3 按键控制数码管显示




  1. #include <reg52.h>
  2. #include "delay.h"
  3. #define uint unsigned int
  4. // 定义位选与段选
  5. #define pos P2
  6. #define par P0
  7. // 定义端口:4个按键/LED
  8. sbit key2 = P3^4;
  9. sbit key3 = P3^5;
  10. sbit key4 = P3^6;
  11. sbit key5 = P3^7;
  12. // 定义按键的取值
  13. #define KEY2_PRESS 2
  14. #define KEY3_PRESS 3
  15. #define KEY4_PRESS 4
  16. #define KEY5_PRESS 5
  17. #define KEY_UNPRESS 0
  18. // 分别对应:0/1/2/3/4/5/6/7/8/9
  19. uint par_value[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
  20. // 记录数码管显示值
  21. uint number = 3;
  22. uint ge, shi;
  23. uint keyScan(uint mode);
  24. void delay(uint v);
  25. void main()
  26. {
  27.         while(1)
  28.         {       
  29.                 uint key_value = keyScan(0);
  30.                
  31.                 // 判断对应的按键来控制数值是否越界控制
  32.                 if(key_value == KEY2_PRESS)
  33.                 {
  34.                         if(number == 99)
  35.                         {
  36.                                 number = 99;
  37.                         }else{
  38.                                 number++;
  39.                         }
  40.                 }
  41.                 else if(key_value == KEY3_PRESS)
  42.                 {
  43.                         if(number == 0)
  44.                         {
  45.                                 number = 0;
  46.                         }else{
  47.                                 number--;
  48.                         }
  49.                 }
  50.                 else if(key_value == KEY4_PRESS)
  51.                 {
  52.                         number = 0;
  53.                 }
  54.                
  55.                 shi = number / 10;
  56.                 ge = number % 10;
  57.                        
  58.                 // 显示十位
  59.                 pos = 0x18;
  60.                 par = par_value[shi];
  61.                 delay(100);
  62.                
  63.                 // 显示个位
  64.                 pos = 0x28;
  65.                 par = par_value[ge];
  66.                 delay(100);
  67.         }
  68. }
  69. uint keyScan(uint mode)
  70. {
  71.         // 定义按键的初始状态值
  72.         static uint key = 1;
  73.        
  74.         // 对模式的判断
  75.         if(mode) key=1;
  76.        
  77.         // 判断4个按键中是否按下
  78.         if(key==1 && (key2 == 0 || key3 == 0 || key4 == 0 || key5 == 0))
  79.         {
  80.                 // 消抖
  81.                 delay(5000);
  82.                 key = 0;
  83.                
  84.                 // 判断具体是哪个按键按下
  85.                 if(key2 == 0) return KEY2_PRESS;  // return 2
  86.                 if(key3 == 0) return KEY3_PRESS;  // return 3
  87.                 if(key4 == 0) return KEY4_PRESS;  // return 4
  88.                 if(key5 == 0) return KEY5_PRESS;  // return 5
  89.         }else if(key2 == 1 && key3 == 1 && key4 == 1 && key5 == 1){
  90.                 key = 1;
  91.         }
  92.         return KEY_UNPRESS;
  93. }
  94. // 延迟函数
  95. void delay(unsigned int v)
  96. {
  97.         while(v--);
  98. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4