1、看单片机的datasheet,了解你设置成按键输入的I/O口能否有内部上拉或下拉;
2、把所有的按键检测端口设置成输入口;
3、如果这些输入口能内部上拉或下拉,就把检测高电平的设置成内部下拉,把其他检测低电平的设置成内部上拉。如果没有内部上拉下拉软件设置,就用几十到几百K的电阻,接到电源或姿磨地;
4、扫描按键,检测高电平的输入端电平是否为1,检测其他的低电平的输入端口是否为0,如果条件为真,就有按键按下;
5、注意检测输入端电平高低时候,需要几十毫秒的延时再确认,防止按键抖动和电平干扰。
while(!key){
P2 = 0xFF
key_press_num++
delay_1ms(10)
if(key_press_num>100) break
}
行列扫描:unsigned char KeyScan(void) //键盘扫描函数,使用行列逐级扫描法
{
unsigned char Val
KeyPort=0xf0//高四位置高,低四位拉低
if(KeyPort!=0xf0)//表示有按键按下
{
DelayMs(10) //去抖
if(KeyPort!=0xf0)
{ //表示有按键按下
KeyPort=0xfe//检测第一行
if(KeyPort!=0xfe)
{
Val=KeyPort&0xf0
Val+=0x0e
while(KeyPort!=0xfe)
DelayMs(10)//去抖
while(KeyPort!=0xfe)
return Val
}
KeyPort=0xfd//检测第二行
if(KeyPort!=0xfd)
{
Val=KeyPort&0xf0
Val+=0x0d
while(KeyPort!=0xfd)
DelayMs(10)//去抖
while(KeyPort!=0xfd)
return Val
}
KeyPort=0xfb//检测第三行
if(KeyPort!=0xfb)
{
Val=KeyPort&0xf0
Val+=0x0b
while(KeyPort!=0xfb)
DelayMs(10)//去抖
while(KeyPort!=0xfb)
return Val
}
KeyPort=0xf7//检测第四行
if(KeyPort!=0xf7)
{
Val=KeyPort&0xf0
Val+=0x07
while(KeyPort!=0xf7)
DelayMs(10)//去抖
while(KeyPort!=0xf7)
return Val
}
}
}
return 0xff
}
反转扫描:
unsigned char KeyScan(void) //键盘扫描函数,使用行列反转扫描法
{
unsigned char cord_h,cord_l//行列值中间变量
KeyPort=0x0f //行线输出全为0
cord_h=KeyPort&0x0f帆早祥 //读入列线值
if(cord_h!=0x0f)//先检测有无按键按下
{
DelayMs(10) //去抖
if((KeyPort&0x0f)!=0x0f)
{
cord_h=KeyPort&0x0f //读入列线值
KeyPort=cord_h|0xf0 //输出睁大当前列线值
cord_l=KeyPort&0xf0 //读入行线值
while((KeyPort&0xf0)!=0xf0)//等待松开并输出
return(cord_h+cord_l)//键盘最后组合码值
}
}return(0xff)//返回该值
}
/*------------------------------------------------
按键值处理函数,态搏返回扫键值
------------------------------------------------*/
unsigned char KeyPro(void)
{
switch(KeyScan())
{
case 0x7e:return 0break//0 按下相应的键显示相对应的码值
case 0x7d:return 1break//1
case 0x7b:return 2break//2
case 0x77:return 3break//3
case 0xbe:return 4break//4
case 0xbd:return 5break//5
case 0xbb:return 6break//6
case 0xb7:return 7break//7
case 0xde:return 8break//8
case 0xdd:return 9break//9
case 0xdb:return 10break//a
case 0xd7:return 11break//b
case 0xee:return 12break//c
case 0xed:return 13break//d
case 0xeb:return 14break//e
case 0xe7:return 15break//f
default:return 0xffbreak
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)