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;把高四位再置为输入,有啥区别
更正一下,是矩阵键盘
展开
 我来答
陈学阳
2010-09-13 · TA获得超过2.8万个赞
知道大有可为答主
回答量:2.1万
采纳率:14%
帮助的人:5629万
展开全部
做试验啊,这个没别的更好的办法。
入PINx的值会随外部电路输入高低电平变化而变化,因为它此时属于输入状态,能读入引脚电平;而所谓的高阻态只是相对于输出来说的,输出进入高阻态,并不影响输入,即PINx的读入。
一次我搭了一个键盘电路,没有使用上拉电阻,且DDRx、PORTx分别配置为0、0,发现PINx的值由于外界干扰而不停地改变;而DDRx、PORTx分别配置为0、1发现PINx的值不再受外界干扰(内部上拉电阻使能了),而是受键盘的正常控制。综上所述,读入PINx的值会随外部电路输入高低电平变化而变化。

如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
生活营口
2010-09-13 · TA获得超过187个赞
知道小有建树答主
回答量:327
采纳率:0%
帮助的人:266万
展开全部
问题在于输入口上拉上。如无外部上拉,就需要内部上拉。PORT口输出1,方向为0,开相应内部上拉。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
qqjjqq123
2010-09-13
知道答主
回答量:20
采纳率:0%
帮助的人:0
展开全部
把DDRD=0xff语句放在do循环的开头时,这条语句只是在这个循环里有效,出了这个循环就不起作用了D口的设置。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式