实验准备
STC90C51单片机一台P2GPIO口短接矩阵键盘JP4GPIOP0短接动态数码管控制端短接译码器和动态数码管即J15和J16实验程序
voidMatrixKeyTest(){ chara=0; intv; 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(a50KEY!=0xf0){ Delay(20);a++; } while(KEY==0xf0){ LedOn2(1,(v+1)%10);if(v+19){ LedOn2(0,(v+1)/10);} }} }}
实验程序讲解
矩阵键盘采用行列式扫描,获得案件的序号,即程序中的v。详细过程:先经过列扫描,得到v列有按钮被选中。然后进行行扫描,得到某行按钮被按下。将列加上行*4(因为每一行一共四个按钮)即得到按钮的序号。按钮的序号通过LedOn2函数点亮动态数码管。 个参数代表点亮第几个数码管。第二个参数代表具体的数值。详细代码如下:
voidLedOn2(inti,intj){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代表着译码器的sbit,可以根据需要自己定义对应的GPIO口。 一行是为了消隐,防止当前代码显示到其他的数码管上,可以自己做实验观察差别。
附录
数码管位码:
unsignedcharcodeDIG_CODEHEX[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
转载请注明地址:http://www.abmjc.com/zcmbwh/1729.html