lesson5~键盘

1.键盘的分类:

①键盘分编码键盘和非编码键盘。键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘;

②而靠软件编程来识别的称为非编码键盘;

③在单片机组成的各种系统中,用的最多的是非编码键盘。也有用到编码键盘的.

非编码键盘又分为:独立键盘和行列式(又称为矩阵式)键盘

2.用键盘上的一个键控制第一个LED灯的开关:

#include<reg52.h>
sbit d1 = P1^0;
sbit key1 = P3^4;//p3^4是S2的IO口将S2键命名为key1
void main()
{
        while(1)
        {
            if(key1 == 0)//当S2键按下时key1为低电平0
                d1 = 0;//第一个LED灯亮
            else //只要S2没有按下则第一个LED灯关闭
                d1 = 1;
        }
}

3.抖动现象:

刚刚的程序比较简单,键盘的抖动对其没有太大的影响,什么是键盘抖动呢?

按键在闭合和断开时,触点会存在抖动现象:

这里写图片描述

4.抖动现象的影响及消除:

例程序如下:(每次点亮LED 灯的同时用数码管计数)

#include<reg52.h>
sbit d1 = P1^0;
sbit key1 = P3^4;//p3^4为S2的IO口
sbit wela = P2^7;
sbit dula = P2^6;
unsigned int temp,ge,shi;
unsigned char code table[] = {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void display(int temp);
void delay(int c)
{
    int a,b;
    for(a=100;a>0;a--)
        for(b=c;b>0;b--);
}

void main()
{
    temp=0;
    display(temp);
        while(1)
        {
            if(key1 == 0)
            {
                d1 = 0;
                temp++;
             while(!key1);//按键的消抖:若S2键按下,key1 = 0,while循环永真;若S2松开,key1 = 1;退出while循环
            }
            else 
            {
                d1 = 1;
            }

            display(temp);
        }
}
void display(int temp)
{
    if(temp < 10)
    {
            wela = 1;
            P0 = 0xfe;
            wela = 0;
        dula = 1;
        P0 = table[temp];
        dula = 0;
    }
    if(temp >= 10)
    {
        ge = temp%10;
        shi = temp/10;
            wela = 1;
            P0 = 0xfe; 
            wela = 0;       
        dula = 1;
        P0 = table[shi];
        dula = 0;
        delay(1);
            wela = 1;
            P0 = 0xfd;
            wela = 0;       
        dula = 1;
        P0 = table[ge];
        dula = 0;
        delay(1);
    }
}

5.键盘的结构:

这里写图片描述

键盘识别方法:

识别按键的方法很多其中,最常见的方法是扫描法:

按键按下时,与此键相连的行线与列线导通,行线在无按键按下时处在高电平。如果所有的列线都处在高电平,则按键按下与否不会引起行线电平的变化,因此必须使所有列线处在电平。这样,当有按键按下时,改键所在的行电平才回由高变低。才能判断相应的行有键按下。
独立按键数量少,可根据实际需要灵活编码。矩阵键盘,按键的位置由行号和列号唯一确定,因此可以分别对行号和列号进行二进制编码,然后两值合成一个字节,高4位是行号,低4位是列号。

例程序如下:

此程序将第一排键盘定义为0,1,2,3;按不同的键数码管上显示不同的数字.

#include<reg52.h>
sbit wela = P2^7;
sbit dula = P2^6;
unsigned char temp,num;
unsigned char code table[] = {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};//显示的字符
void delay(int c)
{
    int a,b;
    for(a=100;a>0;a--)
        for(b=c;b>0;b--);
}//延时子程序

void main()
{
    wela = 1;
    P0 = 0xc0;//将所有的数码管设置为打开状态.
    wela = 0;
    dula = 1;
    P0 = 0;//开始时数码管不显示任何字符.
    dula = 0;
    while(1)
    {
        P3 = 0xfe;//将P3即键盘的IO口初始化为0xfe 即1111 1110 意为将第一排的键盘设置为低电平.

        temp = P3;//若有按键变化则将P3的变化保存到temp中.

        temp = temp&0xf0;//将temp和0xf0进行与运算(假如按下了第一个键S6,则temp就变为了0xee 1110 1110) 
               /*与运算是将对应位进行运算,相同则同,不同则为0*/
        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;
                }
                dula = 1;
                P0 = table[num-1];//显示对应的字符
                dula = 0;
            }
        }
    }
}

6.完整的键盘编码:

编码16个键分别设置为1~f,按键盘上的前四列四行的键使数码管上显示编码的字符.

遇上一个程序不同的是:次程序中加入了松手检测,才能使程序正常运行.

#include<reg52.h>
sbit wela = P2^7;
sbit dula = P2^6;
unsigned char temp,num;
unsigned char code table[] = {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};//???????????
void delay(int c)
{
    int a,b;
    for(a=100;a>0;a--)
        for(b=c;b>0;b--);
}

void main()
{
    wela = 1;
    P0 = 0xc0;
    wela = 0;
    dula = 1;
    P0 = 0;
    dula = 0;
    while(1)
    {
        P3 = 0xfe;//0,1,2,3  
        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;//检测P3的状态,若P3仍然为按下状态则一直处于此循环中
                    temp = temp&0xf0;
                }
                dula = 1;
                P0 = table[num-1];
                dula = 0;
            }
        }
        P3 = 0xfd;//4,5,6,7
        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;
                }
                dula = 1;
                P0 = table[num-1];
                dula = 0;
            }
        }
        P3 = 0xfb;//8,9,a,b
        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;
                }
                dula = 1;
                P0 = table[num-1];
                dula = 0;
            }
        }
        P3 = 0xf7;//c,d,e,f
        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;
                }
                dula = 1;
                P0 = table[num-1];
                dula = 0;
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值