欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

单片机学习笔记(五)—— 键盘

发布时间:2024/3/13 49 豆豆
生活随笔 收集整理的这篇文章主要介绍了 单片机学习笔记(五)—— 键盘 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
1、键盘的分类         · 编码式键盘
        · 非编码式键盘

        编码式键盘:键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值。(如:计算机键盘)
    非编码式键盘:软件编程来识别。(单片机中使用最多)

2、非编码式键盘
    · 独立键盘
    · 矩阵键盘

    (1)独立键盘

原理:当按键被按下时,P3.4 / P3.7 将会与 GND 连通,即为低电平(0);

随手代码:    
  • #include<reg52.h>
  • #define uint unsigned int
  • #define uchar unsigned char
  • sbit d1=P1^0;
  • sbit dula=P2^6; //数码管段选信号
  • sbit wela=P2^7; //数码管位选信号
  • sbit key1=P3^4; //独立按键key1
  • uchar code table[]={ //数码管显示编码
  • 0x3f,0x06,0x5b,0x4f,
  • 0x66,0x6d,0x7d,0x07,
  • 0x7f,0x6f,0x77,0x7c,
  • 0x39,0x5e,0x79,0x71};
  • uchar num;
  • void delay(uint z) //延时 (防抖)
  • {
  • uint x,y;
  • for(x=z;x>0;x--)
  • for(y=110;y>0;y--);
  • }
  • void main()
  • {
  • wela=1;
  • P0=0xfe; //打开低一数码管
  • wela=0;
  • P3=0xff;
  • while(1)
  • {
  • if(key1==0) //监听按键是否被按下
  • {
  • delay(5);//延时5ms (具体解释见本文尾)
  • if(key1==0)//再次确认按键是否被按下
  • {
  • d1=0;
  • num++;
  • if(num==10)
  • num=0;
  • }
  • while(!key1);//松手监测
  • delay(5);
  • while(!key1);//再次确认是否松手
  • }
  • else
  • d1=1;
  • dula=1;
  • P0=table[num];//数码管显示
  • dula=0;
  • }
  • }
  • (2)矩阵键盘          通常,矩阵式键盘 8 个引脚接在单片机的 P3.0 ~P3.7上

    原理:(以下为第一行键盘,以此类推)     (1)将 P3 口赋值为 0xfe (1111,1110)
        (2)定义一个变量 temp = P3, 通过 temp &=  0xf0,取其高四位,判断是否有键被按下
        (3)重读 P3 口,判断是哪一个键被按下

    随手代码:
  • #include<reg52.h>
  • #define uint unsigned int
  • #define uchar unsigned char
  • sbit dula = P2 ^ 6;
  • sbit wela = P2 ^ 7;
  • uchar code table[]={
  • 0x3f,0x06,0x5b,0x4f,
  • 0x66,0x6d,0x7d,0x07,
  • 0x7f,0x6f,0x77,0x7c,
  • 0x39,0x5e,0x79,0x71,0};
  • uchar num,temp,num1;
  • void delay(uint z)
  • {
  • uint x,y;
  • for(x = z; x > 0; x--)
  • for(y = 110; y > 0; y--);
  • }
  • uchar keyscan();
  • void display(uchar aa);
  • void main()
  • {
  • num = 17;
  • dula = 1;
  • P0 = 0;
  • dula = 0;
  • wela = 1;
  • P0 = 0xc0;
  • wela = 0;
  • while(1)
  • {
  • display(keyscan());
  • }
  • }
  • void display(uchar aa)//数码管显示
  • {
  • dula = 1;
  • P0 = table[ aa - 1 ];
  • dula = 0;
  • }
  • uchar keyscan()
  • {
  • P3 = 0xfe;
  • temp = P3;
  • temp = temp & 0xf0;
  • while(temp != 0xf0)//防抖
  • {
  • delay(5);
  • temp = P3;
  • temp = temp & 0xf0;
  • while(temp != 0xf0)
  • {
  • temp = P3;
  • switch(temp)
  • {
  • case 0xee: num = 1;
  • break;
  • case 0xde: num = 2;
  • break;
  • case 0xbe: num = 3;
  • break;
  • case 0x7e: num = 4;
  • break;
  • }
  • while(temp != 0xf0)//松手监测
  • {
  • temp=P3;
  • temp=temp&0xf0;
  • }
  • }
  • }
  • P3 = 0xfd;
  • temp = P3;
  • temp = temp & 0xf0;
  • while(temp != 0xf0)
  • {
  • delay(5);
  • temp = P3;
  • temp = temp & 0xf0;
  • while(temp != 0xf0)
  • {
  • temp = P3;
  • switch(temp)
  • {
  • case 0xed: num = 5;
  • break;
  • case 0xdd: num = 6;
  •     break;
  • case 0xbd: num = 7;
  • break;
  • case 0x7d: num = 8;
  • break;
  • }
  • while(temp != 0xf0)
  • {
  • temp = P3;
  • temp = temp & 0xf0;
  • }
  • }
  • }
  • P3 = 0xfb;
  • temp = P3;
  • temp = temp & 0xf0;
  • while(temp != 0xf0)
  • {
  • delay(5);
  • temp = P3;
  • temp = temp & 0xf0;
  • while(temp != 0xf0)
  • {
  • temp = P3;
  • switch(temp)
  • {
  •      case 0xeb: num = 9;
  • break;
  • case 0xdb: num = 10;
  • break;
  • case 0xbb: num = 11;
  • break;
  • case 0x7b: num = 12;
  • break;
  • }
  • while(temp != 0xf0)
  • {
  • temp = P3;
  •     temp = temp & 0xf0;
  • }
  • }
  • }
  • P3 = 0xf7;
  • temp = P3;
  • temp = temp & 0xf0;
  • while(temp != 0xf0)
  • {
  • delay(5);
  • temp = P3;
  • temp = temp & 0xf0;
  • while(temp != 0xf0)
  • {
  • temp = P3;
  • switch(temp)
  • {
  • case 0xe7: num = 13;
  • break;
  • case 0xd7: num = 14;
  • break;
  • case 0xb7: num = 15;
  • break;
  • case 0x77: num = 16;
  • break;
  • }
  •     while(temp != 0xf0)
  • {
  • temp = P3;
  • temp = temp & 0xf0;
  • }
  • }
  • }
  •     return num;
  • }
  • 3、抖动现象         按键在闭合和断开时,触点会存在抖动现象

     图  1                                                                   图  2          如图1,我们可以在 delay(5)后,重新读取,可消除抖动; 图2是硬件防抖

    总结

    以上是生活随笔为你收集整理的单片机学习笔记(五)—— 键盘的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。