欢迎光临散文网 会员登陆 & 注册

单片机学习——矩阵键盘(自用)

2023-03-14 21:20 作者:huabi_fxz  | 我要投稿

原理及思路:

对于矩阵键盘,我们只能逐行扫描,然后读取列的信号。

例如一个4x4的矩阵,应对每一行分别赋0,然后扫描列的信号,加入某一列中出现0,则为对应行列的键盘被按下。此时,应定义一个全局变量,给矩阵行列上的每一个按键赋予一个独立的号码,当扫描到某一行某一列的动作后,把对应的编号输出,我们就知道哪个按键触发了。

软件部分:

#include "reg52.h"

unsigned char code SMG_duanma[18]=

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,

0x82,0xf8,0x80,0x90,0x88,0x80,

0xc6,0xc0,0x86,0x8e,0xbf,0x7f};

unsigned char key_num;


sfr P4=0xc0; //52单片机无P4位,则需定义P4的地址


sbit R1=P3^0;

sbit R2=P3^1;

sbit R3=P3^2;

sbit R4=P3^3;


sbit C4=P3^4;

sbit C3=P3^4;

sbit C2=P4^2;

sbit C1=P4^4;//分别定义C1-C4、R1-R4端的端口


void selectHC573(unsigned char n)

{

 switch(n)

 {

 case 4:

 P2=(P2&0x1f)|0x80;

 break;

 case 5:

 P2=(P2&0x1f)|0xa0;

 break;

 case 6:

 P2=(P2&0x1f)|0xc0;

 break;

 case 7:

 P2=(P2&0x1f)|0xe0;

 break;

}

}//通过138译码器选择需要使用的寄存器


void displaykeynum(unsigned char value)

{

 selectHC573(6);

 P0=0x01;

 selectHC573(7);

 P0=value;

}


void scankey()

{

 R1=0;//扫描第一行

 R2=R3=R4=1;

 C1=C2=C3=C4=1;

 if(C1==0)//分别对第一行的第一二三四列进行扫描

 {

 while(C1==0);

 key_num=0;//若c1为0则代表按下的键为C1R1,输出代表C1R1的0值

 displaykeynum(SMG_duanma[key_num]);

 }

 else if(C2==0)

 {

 while(C2==0);

 key_num=1;

 displaykeynum(SMG_duanma[key_num]);

 }

 if(C3==0)

 {

 while(C3==0);

 key_num=2;

 displaykeynum(SMG_duanma[key_num]);

 }

 if(C4==0)

 {

 while(C4==0);

 key_num=3;

 displaykeynum(SMG_duanma[key_num]);

 } 


 R2=0;

 R1=R3=R4=1;

 C1=C2=C3=C4=1;

 if(C1==0)

 {

 while(C1==0);

 key_num=4;

 displaykeynum(SMG_duanma[key_num]);

 }

 else if(C2==0)

 {

 while(C2==0);

 key_num=5;

 displaykeynum(SMG_duanma[key_num]);

 }

 if(C3==0)

 {

 while(C3==0);

 key_num=6;

 displaykeynum(SMG_duanma[key_num]);

 }

 if(C4==0)

 {

 while(C4==0);

 key_num=7;

 displaykeynum(SMG_duanma[key_num]);

 }


 R3=0;

 R2=R1=R4=1;

 C1=C2=C3=C4=1;

 if(C1==0)

 {

 while(C1==0);

 key_num=8;

 displaykeynum(SMG_duanma[key_num]);

 }

 else if(C2==0)

 {

 while(C2==0);

 key_num=9;

 displaykeynum(SMG_duanma[key_num]);

 }

 if(C3==0)

 {

 while(C3==0);

 key_num=10;

 displaykeynum(SMG_duanma[key_num]);

 }

 if(C4==0)

 {

 while(C4==0);

 key_num=11;

 displaykeynum(SMG_duanma[key_num]);

 }


 R4=0;

 R2=R3=R1=1;

 C1=C2=C3=C4=1;

 if(C1==0)

 {

 while(C1==0);

 key_num=12;

 displaykeynum(SMG_duanma[key_num]);

 }

 else if(C2==0)

 {

 while(C2==0);

 key_num=13;

 displaykeynum(SMG_duanma[key_num]);

 }

 if(C3==0)

 {

 while(C3==0);

 key_num=14;

 displaykeynum(SMG_duanma[key_num]);

 }

 if(C4==0)

 {

 while(C4==0);

 key_num=15;

 displaykeynum(SMG_duanma[key_num]);

 }

}

void main()

{

while(1)

{

 scankey();

}

}

懂完了


单片机学习——矩阵键盘(自用)的评论 (共 条)

分享到微博请遵守国家法律