按键

五、按键

按键原理图

普通键盘

原理:按键未按下是低电平,按下的时候变为低电平

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//按键
sbit K1 = P2^0;
sbit K2 = P2^1;
sbit K3 = P2^2;
sbit K4 = P2^3;
//显示相关寄存器
sbit K13 = P1^3;
sbit wela = P1^5;
sbit dula = P1^4;
//段选 0~9
uint table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//位选 1~8
uchar positions[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
//函数声明
void delay();
void display(int position, int n);
/**
 *当分别按下K17到K20,分别显示0到3
 */
void main()
{
  
    P2 = 0xFF;
    while(1)
    {
      //按键一
      if(K1 == 0)
      {
          delay();
          if(K1 ==0) display(0,1);          
      }
      
      //按键二
       if(K2 == 0)
      {
          delay();
          if(K2 ==0) display(1,2);        
      }
      
      //按键三
       if(K3 == 0)
      {
          delay();
          if(K3 ==0) display(2,3);          
      }
      
      //按键四
       if(K4== 0)
      {
          delay();
          if(K4 ==0) display(3,4);          
      }
        
    }   
}

//数码管显示
void display(int position, int n)
{
    //异常检查
    if(n < 0 || n > 17) return ;    
    if(position < 0 || position > 7) return ;
    
    //“总开关”打开
    K13 = 0;
    
    //消隐
    dula = 1;
    P0 = 0x00;
    dula = 0;
    
    //位选
    P0 = positions[position];
    wela = 1;//高电平数据直通    
    wela = 0;//低电平锁存 
    
    //段选  
    P0 = table[n]; 
    dula = 1;
}

//延时
void delay()
{
    int x,y;
    for (x = 10;x > 0; x--)
        for (y = 110;y > 0;y--);
}

矩阵键盘

原理:

代码理解

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//按键
sbit K20 = P2^0;
sbit K21 = P2^1;
sbit K22 = P2^2;
//段选 0~9
uint table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//位选 1~8
uchar positions[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
void display(int position, int n);
void delay();
//K1~K16分别显示0~F
void main(){
  unsigned char x;
    P2 = 0xFF;
    while(1){
        /* K1~K4*/
      P2 = positions[0];//0xFE
        x = P2 & 0xF0;
        if(x != 0xF0)
        {
            delay();
            if(x != 0xF0)
            {
                switch (x)
                {
                	case 0xE0:
                        display(0,0);
                		break;
                	case 0xD0:
                        display(1,1);
                		break;
                    case 0xB0:
                        display(2,2);
                		break;
                	default:
                        display(3,3);
                		break;
                }
            }         
        }
        /* K5~K8*/
        delay();
        P2 = positions[1];//0xFD
        x = P2 & 0xF0;
        if(x != 0xF0)
        {
            delay();
            if(x != 0xF0){
                switch (x)
                {
                	case 0xE0:
                        display(4,4);
                		break;
                	case 0xD0:
                        display(5,5);
                		break;
                    case 0xB0:
                        display(6,6);
                		break;
                	default:
                        display(7,7);
                		break;
                }
            }         
        }
        /* K8~K12*/
         delay();
        P2 = positions[2];//0xFB
        x = P2 & 0xF0;
        if(x != 0xF0)
        {
            delay();
            if(x != 0xF0)
            {
                switch (x)
                {
                	case 0xE0:
                        display(0,8);
                		break;
                	case 0xD0:
                        display(1,9);
                		break;
                    case 0xB0:
                        display(2,10);
                		break;
                	default:
                        display(3,11);
                		break;
                }
            }         
        }
        /* K12~K16*/
       delay();
        P2 = positions[3];//0xF7
        x = P2 & 0xF0;
        if(x != 0xF0)
        {
            delay();
            if(x != 0xF0)
            {
                switch (x)
                {
                	case 0xE0:
                        display(4,12);
                		break;
                	case 0xD0:
                        display(5,13);
                		break;
                    case 0xB0:
                        display(6,14);
                		break;
                	default:
                        display(7,15);
                		break;
                }
            }         
        }
    }   
}

//显示
void display(int position, int n)
{
    K13 = 0;   
    //位选
    K15 = 1;//高电平数据直通 
    P0 = positions[position];//1111 1110
    K15 = 0;//低电平锁存 
    
    //段选
    P0 = table[n]; //0000 0110    
    K14 = 1;
    K14 = 0;
}

//延时
void delay()
{
    int x,y;
    for (x = 10;x > 0; x--)
        for (y = 110;y > 0;y--);
}
posted @ 2021-09-04 01:40  六月琳  阅读(24)  评论(0)    收藏  举报