#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbit dula=P2^6;
sbit wela=P2^7;
void delayms(uint);//延迟函数
void init();//初始化函数
void matrixkeyscan();
void display(uchar);
void main()
{
init();
while(1)
{
matrixkeyscan();
}
}
void init()
{
P0=0;//关闭所有段选
dula=1;
dula=0;
P0=0xfe;
wela=1;
wela=0;
}
void delayms(uint xms)//延迟 xms ms
{
uint i, j;
for(i=xms;i>0;i--)
for(j=xms;j>0;j--);
}
void display(uchar num)//显示函数
{
P0=table[num];
dula=1;
dula=0;
}
void matrixkeyscan()
{
uchar temp,key;
P3=0xfe;//P3口设置一值 把第一行设置为低电平
temp=P3;//读取当前P3状态值,赋给temp 此时当键按下时P3改变了 否则没有改变
temp=temp&0xf0; //目的判断temp高四位是否有0
if(temp!=0xf0)//键盘被按下后 P3改变 temp与运算后改变,此时不等于0xf0
{
delayms(10);//去抖动
temp=P3;//重新读取P3
temp=temp&0xf0;//重新进行与运算
if(temp!=0xf0)//如果temp仍然不等于0xf0,确认键被按下
{
temp=P3;//重新读取P3
switch(temp)
{
case 0xee: key=0; break;//第一行第一个键被按下
case 0xde: key=1; break;//第一行第二个键被按下
case 0xbe: key=2; break;//。。。
case 0x7e: key=3; break;
}//下面判断是否释放键,即判断高电位是否都为0,此时不考虑低四位,所以判断是否与0xf0相等
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed: key=4; break;
case 0xdd: key=5; break;
case 0xbd: key=6; break;
case 0x7d: key=7; break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb: key=8; break;
case 0xdb: key=9; break;
case 0xbb: key=10; break;
case 0x7b: key=11; break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7: key=12; break;
case 0xd7: key=13; break;
case 0xb7: key=14; break;
case 0x77: key=15; break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
}
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbit dula=P2^6;
sbit wela=P2^7;
void delayms(uint);//延迟函数
void init();//初始化函数
void matrixkeyscan();
void display(uchar);
void main()
{
init();
while(1)
{
matrixkeyscan();
}
}
void init()
{
P0=0;//关闭所有段选
dula=1;
dula=0;
P0=0xfe;
wela=1;
wela=0;
}
void delayms(uint xms)//延迟 xms ms
{
uint i, j;
for(i=xms;i>0;i--)
for(j=xms;j>0;j--);
}
void display(uchar num)//显示函数
{
P0=table[num];
dula=1;
dula=0;
}
void matrixkeyscan()
{
uchar temp,key;
P3=0xfe;//P3口设置一值 把第一行设置为低电平
temp=P3;//读取当前P3状态值,赋给temp 此时当键按下时P3改变了 否则没有改变
temp=temp&0xf0; //目的判断temp高四位是否有0
if(temp!=0xf0)//键盘被按下后 P3改变 temp与运算后改变,此时不等于0xf0
{
delayms(10);//去抖动
temp=P3;//重新读取P3
temp=temp&0xf0;//重新进行与运算
if(temp!=0xf0)//如果temp仍然不等于0xf0,确认键被按下
{
temp=P3;//重新读取P3
switch(temp)
{
case 0xee: key=0; break;//第一行第一个键被按下
case 0xde: key=1; break;//第一行第二个键被按下
case 0xbe: key=2; break;//。。。
case 0x7e: key=3; break;
}//下面判断是否释放键,即判断高电位是否都为0,此时不考虑低四位,所以判断是否与0xf0相等
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed: key=4; break;
case 0xdd: key=5; break;
case 0xbd: key=6; break;
case 0x7d: key=7; break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb: key=8; break;
case 0xdb: key=9; break;
case 0xbb: key=10; break;
case 0x7b: key=11; break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7: key=12; break;
case 0xd7: key=13; break;
case 0xb7: key=14; break;
case 0x77: key=15; break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
}