void anxx()interrupt 0 //按键扫描中断,aj,as全局变量,com为I/O,aj_0中断入口引脚
{
uchar a,x,y; //定义a缓存:xY数轴
aj=0;
as=0;
ys10us(5000); //延时25ms
if(!AJ_0){
a=COM; //保护现场
y=a&0x0f; //判断y数轴准备
switch(y){ //查表
case 0x07:x=4;break;
case 0x0b:x=3;break;
case 0x0d:x=2;break;
case 0x0e:x=1;break;
default: { //查表失败
x=0;
break;
}
}
if(x&&(!AJ_0)){ //判断y=0?准备判断X数据
for(aj=0,y=0;y<4;++y){
switch(y){
case 0:COM=0x7f;break;
case 1:COM=0xbf;break;
case 2:COM=0xdf;break;
case 3:COM=0xef;break;
default:{
COM=a|0x0f; //查表错误
aj=0;
as=0;
y=0;
}
}
ys10us(10); //去抖延时
while(!AJ_0){
for(;!aj;) {//防止二次计数
aj=y*4+x; //求面值
}
for(as=0;!AJ_0;as++) //求按键时间
ys10us(50000); //1S
}
}
COM=a|0x0f;//恢复初次按键状态
}
else{ //按键扫描错误返回
aj=0;
as=0;
COM=a|0x0f;
}
}
void anxx()interrupt 0 //按键扫描中断,aj,as全局变量,com为I/O,aj_0中断入口引脚
{
uchar a,x,y; //定义a缓存:xY数轴
aj=0;
as=0;
ys10us(5000); //延时25ms
if(!AJ_0){
a=COM; //保护现场
y=a&0x0f; //判断y数轴准备
switch(y){ //查表
case 0x07:x=4;break;
case 0x0b:x=3;break;
case 0x0d:x=2;break;
case 0x0e:x=1;break;
default: { //查表失败
x=0;
break;
}
}
if(x&&(!AJ_0)){ //判断y=0?准备判断X数据
for(aj=0,y=0;y<4;++y){
switch(y){
case 0:COM=0x7f;break;
case 1:COM=0xbf;break;
case 2:COM=0xdf;break;
case 3:COM=0xef;break;
default:{
COM=a|0x0f; //查表错误
aj=0;
as=0;
y=0;
}
}
ys10us(10); //去抖延时
while(!AJ_0){
for(;!aj;) {//防止二次计数
aj=y*4+x; //求面值
}
for(as=0;!AJ_0;as++) //求按键时间
ys10us(50000); //1S
}
}
COM=a|0x0f;//恢复初次按键状态
}
else{ //按键扫描错误返回
aj=0;
as=0;
COM=a|0x0f;
}
}
举报