矩阵按键的做法和点阵是一样的都是采用横纵坐标来确定哪个按键按下。上边那行是竖着的坐标,右面竖着的坐标是矩阵的横向坐标。
p1.0 为1时,第一竖行0 ,4,8,c就都通电了,当按下0键时p1.4就是低电平。
当我们按下 5 键时p1.1是高电平,p1.5是低电平。
这次我们用p0.0口当数码管的控制极,p2口输出让数码管显示0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,当按下哪个按键,数码管就显示哪个字符。
当P1.0——P.1——P1.2——P1.3为1时, 让P1.4为0,则0,1,2,3这4个按键等待响应。
当P1.0——P.1——P1.2——P1.3为1时, 让P1.5为0,则4,5,6,7这4个按键等待响应。
当P1.0——P.1——P1.2——P1.3为1时, 让P1.6为0,则8,9,A,B这4个按键等待响应。
当P1.0——P.1——P1.2——P1.3为1时, 让P1.7为0,则C,D,E,F这4个按键等待响应。
咱们就按照这个模式写一下。
#include<reg52.h>
sbit kongzhi0 =P0^0; // 用来控制哪个数码管可以用
unsigned char code shuzi[]={
0xC0,0xF9, 0xA4,0xb0, / / 0,1,2,3
0x99,0x92,0x82,0xF8, //4,5,6,7
0x80,0x90,0x88,0x03, // 89AB
0xC6,0xA1,0x86,0x8E }; //CDEF
sbit shu0=P1^0;
sbit shu1=P1^1;
sbit shu2=P1^2;
sbit shu3=P1^3;
sbit heng0=P1^4;
sbit heng1=P1^5;
sbit heng2=P1^6;
sbit heng3=P1^7;
void main()
{
kongzhi0=0; //给数码管送电
P2=0xFF; // 开机先不送数据,数码管不亮
P1=0x00; // 坐标初始化为0,
while(1)
{
P1=0xEF;//P1.0——P1.7数据分别时1111 0111颠倒一下位置就是1110 1111转16 进制,就是0xEF。
if(shu0==0)
{ yanshi();
if(shu0==0)
{P2=shuzi[0];}
}
if(shu1==0)
{ yanshi();
if(shu1==0)
{P2=shuzi[1];}
}
if(shu2==0)
{ yanshi();
if(shu2==0)
{P2=shuzi[2];}
}
if(shu3==0)
{ yanshi();
if(shu3==0)
{P2=shuzi[3];}
}
P1=0xDF;
if(shu0==0)
{ yanshi();
if(shu0==0)
{P2=shuzi[4];}
}
if(shu1==0)
{ yanshi();
if(shu1==0)
{P2=shuzi[5];}
}
if(shu2==0)
{ yanshi();
if(shu2==0)
{P2=shuzi[6];}
}
if(shu3==0)
{ yanshi();
if(shu3==0)
{P2=shuzi[7];}
}
P1=0x9F;
if(shu0==0)
{ yanshi();
if(shu0==0)
{P2=shuzi[8];}
}
if(shu1==0)
{ yanshi();
if(shu1==0)
{P2=shuzi[9];}
}
if(shu2==0)
{ yanshi();
if(shu2==0)
{P2=shuzi[10];}
}
if(shu3==0)
{ yanshi();
if(shu3==0)
{P2=shuzi11];}
}
P1=0x7F;
if(shu0==0)
{ yanshi();
if(shu0==0)
{P2=shuzi[12];}
}
if(shu1==0)
{ yanshi();
if(shu1==0)
{P2=shuzi[13];}
}
if(shu2==0)
{ yanshi();
if(shu2==0)
{P2=shuzi[14];}
}
if(shu3==0)
{ yanshi();
if(shu3==0)
{P2=shuzi[15];}
}
}
}
void yanshi()
{unsigned int i=1000;
while(i–);}
如若转载,请注明出处:https://www.gooyie.com/43924.html