/*************************************************
pslyjvm工作室
http://hi.youkuaiyun.com/space.html
Copyright 2009 pslyjvm's mcustudio
All rights Reserved
作者:pslyjvm
键盘.c
本程序是4*4矩阵键盘的扫描程序
*************************************************/
#include <reg52.h>
unsigned char code table[]={0xC0,0xF9,0xA4,0xB0, //字型码
0x99,0x92,0x82,0xF8,
0x80,0x98,0x88,0x83,
0xC6,0xA1,0x86,0x8E};
unsigned char temp;
unsigned char key;
unsigned char i,j;
sbit P2_0=P2^0;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
void Delay(unsigned int ms) //延迟程序
{
int i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<114;j++);
}
}
void main(void) //主程序
{
while(1)
{
P2=0xff;
P0=0xff;
P1=0xff;
P1_4=0;
temp=P1;
temp=temp & 0x0f;
if (temp!=0x0f)
{
Delay(10);
temp=P1;
temp=temp & 0x0f;
if (temp!=0x0f)
{
switch(temp)
{
case 0x0e:
key=0;
break;
case 0x0d:
key=1;
break;
case 0x0b:
key=2;
break;
case 0x07:
key=3;
break;
}
P2_0=~P2_0;
P0=table[key];
temp=P1; //等待按键被释放
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P1;
temp=temp & 0x0f;
}
}
}
P2=0xff;
P0=0xff;
P1=0xff;
P1_5=0;
temp=P1;
temp=temp & 0x0f;
if (temp!=0x0f)
{
Delay(10);
temp=P1;
temp=temp & 0x0f;
if (temp!=0x0f)
{
switch(temp)
{
case 0x0e:
key=4;
break;
case 0x0d:
key=5;
break;
case 0x0b:
key=6;
break;
case 0x07:
key=7;
break;
}
P2_0=~P2_0;
P0=table[key];
temp=P1; //等待按键释放
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P1;
temp=temp & 0x0f;
}
}
}
P2=0xff;
P0=0xff;
P1=0xff;
P1_6=0;
temp=P1;
temp=temp & 0x0f;
if (temp!=0x0f)
{
Delay(10);
temp=P1;
temp=temp & 0x0f;
if (temp!=0x0f)
{
switch(temp)
{
case 0x0e:
key=8;
break;
case 0x0d:
key=9;
break;
case 0x0b:
key=10;
break;
case 0x07:
key=11;
break;
}
P2_0=~P2_0;
P0=table[key];
temp=P1; //等待按键释放
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P1;
temp=temp & 0x0f;
}
}
}
P2=0xff;
P0=0xff;
P1=0xff;
P1_7=0;
temp=P1;
temp=temp & 0x0f;
if (temp!=0x0f)
{
Delay(10);
temp=P1;
temp=temp & 0x0f;
if (temp!=0x0f)
{
switch(temp)
{
case 0x0e:
key=12;
break;
case 0x0d:
key=13;
break;
case 0x0b:
key=14;
break;
case 0x07:
key=15;
break;
}
P2_0=~P2_0;
P0=table[key];
temp=P1; //等待按键的释放
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P1;
temp=temp & 0x0f;
}
}
}
}
}
附:原理图