矩阵按键
这个程序的功能是一个按键控制一个灯的亮灭,16个按键控制8个灯。有2个按键控制一个灯。
首先需要用到点灯程序中的硬件,如译码器,或非门,数据选择器。
其次就是4x4的按键
#include "STC15F2K60S2.h"是单片机的头文件,定义了一些特殊的数据寄存器。
#include "STC15F2K60S2.h"
#define K P3 //P3口以K来代替
sbit LED1=P0^0;//8个灯的控制
sbit LED2=P0^1;
sbit LED3=P0^2;
sbit LED4=P0^3;
sbit LED5=P0^4;
sbit LED6=P0^5;
sbit LED7=P0^6;
sbit LED8=P0^7;
sbit LED2=P0^1;
sbit LED3=P0^2;
sbit LED4=P0^3;
sbit LED5=P0^4;
sbit LED6=P0^5;
sbit LED7=P0^6;
sbit LED8=P0^7;
void delay(unsigned int MS)
{//延时程序
unsigned int i,j;
for(i=0;i<MS;i++)
for(j=0;j<MS;j++);
}
{//延时程序
unsigned int i,j;
for(i=0;i<MS;i++)
for(j=0;j<MS;j++);
}
void ScanKey() //矩阵按键
{
unsigned char H;//行检测与列检测的判断值
K=0xfe;
H=K;
if(H!=0xfe)
{
delay(250);
H=K;
if(H!=0xfe)
{
H=K;
switch(H)
{
case 0xee:LED1=!LED1;break;
case 0xde:LED2=!LED2;break;
case 0xbe:LED3=!LED3;break;
case 0x7e:LED4=!LED4;break;
}
while(K!=0xfe);
}
}
K=0xfd;
H=K;
if(H!=0xfd)
{
delay(250);
H=K;
if(H!=0xfd)
{
H=K;
switch(H)
{
case 0xed:LED5=!LED5;break;
case 0xdd:LED6=!LED6;break;
case 0xbd:LED7=!LED7;break;
case 0x7d:LED8=!LED8;break;
}
while(K!=0xfd);
}
}
K=0xfb;
H=K;
if(H!=0xfb)
{
delay(250);
H=K;
if(H!=0xfb)
{
H=K;
switch(H)
{
case 0xeb:LED1=!LED1;break;
case 0xdb:LED2=!LED2;break;
case 0xbb:LED3=!LED3;break;
case 0x7b:LED4=!LED4;break;
}
while(K!=0xfb);
}
}
K=0xf7;
H=K;
if(H!=0xf7)
{
delay(250);
H=K;
if(H!=0xf7)
{
H=K;
switch(H)
{
case 0xe7:LED5=!LED5;break;
case 0xd7:LED6=!LED6;break;
case 0xb7:LED7=!LED7;break;
case 0x77:LED8=!LED8;break;
}
while(K!=0xf7);
}
}
}
{
unsigned char H;//行检测与列检测的判断值
K=0xfe;
H=K;
if(H!=0xfe)
{
delay(250);
H=K;
if(H!=0xfe)
{
H=K;
switch(H)
{
case 0xee:LED1=!LED1;break;
case 0xde:LED2=!LED2;break;
case 0xbe:LED3=!LED3;break;
case 0x7e:LED4=!LED4;break;
}
while(K!=0xfe);
}
}
K=0xfd;
H=K;
if(H!=0xfd)
{
delay(250);
H=K;
if(H!=0xfd)
{
H=K;
switch(H)
{
case 0xed:LED5=!LED5;break;
case 0xdd:LED6=!LED6;break;
case 0xbd:LED7=!LED7;break;
case 0x7d:LED8=!LED8;break;
}
while(K!=0xfd);
}
}
K=0xfb;
H=K;
if(H!=0xfb)
{
delay(250);
H=K;
if(H!=0xfb)
{
H=K;
switch(H)
{
case 0xeb:LED1=!LED1;break;
case 0xdb:LED2=!LED2;break;
case 0xbb:LED3=!LED3;break;
case 0x7b:LED4=!LED4;break;
}
while(K!=0xfb);
}
}
K=0xf7;
H=K;
if(H!=0xf7)
{
delay(250);
H=K;
if(H!=0xf7)
{
H=K;
switch(H)
{
case 0xe7:LED5=!LED5;break;
case 0xd7:LED6=!LED6;break;
case 0xb7:LED7=!LED7;break;
case 0x77:LED8=!LED8;break;
}
while(K!=0xf7);
}
}
}
void main()
{
P2=0x80;//开启Y4C
LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;LED7=1;
while(1)
{
ScanKey();
}
}
最后这个程序在我的单片机上有一些问题,只有8个按键能控制8个灯,而有8个按键却无法使用。