4*4矩阵按键线翻转法详解

发布于:2024-05-10 ⋅ 阅读:(34) ⋅ 点赞:(0)

#include <reg52.h>

typedef unsigned int u16;                  //重新定义系统默认函数
typedef unsigned char u8;

#define SMG_A_DP_PORT       P0              //使用宏定义数码管段码端口为P0
#define KEY_MATRIX_PORT        P1              //使用宏定义矩阵按键控制端口为P1

//共阴数码管段0-F码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//延时函数
void delay_10us(u16 ten_us)
{
  while(ten_us--);
}

//矩阵按键线翻转法扫描
u8 key_matrix_flipa_scan(void)
{
       static u8 key_value=0;      //定义一个数组变量并赋初值
     KEY_MATRIX_PORT=0x0f;   //给所以行赋值为0,其余为1
     if(KEY_MATRIX_PORT!=0x0f)           //判断按键是否按下
     {
       delay_10us(1000);                  //消抖100ms
       if(KEY_MATRIX_PORT!=0x0f)           //再次判断按键是否按下
       {
       //测试列
         KEY_MATRIX_PORT=0x0f;               //给按键控制端口赋初值
         switch(KEY_MATRIX_PORT)           //保存按键行为0,按下后的值
         {
           case 0x07:key_value=1;break;
           case 0x0b:key_value=2;break;
           case 0x0d:key_value=3;break;
           case 0x0e:key_value=4;break;
         }
        //测试行
         KEY_MATRIX_PORT=0xf0;            //给按键控制端口赋初值
         switch(KEY_MATRIX_PORT)         //保存按键行为1,按下后的值
         { 
           case 0x70:key_value=key_value;break;
           case 0xb0:key_value=key_value+4;break;
           case 0xd0:key_value=key_value+8;break;
           case 0xe0:key_value=key_value+12;break;
         }
         while(KEY_MATRIX_PORT!=0xf0);         //等待按键松开
        }
       }
    else 
        key_value=0;
    return key_value;
}

//数码管显示主函数
void main()
{
  u8 key=0;                               //
  key=key_matrix_flipa_scan();
  if(key!=0)
      SMG_A_DP_PORT=gsmg_code[key-1];
}
 


网站公告

今日签到

点亮在社区的每一天
去签到