单片机矩阵键盘判断某个按键按下
这是我第一次发表文章,关于51单片机矩阵式键盘逐行逐列扫描是否有按键按下,以及把键号显示用七段数码管显示出来的程序,分享如下。
矩阵键盘
51单片机
数码管显示
程序代码如下
#include<reg51.h>#define uchar unsigned char#define uint unsigned intvoid delay1(int x) //延时程序{uint i,j;for(i=0;i<123;i++)for(j=0;j<x;j++);}uchar led[]={0x00,0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0X77,0X7C,0X39,0X5e,0X79,0X71}; //显示数值的段码unsigned int num[]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77}; //每个按键对应的P1口值unsigned char hang[]={0xef,0xdf,0xbf,0x7f}; //扫描每行时对应P1口值uchar key_scan() //扫描函数{uchar a,i,n;for(a=0;a<4;a++) //循环四次,对应四行{P1=hang[a];//第一行赋值if(P1!=hang[a]) //消抖{delay1(100);if(P1!=hang[a]) //再次确定该行是否有键按下,如果有就不是因为键盘抖动引起的{for(i=0;i<4;i++) //如果是该行有键按下,是哪一列的键?判断一下{if(P1==num[4*a+i]) //如果是该列的键按下,输出改键键号{n=4*a+i+1; //赋值键号}}}}}return n; //把按键号返给主函数}main()//主函数{P2=0XFE; //给共阴极数码管的公共端置0while(1){P0=led[key_scan()]; //把得到的按键号的段码送到P0口。通过数码管显示出来}}
最终效果
按下0号键
按下1号键
按下15号键
10——15号键是显示A-F,因为一位七段数码管只能显示0-9,10-15就用十六进制的A-F来表示。
如对你学习有帮助可以关注一下新人,一起加油!!!