项目所需6个IO口扫描21个按键:(大神有更好的方法或者建议,请不吝指教哦!)
原理与矩阵扫描类似:
下面是仿真图和程序:(附件是protuse仿真文件)
单片机源程序如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit d1 = P3^0;
sbit d2 = P3^1;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit led=P3^7;
uchar code_table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
uchar temp;
void delay_ms(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<110;j++);
}
void display(uchar td)
{
d1=1;d2=0;
P2=~code_table[td%10];
delay_ms(5);
P2=0x00;
d1=0;d2=1;
P2=~code_table[td/10];
delay_ms(5);
P2=0x00;
}
uchar keyscan()
{
uchar pp;
P1=0xff;
if(P1!=0xff)
{
delay_ms(10);
if(P1!=0xff)
{
pp=P1;
led=0;
switch(pp)
{
case 0xfe:temp=1;return(temp);
case 0xfd:temp=2;return(temp);
case 0xfb:temp=3;return(temp);
case 0xf7:temp=4;return(temp);
case 0xef:temp=5;return(temp);
case 0xdf:temp=6;return(temp);
}
}
}
P1=0xfe;
if(P1!=0xfe)
{
delay_ms(10);
if(P1!=0xfe)
{
pp=P1;
led=0;
switch(pp)
{
case 0xfc:temp=7;return(temp);
case 0xfa:temp=8;return(temp);
case 0xf6:temp=9;return(temp);
case 0xee:temp=10;return(temp);
case 0xde:temp=11;return(temp);
}
}
}
P1=0xfd;
if(P1!=0xfd)
{
delay_ms(10);
if(P1!=0xfd)
{
pp=P1;
led=0;
switch(pp)
{
case 0xf9:temp=12;return(temp);
case 0xf5:temp=13;return(temp);
case 0xed:temp=14;return(temp);
case 0xdd:temp=15;return(temp);
}
}
}
P1=0xfb;
if(P1!=0xfb)
{
delay_ms(10);
if(P1!=0xfb)
{
pp=P1;
led=0;
switch(pp)
{
case 0xf3:temp=16;return(temp);
case 0xeb:temp=17;return(temp);
case 0xdb:temp=18;return(temp);
}
}
}
P1=0xf7;
if(P1!=0xf7)
{
delay_ms(10);
if(P1!=0xf7)
{
pp=P1;
led=0;
switch(pp)
{
case 0xe7:temp=19;return(temp);
case 0xd7:temp=20;return(temp);
}
}
}
P1=0xef;
if(P1!=0xef)
{
delay_ms(10);
if(P1!=0xef)
{
pp=P1;
led=0;
switch(pp)
{
case 0xcf:temp=21;return(temp);
}
}
}
temp=0;
led=1;
return(temp);
}
void main(void)
{
led=1;
while(1)
{
display(keyscan());
}
}
全部资料51hei下载地址:
仿真.rar
(45.6 KB, 下载次数: 24)
|