实验:通过4*4的矩阵键盘,按下某个按钮之后会在数码管上面显示对应的键号。(0~F)
基础操作参考这篇博客:
LED数码管的静态显示与动态显示(Keil+Proteus)-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/134101256
实验采用的是共阳极的接法。所以这个二进制的数据里面的元素都是共阳极的。
通过逐行的扫描,假设当前扫描第一行,对应的P1^0~P1^3中有0则说明是该行有键被按下,结合if判断可以确定是哪一列。
- #include
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit L1=P1^0;//定义列
- sbit L2=P1^1;
- sbit L3=P1^2;
- sbit L4=P1^3;
- //共阳极字符0~F的段码
- uchar dis[16]={0xC0,0XF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
- uint time;
- //延时,放键盘抖动
- void delay(uint time);
-
- void main(void){
- uchar temp;
- uchar i;
- while(1){
- P1=0xEF;//行扫描初值1110 1111(扫描P1^4)
- for(i=0;i<4;i++){//逐行为低,按行扫描,一共4行
- if(L1==0)P0=dis[i*4+0];//判断第一列有无键被按下
- if(L2==0)P0=dis[i*4+1];//判断第二列有无键被按下
- if(L3==0)P0=dis[i*4+2];//判断第三列有无键被按下
- if(L4==0)P0=dis[i*4+3];//判断第四列有无键被按下
- delay(500);//延时
- temp=P1;//读入P1口的状态
- temp=temp|0x0F;//将P1^3~P1^0为1
- temp=temp<<1;//左移,准备扫描下一行
- temp=temp|0x0F;
- P1=temp;//为扫描下一行做准备
- }
- }
- }
- //软件消除抖动,延时
- void delay(uint time){
- uint i;
-