这才是单片机44矩阵键盘控制数码管最简单的写法

2022-05-18   大方老师单片机

原标题:这才是单片机44矩阵键盘控制数码管最简单的写法

这才是单片4*4矩阵键盘控制数码管最简单的写法

///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免费的,私信我就可以~点我头像黑色字体加我地球呺也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比///

第一次写,也算是对我研究了几天的代码做一个总结

程序基AT89S51芯片,两573锁存器(控段选位选)

P3口接矩阵键盘,其P3.0~P3.3接行线P3.4~P3.7接列线P0口接共阴7段数码管。

反转法的原理:

反转法就是通过给单片机的端口赋值两次,最后得出所按键的值的一种算法。

P3口赋0x0f00001111,假0键按下了,则这P3口的实际值00001110

P3口再赋0xf011110000,如0键按下了,则这P3口的实际值11100000

通过这两P3口的实际值相加111011100xee

由此我们便得到了按0键时所对应的数0xee,以此类推可得出其15个按键对应的数值,有了这种对应关系,矩阵键盘编程问题也就解决了,也就是程序的算法已经有了。

(上述方法来源于网络)

好了下面直接进入程序

#include //头文件

#define uchar unsigned char //宏定义

#define uint unsigned int

uchar key,n,i; //定义变量

uchar code table[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; //反转法矩阵键盘的各个按键的计算值

uchar code yin[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴极数码管显0~F

void delay(uint i) //延时函数

{

while(i--);

}

void keyscan()

{

uchar l,h,i; //定义局部变量,l得出4位的值,h得出4位的值

P3=0x0f; //P300001111

l=P3&0x0f;

if(l!=0x0f)

{

delay(100); //延迟后再检测

P3=0x0f;

l=P3&0x0f;

if(l!=0x0f)

{

h=P3&0xf0; //若有键按下,得出高四位的值

P3=0xf0; //P311110000

h=P3&0xf0; //若有键按下,得出低四位的值

key=l+h; //4位的值与4位的值相加

for(i=0;i

{

if(key==table[i]) //通过查表得n的值

n=i;

}

}

}

}

void main()

{

while(1)

{

keyscan();

for(i=0;i //送入位选信号控制数码管

{

P2_6=1;P2_7=0;

P0=yin[n];

P2_6=0;P2_7=1;

switch(i)

{

case 0:P0=0xfe;break;

case 1:P0=0xfd;break;

case 2:P0=0xfb;break;

case 3:P0=0xf7;break;

case 4:P0=0xef;break;

case 5:P0=0xdf;break;

default:break;

}

P2_6=0;P2_7=0;

delay(100);

}

}

}