C:Userszhoukai53670
#include<avr/io.h>
#include<avr/delay.h>
int main()
{
char temp,key;
DDRA = 0x0f;
while(1)
{
PORTA = 0x08;//设置行4输出高电平,其它为低电平
temp = PINA;//读取PA口电平
temp &= 0xf0;//屏蔽行电平
if(temp != 0x00)//是否有按键按下
{
_delay_ms(20);//延时20ms消抖
temp = PINA;//再次读取PA口电平
temp &= 0xf0;//屏蔽行电平
if(temp != 0x00)//确认有按键按下
{
temp = PINA;
temp &= 0xf0;
switch(temp)
{
case 0x10 : key =1;break;
case 0x20 : key =2;break;
case 0x40 : key =3;break;
case 0x80 : key =4;break;
}
}
}
while(temp != 0x00)//松手检测
{
temp = PINA;
temp &= 0xf0;
}
PORTA = 0x04;//设置行3输出高电平,其它为低电平
temp = PINA;//读取PA口电平
temp &= 0xf0;//屏蔽行电平
if(temp != 0x00)//是否有按键按下
{
_delay_ms(20);//延时20ms消抖
temp = PINA;//再次读取PA口电平
temp &= 0xf0;//屏蔽行电平
if(temp != 0x00)//确认有按键按下
{
temp = PINA;
temp &= 0xf0;
switch(temp)
{
case 0x10 : key =5;break;
case 0x20 : key =6;break;
case 0x40 : key =7;break;
case 0x80 : key =8;break;
}
}
}
while(temp != 0x00)//松手检测
{
temp = PINA;
temp &= 0xf0;
}
PORTA = 0x01;//设置行2输出高电平,其它为低电平
temp = PINA;//读取PA口电平
temp &= 0xf0;//屏蔽行电平
if(temp != 0x00)//是否有按键按下
{
_delay_ms(20);//延时20ms消抖
temp = PINA;//再次读取PA口电平
temp &= 0xf0;//屏蔽行电平
if(temp != 0x00)//确认有按键按下
{
temp = PINA;
temp &= 0xf0;
switch(temp)
{
case 0x10 : key =9;break;
case 0x20 : key =10;break;
case 0x40 : key =11;break;
case 0x80 : key =12;break;
}
}
}
while(temp != 0x00)//松手检测
{
temp = PINA;
temp &= 0xf0;
}
PORTA = 0x01;//设置行1输出电平,其它为低电平
temp = PINA;//读取PA口电平
temp &= 0xf0;//屏蔽行电平
if(temp != 0x00)//是否有按键按下
{
_delay_ms(20);//延时20ms消抖
temp = PINA;//再次读取PA口电平
temp &= 0xf0;//屏蔽行电平
if(temp != 0x00)//确认有按键按下
{
temp = PINA;
temp &= 0xf0;
switch(temp)
{
case 0x10 : key =13;break;
case 0x20 : key =14;break;
case 0x40 : key =15;break;
case 0x80 : key =16;break;
}
}
}
while(temp != 0x00)//松手检测
{
temp = PINA;
temp &= 0xf0;
}
}
}
哪位大哥帮我看一看这个程序有什么问题?
我用PROTUES仿真的时候,当按键被按下后,对应被设置为输入的IO口就出现高电平,这是正常的,可是我松手后对应被设置为输入的IO口还是高电平,感觉像是开关没有弹起一样,后来试了好久都找不到原因。后来我注释掉其中三行,只留一行按键却很正常,哪位大哥帮我看一看,我真的很想知道原因。
此帖出自
小平头技术问答
如果是输入下拉状态就用高电平扫,比如0001,0010,0100,1000...
一周热门 更多>