要求:运行程序,观察实验结果(任意按下 矩阵键盘几个键,它上面的 8 个 LED 显示器 会将按键的编码从左至右依次显示出来。
#include <stc15f2k60s2.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar buffer[8],keyvalue;
uchar code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
sbit r1=P3^0;
sbit r2=P3^1;
sbit r3=P3^2;
sbit r4=P3^3;
sbit c1=P4^4;
sbit c2=P4^2;
sbit c3=P3^5;
sbit c4=P3^4;
void hc573(uchar n)
{
switch(n)
{
case 4:P2=(P2 & 0x1f) | 0x80;break;
case 5:P2=(P2 & 0x1f) | 0xa0;break;
case 6:P2=(P2 & 0x1f) | 0xc0;break; //Y6=0 wei
case 7:P2=(P2 & 0x1f) | 0xe0;break; //Y7=0 duan
}
}
void cleall()
{
hc573(4);
P0=0xff;
P2 &=0x1f;
hc573(5);
P0=0x00;
P2 &=0x1f;
}
void delay(uint n)
{
uint i,j;
for(i=0;i<n;i++)
for(j=0;j<125;j++);
}
void display()
{
uchar i,j,*p;
p=buffer;
for(j=0;j<8;j++)
{
hc573(7);
P0=duan[*p++];
hc573(6);
P0=wei[j];
delay(5);
P0=0x00;
}
}
uchar checkkey()
{
uchar i;
c1=c2=c3=c4=0;
i=P3;
i=i&0x0f;
if(i==0x0f)return (0);
else return(0xff);
}
uchar keyscan()
{
uchar scancode,k,i,j;
while(1)
{
if(checkkey()==0)
{
display();
display();
continue;
}
display();
display();
delay(10);
if(checkkey()==0)
{
display();
continue;
}
scancode=0x7f;
for(i=0;i<4;i++)
{
k=0x01;
c1=scancode/128;
c2=scancode/64%2;
c3=scancode/32%2;
c4=scancode/16%2;
for(j=0;j<4;j++)
{
if((P3&k)==0)
{
keyvalue=j*4+i;
do
{
display();
}
while(checkkey()!=0);
return keyvalue;
}
else k=k<<1;
}
scancode=_cror_(scancode,1);
}
}
}
void main()
{
uchar i;
cleall();
while(1)
{
for(i=0;i<8;i++)
{
buffer[i]=keyscan();
}
}