一、原理图
矩阵按键工作原理实质是单片机不断的循环扫描,所以使用到定时器和4X4矩阵按键,原理图以蓝桥杯单片机矩阵按键为例。

行为P30、P31、P32、P33,列为P44、P42、P35、P34。
二、key.c程序
#include "key.h"
sbit hang1=P3^0;
sbit hang2=P3^1;
sbit hang3=P3^2;
sbit hang4=P3^3;
sbit lie1=P4^4;
sbit lie2=P4^2;
sbit lie3=P3^5;
sbit lie4=P3^4;
void delayms(unsigned int nms)
{
unsigned int i;
while(nms--)
for(i = 0;i <110;i++);
}
unsigned char JZjianpan(void)
{
unsigned char lsbl=20;
hang1=hang2=hang3=hang4=1;
lie1=lie2=lie3=lie4=0;
if(!(hang1 & hang2 & hang3 & hang4))
{
delayms(5);
hang1=hang2=hang3=hang4=1;
lie1=lie2=lie3=lie4=0;
if(!(hang1 & hang2 & hang3 & hang4))
{
P3=0xff;
lie1=0; lie2 = 1; lie3 = 1; lie4 = 1;
if(hang1==0) lsbl=7;
else if(hang2==0) lsbl=6;
else if(hang3==0) lsbl=5;
else if(hang4==0) lsbl=4;
lie1 = 1; lie2 = 0; lie3 = 1; lie4 = 1;
if(hang1==0) lsbl=11;
else if(hang2==0) lsbl=10;
else if(hang3==0) lsbl=9;
else if(hang4==0) lsbl=8;
lie1 = 1; lie2 = 1; lie3 = 0; lie4 = 1;
if(hang1==0) lsbl=15;
else if(hang2==0) lsbl=14;
else if(hang3==0) lsbl=13;
else if(hang4==0) lsbl=12;
lie1 = 1; lie2 = 1; lie3 = 1; lie4 = 0;
if(hang1==0) lsbl=19;
else if(hang2==0) lsbl=18;
else if(hang3==0) lsbl=17;
else if(hang4==0) lsbl=16;
}
}
hang1=hang2=hang3=hang4=1;
lie1=lie2=lie3=lie4=0;
while(!(hang1 & hang2 & hang3 & hang4));
return lsbl;
}
三、main.c程序
定时器使用的是Timer1,12MHZ,12T模式,1ms定时,自动重装载。
#include "key.h"
unsigned char jianzhi,jianpan_flag;
unsigned long u1ms;
void Timer1_Init(void)
{
AUXR &= 0xBF;
TMOD &= 0x0F;
TL1 = 0x18;
TH1 = 0xFC;
TF1 = 0;
TR1 = 1;
EA = 1;
}
void main(void)
{
Timer1Init();
while(1)
{
if(jianpan_flag == 1)
{
jianpan_flag = 0;
jianzhi = JZjianpan();
switch(jianzhi)
{
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
}
}
}
}
void Time_1(void) interrupt 3
{
u1ms++;
if(!(u1ms%10 == 0)) jianpan_flag = 1;
}