【51单片机】开发板上矩阵键盘键码在数码管上的显示,按下键盘在数码管上显示对应段码

简介: 【51单片机】开发板上矩阵键盘键码在数码管上的显示,按下键盘在数码管上显示对应段码

实验内容:

利用所学的单片机知识及电路知识编程实现单片机 I/O 口检测矩阵键盘的输入电平。选中 8 位数码管的其中一位数码管,当逐个按下 4*4 矩阵键盘的按键,数码管依次显示 0—F。

开发板中数码管采用的是共阴极数码管。原理图如下:

138译码器连接数码管的位选端,由P22\P23\P24进行位选;由8个P0口进行段选。

矩阵键盘连接在单片机的八个P1引脚 ,P10\P11\P12\P13连接键盘的列;P14\P15\P16\P17连接键盘的行,采用扫描法进行矩阵键盘的扫描,再将扫描到的按键生成对应的键码返回给单片机,由单片机对不同的键码进行处理,在数码管上显示相应的数码(0—f)。

代码如下:

#include <REGX51.H>
#define SEG1 P2_4 = 1;P2_3 = 1;P2_2 = 1//选中数码管第1位 显示
#define SEG2 P2_4 = 1;P2_3 = 1;P2_2 = 0//选中数码管第2位 显示
#define SEG3 P2_4 = 1;P2_3 = 0;P2_2 = 1//选中数码管第3位 显示
#define SEG4 P2_4 = 1;P2_3 = 0;P2_2 = 0//选中数码管第4位 显示
#define SEG5 P2_4 = 0;P2_3 = 1;P2_2 = 1//选中数码管第5位 显示
#define SEG6 P2_4 = 0;P2_3 = 1;P2_2 = 0//选中数码管第6位 显示
#define SEG7 P2_4 = 0;P2_3 = 0;P2_2 = 1//选中数码管第7位 显示
#define SEG8 P2_4 = 0;P2_3 = 0;P2_2 = 0//选中数码管第8位 显示
char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //共阴数码管编码
 
void Delay(unsigned int xms){
  unsigned char i, j;
  while(xms--){
    i = 2;
    j = 239;
    do{
      while (--j);
    } while (--i);
  }
}
 
void MatrixKey(unsigned char *x)//如果不想用指针 那就用全局变量
{//矩阵键盘逐行扫描,形参为指针变量
        P1=0xFF;
        P1_3=0;//选中第一列,然后扫描行
        if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);*x = 1;}
        if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);*x = 5;}
        if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);*x = 9;}
        if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);*x = 13;}
        
        P1=0xFF;
        P1_2=0;//选中第二列,然后扫描行
        if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);*x = 2;}
        if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);*x = 6;}
        if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);*x = 10;}
        if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);*x = 14;}
        
        P1=0xFF;
        P1_1=0;//选中第三列,然后扫描行
        if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);*x = 3;}
        if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);*x = 7;}
        if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);*x = 11;}
        if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);*x = 15;}
        
        P1=0xFF;
        P1_0=0;//选中第四列,然后扫描行
        if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);*x = 4;}
        if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);*x = 8;}
        if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);*x = 12;}
        if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);*x = 16;}
}
void LED_Display(char Number){
  SEG1; //选中数码管第一位 显示
  P0 = table[Number-1];
}
void main(){
    unsigned char num=17;
  while(1){
        MatrixKey(&num);//将地址传给形参的指针变量,复习指针
    LED_Display(num);
  }
}

效果图:

相关文章
|
4月前
【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯
【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯
339 1
|
4月前
51单片机汇编语言点亮一位数码管,并计时(超详细分析汇编语言)
51单片机汇编语言点亮一位数码管,并计时(超详细分析汇编语言)
209 0
|
4月前
|
算法
51单片机不用定时器的数码管倒计时
51单片机不用定时器的数码管倒计时
|
7月前
|
传感器
51单片机矩阵键盘超详解!(内含LCD1602代码)
51单片机矩阵键盘超详解!(内含LCD1602代码)
【51单片机】初学者必学的一个矩阵键盘基本项目——(读矩阵键盘的数字显示在LCD屏上)(7)
【51单片机】初学者必学的一个矩阵键盘基本项目——(读矩阵键盘的数字显示在LCD屏上)(7)
|
7月前
|
数据安全/隐私保护
【51单片机】初学者必学的一个矩阵键盘基本项目——(矩阵键盘密码锁)(8)
【51单片机】初学者必学的一个矩阵键盘基本项目——(矩阵键盘密码锁)(8)
【51单片机】自定义动态数码管显示(设计思路&原理&代码演示)
【51单片机】自定义动态数码管显示(设计思路&原理&代码演示)
【51单片机】自定义静态数码管显示(设计思路&代码演示)
【51单片机】自定义静态数码管显示(设计思路&代码演示)
【51单片机】静态数码管显示(设计思路&原理&代码演示)
【51单片机】静态数码管显示(设计思路&原理&代码演示)
|
7月前
|
芯片 数据格式
【51单片机】要实现动静态数码管,你首先需要知道这些【数码管项目前置知识】
【51单片机】要实现动静态数码管,你首先需要知道这些【数码管项目前置知识】