矩阵键盘与六位数码管_STC90C51单片机矩阵键盘联动动态数码管

实验准备

  1. STC90C51单片机一台
  2. P2 GPIO口短接矩阵键盘JP4
  3. GPIO P0 短接动态数码管控制端573
  4. 短接138译码器和动态数码管即J15和J16

实验程序

void MatrixKeyTest(){       char  a = 0;       int v;       KEY=0x0f;//高四位为0       if(KEY != 0x0f){//设置为高四位0,底全是1,读取一下看是不是            Delay(10);            if(KEY != 0x0f){//消抖完,再次确认一下                 KEY = 0x0f; //重新开始测试,列                 switch(KEY){                     case(0x07): v=0;break;                     case(0x0b): v=1;break;                     case(0x0d): v=2;break;                     case(0x0e): v=3;break;                            }                 KEY = 0xf0; //行                 switch(KEY){                     case(0x70): v=v;break;                     case(0xb0): v=v + 4;break;                     case(0xd0): v=v + 8;break;                     case(0xe0): v=v + 12;break;                 }            //留大概半秒左右的松手检测,代表着 半秒按键间歇, 不会变化状态,实际上也不需要,因为不检测,只不过会继续循环而已                while(a<50&&KEY!=0xf0){                            Delay(20);                           a++;                 }                  while(KEY == 0xf0){                          LedOn2(1,(v+1)%10);                          if(v+1>9){                               LedOn2(0,(v+1)/10);                          }                 }                     }            }} 

实验程序讲解

矩阵键盘采用行列式扫描,获得案件的序号,即程序中的v。详细过程: 先经过列扫描,得到v列有按钮被选中。然后进行行扫描,得到某行按钮被按下。将列加上行*4(因为每一行一共四个按钮)即得到按钮的序号。按钮的序号通过LedOn2函数点亮动态数码管。第一个参数代表点亮第几个数码管。第二个参数代表具体的数值。详细代码如下:

void LedOn2(int i,int j){     switch(i){                   case(0):                LSA=0;LSB=0;LSC=0; break;//显示第0位                case(1):                LSA=1;LSB=0;LSC=0; break;//显示第1位                case(2):                LSA=0;LSB=1;LSC=0; break;//显示第2位                case(3):                LSA=1;LSB=1;LSC=0; break;//显示第3位                case(4):                LSA=0;LSB=0;LSC=1; break;//显示第4位                case(5):                LSA=1;LSB=0;LSC=1; break;//显示第5位                case(6):                LSA=0;LSB=1;LSC=1; break;//显示第6位                case(7):                LSA=1;LSB=1;LSC=1; break;//显示第7位         }     DIG = DIG_CODEHEX[j];     j = 10;     while(j--);     DIG=0x00;}

其中LSA、LSB、LSC代表着138译码器的sbit,可以根据需要自己定义对应的GPIO口。最后一行是为了消隐,防止当前代码显示到其他的数码管上,可以自己做实验观察差别。

附录

数码管位码:

unsigned char code DIG_CODEHEX[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

274742d5372dab307b3ecdd969ad5a22.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值