#include "stc12C5a60s2.h"
sbit LED1 = P4^0;
sbit INT1 = P3^3;
void delay(unsigned int x)
{
unsigned int y;
for(;x;x--)
for(y=1000;y;y--);
}
void INT_init(void)
{
IT1 = 0; //1,高电平触发方式
EX1 = 1; //外部中断1
IE1 = 0; //清外部中断标志位
// IT0 = 1; //下降沿中断
// EX0 = 1; //外部中断0
// IE0 = 0; //清外部中断标志位
EA = 1; //开总中断
}
void main(void)
{
P0M0 = 0x00;
P0M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0xff;
P4M0 = 0x01;
P4M1 = 0x00;
P0 = 0x00;
P2 = 0xff;
LED1 = 0 ;
INT_init();
INT1 = 1 ;
while(1)
{
P0=0x00;
P2=0xff;
}
}
void Int1_Interrupt_Receive(void) interrupt 2
{
unsigned char temp ;
unsigned char num ;
EA = 0;
P0=0x7f; //行都置高,其余列置高,第一列置零
temp=P2;
temp=temp&0xff;
while(temp!=0xff) // 检测是否有行被拉低
{
delay(5);
temp=P2;
temp=temp&0xff;
while(temp!=0xff) //去抖动
{
temp=P2;
switch(temp) //编码判断,列坐标为第一列即“e”,行坐标有e,d,b,7.
{ //分别代表4,3,2,1行,行列综合坐标确定按键号
case 0x7f: num=1;LED1 = 1;
delay(1000);
LED1 = 0 ; //闪一次
break;
case 0xbf: num=2;
break;
case 0xdf: num=3;
break;
case 0xef: num=25;
break;
case 0xf7: num=26;
break;
case 0xfb: num=27;
break;
case 0xfd: num=28;
break;
case 0xfe: num=29;
break;
}
while(temp!=0xff)
{
temp=P2;
temp=temp&0xff;
}
}
}
P0=0xbf; //行都置高,其余列置高,第二列置零
temp=P2;
temp=temp&0xff;
while(temp!=0xff) // 检测是否有行被拉低
{
delay(5);
temp=P2;
temp=temp&0xff;
while(temp!=0xff) //去抖动
{
temp=P2;
switch(temp) //编码判断,列坐标为第一列即“e”,行坐标有e,d,b,7.
{ //分别代表4,3,2,1行,行列综合坐标确定按键号
case 0x7f: num=4;
break;
case 0xbf: num=5;
break;
case 0xdf: num=6;
break;
case 0xef: num=30;
break;
case 0xf7: num=31;
break;
case 0xfb: num=32;
break;
case 0xfd: num=33;
break;
case 0xfe: num=34;
break;
}
while(temp!=0xff)
{
temp=P2;
temp=temp&0xff;
}
}
}
P0=0xdf; //行都置高,其余列置高,第三列置零
temp=P2;
temp=temp&0xff;
while(temp!=0xff) // 检测是否有行被拉低
{
delay(5);
temp=P2;
temp=temp&0xff;
while(temp!=0xff) //去抖动
{
temp=P2;
switch(temp) //编码判断,列坐标为第一列即“e”,行坐标有e,d,b,7.
{ //分别代表4,3,2,1行,行列综合坐标确定按键号
case 0x7f: num=7;
break;
case 0xbf: num=8;
break;
case 0xdf: num=9;
break;
case 0xef: num=35; LED1 = 1;
delay(1000);
LED1 = 0 ;
delay(1000);
LED1 = 1;
delay(1000);
LED1 = 0 ;
delay(1000);
LED1 = 1;
delay(1000);
LED1 = 0 ; //闪三次,
break;
case 0xf7: num=36;
break;
case 0xfb: num=37;
break;
case 0xfd: num=38;
break;
case 0xfe: num=39;
break;
}
while(temp!=0xff)
{
temp=P2;
temp=temp&0xff;
}
}
}
P0=0xef; //行都置高,其余列置高,第四列置零
temp=P2;
temp=temp&0xff;
while(temp!=0xff) // 检测是否有行被拉低
{
delay(5);
temp=P2;
temp=temp&0xff;
while(temp!=0xff) //去抖动
{
temp=P2;
switch(temp) //编码判断,列坐标为第一列即“e”,行坐标有e,d,b,7.
{ //分别代表4,3,2,1行,行列综合坐标确定按键号
case 0x7f: num=10;
break;
case 0xbf: num=11;
break;
case 0xdf: num=12;
break;
case 0xef: num=40;
break;
case 0xf7: num=41;
break;
case 0xfb: num=42;
break;
case 0xfd: num=43;
break;
case 0xfe: num=44;
break;
}
while(temp!=0xff)
{
temp=P2;
temp=temp&0xff;
}
}
}
P0=0xf7; //行都置高,其余列置高,第5列置零
temp=P2;
temp=temp&0xff;
while(temp!=0xff) // 检测是否有行被拉低
{
delay(5);
temp=P2;
temp=temp&0xff;
while(temp!=0xff) //去抖动
{
temp=P2;
switch(temp) //编码判断,列坐标为第一列即“e”,行坐标有e,d,b,7.
{ //分别代表4,3,2,1行,行列综合坐标确定按键号
case 0x7f: num=13;
break;
case 0xbf: num=14;
break;
case 0xdf: num=15;
break;
case 0xef: num=45;
break;
case 0xf7: num=46;
break;
case 0xfb: num=47;
break;
case 0xfd: num=48;
break;
case 0xfe: num=49;
break;
}
while(temp!=0xff)
{
temp=P2;
temp=temp&0xff;
}
}
}
P0=0xfb; //行都置高,其余列置高,第6列置零
temp=P2;
temp=temp&0xff;
while(temp!=0xff) // 检测是否有行被拉低
{
delay(5);
temp=P2;
temp=temp&0xff;
while(temp!=0xff) //去抖动
{
temp=P2;
switch(temp) //编码判断,列坐标为第一列即“e”,行坐标有e,d,b,7.
{ //分别代表4,3,2,1行,行列综合坐标确定按键号
case 0x7f: num=16;
break;
case 0xbf: num=17;
break;
case 0xdf: num=18;
break;
case 0xef: num=50;
break;
case 0xf7: num=51;
break;
case 0xfb: num=52;
break;
case 0xfd: num=53;
break;
case 0xfe: num=54;
break;
}
while(temp!=0xff)
{
temp=P2;
temp=temp&0xff;
}
}
}
P0=0xfd; //行都置高,其余列置高,第7列置零
temp=P2;
temp=temp&0xff;
while(temp!=0xff) // 检测是否有行被拉低
{
delay(5);
temp=P2;
temp=temp&0xff;
while(temp!=0xff) //去抖动
{
temp=P2;
switch(temp) //编码判断,列坐标为第一列即“e”,行坐标有e,d,b,7.
{ //分别代表4,3,2,1行,行列综合坐标确定按键号
case 0x7f: num=19;
break;
case 0xbf: num=20; LED1 = 1;
delay(1000);
LED1 = 0 ;
delay(1000);
评论0