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

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

c95c2537589549b71d001b0273e290e2.png

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

16205445400132f44bdb3c5a4161e123.png

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

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

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

反转法的原理:

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

给P3口赋值0x0f,即00001111,假设0键按下了,则这时P3口的实际值为00001110;

给P3口再赋值0xf0,即11110000,如果0键按下了,则这时P3口的实际值为11100000;

通过这两次P3口的实际值相加得11101110,即0xee。

由此我们便得到了按下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; //给P3赋值00001111

l=P3&0x0f;

if(l!=0x0f)

{

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

P3=0x0f;

l=P3&0x0f;

if(l!=0x0f)

{

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

P3=0xf0; //给P3赋值11110000

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);

     }

   }

}

猜你喜欢

转载自blog.csdn.net/danpianji777/article/details/124851383