我在学单片机avrmega 128时,按键总是自己置零,还老让我电脑死机
下面是我编写的一个程序,不知为甚么,不管有没有按按键,程序都认为我按下了按键,我用studio硬仿了一下,发现在main()中当程序运行到delay(),跳转到delay...
下面是我编写的一个程序,不知为甚么,不管有没有按按键,程序都认为我按下了按键,我用studio硬仿了一下,发现在main()中当程序运行到delay(),跳转到delay()这个函数时,控制按键的PIND=111111011,我想了很久,都不知为什么,什么都没做啊,应该全是1才对啊,求高手啊,本人是菜鸟来的,刚学的单片机,求高手指明,还有我是用iccavr7.22加studio4.18来编程的,不知为什么,用studio的仿真时电脑经常性出现蓝屏,然后得重开机,是程序的问题,还是软件或是硬件的问题,这样对电脑会不会很损啊,我用的是笔记本的,先谢了各位。
#include<iom128v.h>
#include<macros.h>
#define uint unsigned int
#define uchar unsigned char
const uchar CCW[8]={0xef,0xcf,0xdf,0x9f,0xbf,0x3f,0x7f,0x6f};//逆时钟
const uchar CW[8]={0x6f,0x7f,0x3f,0xbf,0x9f,0xdf,0xcf,0xef};//顺时钟
void delay(uint ms) //ms级延时
{
uint c,d;
for(c=0;c<ms;c++)
for(d=0;d<100;d++);
}
uint key_press() //判断是否有按键按下
{
uint a=0;
uchar b;
delay(10);
if(PIND!=0xff) //判断是否有按键按下
{
delay(10);
if(PIND!=0xff)
a=1;
delay(10);
}
return a;
}
int main()
{
uint b,c,d;
DDRE=0XFF; //设为输出
PORTE|=BIT(2); //使能74hc573
DDRD=0x00; //设为输入
PORTD=0xFF; //拉高电位
DDRA=0XFF; //设为输出
PORTA=0XFF; //拉高,led灯灭
for(b=0;b<50;b++) //加速步进机
{
for(c=0;c<8;c++)
{
PORTE=CCW[c];
delay(60-b);
}
}
while(1) //匀速
{
if(key_press()) //如有按键按下,点亮LED,退出该循环
{
PORTA=0X00;
break;
}
for(c=0;c<8;c++) //匀速
{
PORTE=CCW[c];
delay(10);
}
}
for(b=50;b>0;b--) //减速阶段
{
for(c=0;c<8;c++)
{
PORTE=CCW[c];
delay(60-b);
}
}
PORTE&=0x0f; //步进机接口置零
PORTA=0XFF; //灭LED
} 展开
#include<iom128v.h>
#include<macros.h>
#define uint unsigned int
#define uchar unsigned char
const uchar CCW[8]={0xef,0xcf,0xdf,0x9f,0xbf,0x3f,0x7f,0x6f};//逆时钟
const uchar CW[8]={0x6f,0x7f,0x3f,0xbf,0x9f,0xdf,0xcf,0xef};//顺时钟
void delay(uint ms) //ms级延时
{
uint c,d;
for(c=0;c<ms;c++)
for(d=0;d<100;d++);
}
uint key_press() //判断是否有按键按下
{
uint a=0;
uchar b;
delay(10);
if(PIND!=0xff) //判断是否有按键按下
{
delay(10);
if(PIND!=0xff)
a=1;
delay(10);
}
return a;
}
int main()
{
uint b,c,d;
DDRE=0XFF; //设为输出
PORTE|=BIT(2); //使能74hc573
DDRD=0x00; //设为输入
PORTD=0xFF; //拉高电位
DDRA=0XFF; //设为输出
PORTA=0XFF; //拉高,led灯灭
for(b=0;b<50;b++) //加速步进机
{
for(c=0;c<8;c++)
{
PORTE=CCW[c];
delay(60-b);
}
}
while(1) //匀速
{
if(key_press()) //如有按键按下,点亮LED,退出该循环
{
PORTA=0X00;
break;
}
for(c=0;c<8;c++) //匀速
{
PORTE=CCW[c];
delay(10);
}
}
for(b=50;b>0;b--) //减速阶段
{
for(c=0;c<8;c++)
{
PORTE=CCW[c];
delay(60-b);
}
}
PORTE&=0x0f; //步进机接口置零
PORTA=0XFF; //灭LED
} 展开
展开全部
没有学过你说的这种单片机,但是我觉得你程序中的那个按键判断是不是应该具体的一点用到那一个脚上,不能都用0xff判断,可能就是因为你的那个BIT2也在0xff中了,我觉得这有很大的可能性
追问
因为我想调用所有的按键,bit(2)是作用在PORTE上的,怎么会影响到PIND呢
追答
那我就不清楚了,我没有学过你的说的这种单片机,帮不了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
没有对PORTD进行操作,但是PORTD有低电平,检查硬件电路有没有问题。再就是,确实单独判断某个引脚比判断整个PIND要好
更多追问追答
追问
不是PORTD是PIND,就是我没进行任何操作,PIND的第三位就置零了,都是在main()第一次运行到delay()时,跳转到这个子程序时发生的置零,不知为什么,我用其他的按键程序都没问题,只有这个出问题了,所以应该不是硬件的问题吧
追答
这个程序不可能有问题,是不是还有其他的函数没有粘进来。
仔细检查ICC选择的单片机是不是MEGA128。
再拿示波器用1s的扫描时间测试PD2的引脚电平,看它有没有被置低。
在主函数的末尾加上while(1),一般来说单片机主循环不能break。
还不行的话,找个高手帮你实地的看看吧,我只能看出这么多了
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用iar for avr吧 很好用,编译和仿真集成到一块儿了 ,很方便很强大。
追问
我已经找了这软件找了很久,但找不到破解版的,我的是win7 64x的系统,你能给我提供一个吗?不要那种限制版的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询