1、矩阵按钮控制显示(0~F)
最终仿真效果如下:
2、程序如下:
//**项目:矩阵按键控制单个数码管显示0~F**//
//**数码管类型:共阳极型**//
//**按键扫描方式:列扫描**//
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define sm_data P1
sbit c0=P2^0;
sbit c1=P2^1;
sbit c2=P2^2;
sbit c3=P2^3;
sbit c4=P2^4;
sbit c5=P2^5;
sbit c6=P2^6;
sbit c7=P2^7;
void delay1(uchar time);
uchar jianpanzhi(); //**定义按键编号**//
void display(uchar b);
void main()
{
uchar x;
//P1=0xff;
//**排除按键抖动**//
while(1)
{
x=jianpanzhi();
delay1(50);
display(x);
}
}
//**初始化P2口**//
uchar jianpanzhi()
{
uint i,a;
c4=0;
c5=0;
c6=0;
c7=0;
//**判断按键是否按下**//
if(P2!=0x0f)
{
delay1(50);
if(P2!=0x0f)
for(i=0;i<4;i++)
//**列选择**//
{
switch(i)
{
case 0:
c4=0; c5=1; c6=1; c7=1;
break;
case 1:
c4=1; c5=0; c6=1; c7=1;
break;
case 2:
c4=1; c5=1; c6=0; c7=1;
break;
case 3:
c4=1; c5=1; c6=1; c7=0;
break;
default:
break;
}
//**行选择**//
if(!c0)
{
a=i+1;
break;
}
if(!c1)
{
a=i+5;
break;
}
if(!c2)
{
a=i+9;
break;
}
if(!c3)
{
a=i+13;
break;
}
} //**列选择结束**//
} //**循环结束**//
return a;
}
void display(uchar b)
{
switch(b)
{
case 1:
sm_data=0xc0;
break;
case 2:
sm_data=0xf9;
break;
case 3:
sm_data=0xa4;
break;
case 4:
sm_data=0xb0;
break;
case 5:
sm_data=0x99;
break;
case 6:
sm_data=0x92;
break;
case 7:
sm_data=0x82;
break;
case 8:
sm_data=0xf8;
break;
case 9:
sm_data=0x80;
break;
case 10:
sm_data=0x98;
break;
case 11:
sm_data=0x88;
break;
case 12:
sm_data=0x83;
break;
case 13:
sm_data=0xc6;
break;
case 14:
sm_data=0xa1;
break;
case 15:
sm_data=0x86;
break;
case 16:
sm_data=0x8e;
break;
default:
sm_data=0xff;
break;
}
}
void delay1(uchar time)
{
while(time--)
_nop_();
}
//**此程序过长,不做详细注释**//
//**请参考课本P138~143**//
附:SWK-51A 矩阵按键电路图
本节源代码及proteus仿真接线图下载方法:
1
《凡心》QQ群资料下载
若有其他问题,请自行查阅群文件,祝你学习愉快!