#include <C8051F340.h>
#include <string.h>
#include <absacc.h>
#include <stdio.h>
#include <stdlib.h>
#include <intrins.h>
#include <math.h>
#include "delay.h"
#include "1602.h"
#include "keyboard.h"
int keytest(void) //当按下时等待松开后返回按键值
{
unsigned char Kx,Ky,Kresult;
int Knum=Error;//这里的Error表示键未按下
unsigned char firtest,sectest;
keyio=0xf0; //先横扫描
delay1ms(1);
firtest=keyio; //得到排信息
if(firtest!=0xf0) //确认是否有键动作,即使是抖动
{
delay1ms(10); //延时
sectest=keyio; //确认排信息
if(sectest==firtest) //确认不是抖动则继续执行
{Kx=sectest;
keyio=0x0f;
delay1ms(1);
Ky=keyio; //得到列信息
}
else //是抖动的话就让result为0xff
{
Kx=0xf0;
Ky=0x0f;
}
Kresult=Kx|Ky;
switch(Kresult)
{
case 0x77:{Knum=1;break;}
case 0x7b:{Knum=2;break;}
case 0x7d:{Knum=3;break;}
case 0xb7:{Knum=4;break;}
case 0xbb:{Knum=5;break;}
case 0xbd:{Knum=6;break;}
case 0xd7:{Knum=7;break;}
case 0xdb:{Knum=8;break;}
case 0xdd:{Knum=9;break;}
case 0xeb:{Knum=0;break;}
case 0x7e:{Knum=10;break;} //A
case 0xbe:{Knum=11;break;} //B
case 0xde:{Knum=12;break;} //C
case 0xee:{Knum=13;break;} //D
case 0xe7:{Knum=14;break;} //*
case 0xed:{Knum=15;break;} //# 表示确认键
default:{Knum=Error;break; } //表示是抖动
}
}
if(Knum!=Error)
{
while(firtest!=0xf0)//有键按下时firtest一定不为0xf0
{
keyio=0xf0;
delay1ms(2);
firtest=keyio;
}
}
return(Knum);
}
- 1
- 2
前往页