这是一个很牛逼的程序,历时2天成功的写出了驱动,单片机io资源得到了最大的利用.

下面是仿真图:

程序是基于pic单片机的,完整的源代码下载: http://www.51hei.com/f/5dk25.rar
#include"pic1687x.h"
#define uchar unsigned char
uchar emp_press()
{
uchar w,n,dat=0x00;
TRISC=0XFF;
PORTC=0XFF;
w=PORTC;
if((w|0xe0)!=0xff)
{
if(RC4==0)
dat=25;
if(RC3==0)
dat=24;
if(RC2==0)
dat=23;
if(RC1==0)
dat=22;
if(RC0==0)
dat=21; }
return dat;
}
void scan()
{
static char n,dat,num;
TRISC=0Xfe;
PORTC=0Xfe;
TRISB=0X00;
num=PORTC;
if((~num)&(0x01<<1))dat=1 ;
else if((~num)&(0x01<<2))dat=2 ;
else if((~num)&(0x01<<3))dat=3 ;
else if((~num)&(0x01<<4))dat=4 ;
TRISC=0Xfd;
PORTC=0Xfd;
num=PORTC;
if((~num)&(0x01<<0))dat=5 ;
else if((~num)&(0x01<<2))dat=6 ;
else if((~num)&(0x01<<3))dat=7 ;
else if((~num)&(0x01<<4))dat=8 ;
TRISC=0Xfb;
PORTC=0Xfb;
num=PORTC;
if((~num)&(0x01<<0))dat=9 ;
else if((~num)&(0x01<<1))dat=10;
else if((~num)&(0x01<<3))dat=11 ;
else if((~num)&(0x01<<4))dat=12 ;
TRISC=0Xf7;
PORTC=0Xf7;
num=PORTC;
if((~num)&(0x01<<0))dat=13 ;
else if((~num)&(0x01<<1))dat=14 ;
else if((~num)&(0x01<<2))dat=15 ;
else if((~num)&(0x01<<4))dat=16 ;
TRISC=0Xef;
PORTC=0Xef;
num=PORTC;
if((~num)&(0x01<<0))dat=17 ;
else if((~num)&(0x01<<1))dat=18 ;
else if((~num)&(0x01<<2))dat=19;
else if((~num)&(0x01<<3))dat=20 ;
num=emp_press();
if(num)dat=num;
PORTB=dat;
for(n=0;n<100;n++);
}
void main()
{
while(1)scan();
}
