shu(uint8 c)
{
if(c<=2) {c++;} //1~3;
else if(c==3) {ge=10;shi=10; return 0;} //上;
else if(c==11){ge=c ; shi=c; return 0;} //下;
else if(c==7) {ge=12,shi=12; return 0;} //左;
else if(c==15) {ge=13,shi=13; return 0;} //右;
else if(c==13){return 0;} //enter 确认; ;
else if(c==14){ge=0; shi=0; return 0;} //清零;
else if((c>=8)&&(c<=10)){c-=1;} //7~9;
else if(c==12){ge=0;return 0;}
else { ;} //4~6;
ge=c; shi=0;
}
key()
{
uint8 i=0 ,y=0,temp=0x10 ,v=0,ke=0 ,en[]={0xfe,0xfd,0xfb,0xf7};
// temp用于检测每一行某个键是否按下; en数组是四列检测;
for(v=0;v<4;v++) //v每加一代表检测一列;
{
PORTD=en[v]; //检测四列;
temp=0x10;
for(y=0;y<4;y++) //y每加一,代表检测一列中的一个按键;
{
if((PIND&temp)==0) //如果有键被按下,进入;
{
for(i=0;i<250;i++){led();} //去抖延时并且扫描数码管;
if((PIND&temp)==0) //再次确认有键被按下;
{
buzz(1); //蜂鸣器开;
for(i=0;i<200;i++){led();} //鸣响延时;
for(i=0;i<200;i++){led();} //鸣响延时;
buzz(0); //蜂鸣器关;
//===============生成键值部分================
if(v==1)y+=3; //检测到第二行; //
else if(v==2)y+=6; //检测到第三行; //
else if(v==3)y+=9; //检测到第四行; //
else {;} //检测到第一行; //
ke=v+y; //生成键值; //
//===========================================
shu(ke); // 发送键值;
while((PIND&temp)==0)led(); //等待按键弹起;
for(i=0;i<250;i++){led();} //等待一下;
while((PIND&temp)==0)led(); //再次确认一下按键是否弹起;
return 0; //结束函数;
}
}
temp=temp<<1; //左移一下代表检测下一个按键;
}
}
}
void main(void)
{
mega16(); //初始化各个IO口;
buzz(1); //蜂鸣器开;
delay(15); //延时1.5万计数周期;
buzz(0); //蜂鸣器关;
PORTA=0xff; //载入全1;
bit(0); //把全1数据锁存在数码管共阴极(数码管灭);
delay(15); //延时1.5万计数周期;
while(1)
{
led(); //扫描数码管;
key(); //扫描键盘;
}
}