51单片机独立按键控制数码管代码(STC90C51单片机矩阵键盘联动动态数码管)
实验准备
- STC90C51单片机一台
- P2 GPIO口短接矩阵键盘JP4
- GPIO P0 短接动态数码管控制端573
- 短接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));
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};
,
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com