AVR单片机独立键盘C语言程序的问题(关于配置IO口)重分奖励
ucharkey_scan(){ucharkey,j,i=0x7f;DDRD=0xff;//这个语句是把D排IO口寄存器设置为输出,但是如果把这句放在下面do循环的开头,...
uchar key_scan()
{
uchar key,j,i=0x7f;
DDRD=0xff;//这个语句是把D排IO口寄存器设置为输出,但是如果把这句放在下面do循环的开头,就有问题,请问是为什么,按键时就没反应,一直显示5
do
{
i=(i<<1|i>>7);
PORTD=i;
DDRD=0x0f;
key=PIND;
j=key&0xf0;
}
while(j==0xf0);
while(key_press());
switch(key)
{
case 0xee:key=0;
break;
case 0xde:key=1;
break;
case 0xbe:key=2;
break;
case 0x7e:key=3;
break;
case 0xed:key=4;
break;
case 0xdd:key=5;
break;
case 0xbd:key=6;
break;
case 0x7d:key=7;
break;
case 0xeb:key=8;
break;
case 0xdb:key=9;
break;
case 0xbb:key=10;
break;
case 0x7b:key=11;
break;
case 0xe7:key=12;
break;
case 0xd7:key=13;
break;
case 0xb7:key=14;
break;
case 0x77:key=15;
break;
}
return key;
}
这个语句就是检测D排IO口的状况去判断按了哪个键,就是上面那个标注语句摆放问题,放在上面很正常,放在DO语句开头就不正常,这样有区别吗,如果放在外面不就是把IOD的高四位一直保持为输入状态,就算我加了DDRD=0xff这个语句在里面,也应该不会有很大影响吧,反正每次把高四位置为输出再通过DDRD=0x0f;把高四位再置为输入,有啥区别
更正一下,是矩阵键盘 展开
{
uchar key,j,i=0x7f;
DDRD=0xff;//这个语句是把D排IO口寄存器设置为输出,但是如果把这句放在下面do循环的开头,就有问题,请问是为什么,按键时就没反应,一直显示5
do
{
i=(i<<1|i>>7);
PORTD=i;
DDRD=0x0f;
key=PIND;
j=key&0xf0;
}
while(j==0xf0);
while(key_press());
switch(key)
{
case 0xee:key=0;
break;
case 0xde:key=1;
break;
case 0xbe:key=2;
break;
case 0x7e:key=3;
break;
case 0xed:key=4;
break;
case 0xdd:key=5;
break;
case 0xbd:key=6;
break;
case 0x7d:key=7;
break;
case 0xeb:key=8;
break;
case 0xdb:key=9;
break;
case 0xbb:key=10;
break;
case 0x7b:key=11;
break;
case 0xe7:key=12;
break;
case 0xd7:key=13;
break;
case 0xb7:key=14;
break;
case 0x77:key=15;
break;
}
return key;
}
这个语句就是检测D排IO口的状况去判断按了哪个键,就是上面那个标注语句摆放问题,放在上面很正常,放在DO语句开头就不正常,这样有区别吗,如果放在外面不就是把IOD的高四位一直保持为输入状态,就算我加了DDRD=0xff这个语句在里面,也应该不会有很大影响吧,反正每次把高四位置为输出再通过DDRD=0x0f;把高四位再置为输入,有啥区别
更正一下,是矩阵键盘 展开
3个回答
展开全部
做试验啊,这个没别的更好的办法。
入PINx的值会随外部电路输入高低电平变化而变化,因为它此时属于输入状态,能读入引脚电平;而所谓的高阻态只是相对于输出来说的,输出进入高阻态,并不影响输入,即PINx的读入。
一次我搭了一个键盘电路,没有使用上拉电阻,且DDRx、PORTx分别配置为0、0,发现PINx的值由于外界干扰而不停地改变;而DDRx、PORTx分别配置为0、1发现PINx的值不再受外界干扰(内部上拉电阻使能了),而是受键盘的正常控制。综上所述,读入PINx的值会随外部电路输入高低电平变化而变化。
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
入PINx的值会随外部电路输入高低电平变化而变化,因为它此时属于输入状态,能读入引脚电平;而所谓的高阻态只是相对于输出来说的,输出进入高阻态,并不影响输入,即PINx的读入。
一次我搭了一个键盘电路,没有使用上拉电阻,且DDRx、PORTx分别配置为0、0,发现PINx的值由于外界干扰而不停地改变;而DDRx、PORTx分别配置为0、1发现PINx的值不再受外界干扰(内部上拉电阻使能了),而是受键盘的正常控制。综上所述,读入PINx的值会随外部电路输入高低电平变化而变化。
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
展开全部
问题在于输入口上拉上。如无外部上拉,就需要内部上拉。PORT口输出1,方向为0,开相应内部上拉。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
把DDRD=0xff语句放在do循环的开头时,这条语句只是在这个循环里有效,出了这个循环就不起作用了D口的设置。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询