为什么我这程序,我还没给它按键输入值,它灯就亮了···程序一烧写进去 就开始亮
为什么我这程序,我还没给它按键输入值,它灯就亮了···程序一烧写进去 就开始亮#include <iom32v.h>
#include <macros.h>
unsigned char NUM;
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
void delay1(unsigned int z) //delay Z*1ms
{
unsigned int x,y;
for(x = 0; x < z; x++)
for(y = 0; y < 525; y++);
}
void port_init()
{
DDRB |= BIT(PB0)|BIT(PB1);
DDRA &= ~(BIT(PA0)|BIT(1)|BIT(2));
PORTB |= BIT(PB0);
PORTA &= ~(BIT(PA0)|BIT(PA1)|BIT(PA2));
}
unsigned char keyread()
{
static unsigned char key_state = 0;
static unsigned char key_old;
unsigned char key_press;
unsigned char key_return = 0x00;
key_press = PINA & 0x07;
_NOP();
_NOP();
// delay1(10);
key_press = PINA & 0x07;
switch(key_state)
{
case key_state_0:
if(key_press != 0x00)
key_state = key_state_1;
else
key_state = key_state_0;
break;
case key_state_1:
if(key_press == key_old)
{
key_return = key_press;
key_state = key_state_2;
}
else
key_state = key_state_0;
break;
case key_state_2:
if(key_press != key_old)
key_state = key_state_0;
break;
}
key_old = key_press;
return key_return;
}
int main(void)
{
//NOP();
unsigned char key_value;
port_init();
while(1)
{
key_value = keyread();
if(key_value == 0x01)
Led_One_Full(6,1); //亮灯程序DDRB |= BIT(PB6);
// DDRA |= BIT(PA5);
// PORTB |= BIT(PB6);
// PORTA &= ~BIT(PA5);
else
Led_One_Full(0,0); //灯灭
}
return 0;
} 电路? 回复【1楼】titrwh
-----------------------------------------------------------------------
电路很简单,就是PB0、PB1、PA0、PA1、PA2无根线控制的键盘,PB0、PB1输出,PA0、PA1、PA2输入,我现在只测第一个按键,即pb0输出,pa0输入,如果PINA = 0X01,即pa0收到信号,灯就亮·,现在的问题是,我还没给他信号,灯就自己亮,测了好几次,系统默认两线已接通··
http://cache.amobbs.com/bbs_upload782111/files_40/ourdev_649168GSNTEL.jpg
(原文件名:QQ截图未命名.jpg) switch(key_state)
{
case key_state_0:
不知道你程序在做什么?格式好像都有问题。“key_state_0”是什么?
格式应该是这样:
switch(key_state)
{
case 0: 如果是:
“我现在只测第一个按键,即pb0输出,pa0输入,如果PINA = 0X01,即pa0收到信号,灯就亮”
那么,你解释你的这段代码做了什么:
void port_init()
{
DDRB |= BIT(PB0)|BIT(PB1);
DDRA &= ~(BIT(PA0)|BIT(1)|BIT(2));
PORTB |= BIT(PB0);
PORTA &= ~(BIT(PA0)|BIT(PA1)|BIT(PA2));
}
如果你解释不清楚,先不要学AVR,把基础补好。 回复【3楼】titrwh
-----------------------------------------------------------------------
回复【3楼】titrwh
switch(key_state)
{
case key_state_0:
不知道你程序在做什么?格式好像都有问题。“key_state_0”是什么?
格式应该是这样:
switch(key_state)
{
case 0:
-----------------------------------------------------------------------
之前有宏定义,key_stat_0 代表0,我这边是查询状态 回复【4楼】machao
如果是:
“我现在只测第一个按键,即pb0输出,pa0输入,如果pina = 0x01,即pa0收到信号,灯就亮”
那么,你解释你的这段代码做了什么:
void port_init()
{
ddrb |= bit(pb0)|bit(pb1);
ddra &= ~(bit(pa0)|bit(1)|bit(2));
portb |= bit(pb0);
porta &= ~(bit(pa0)|bit(pa1)|bit(pa2));
}
如果你解释不清楚,先不要学avr,把基础补好。
-----------------------------------------------------------------------
这边是设置IO口,B口的0跟1位设置为输出,先让0位输出1;A口的1、2、3为设置为输入, porta &= ~(bit(pa0)|bit(pa1)|bit(pa2));
这句是什么意义?设置后如果PA0什么也不接,你读PA口是什么值? porta &= ~(bit(pa0)|bit(pa1)|bit(pa2));
这句是什么意义?设置后如果PA0什么也不接,你读PA口是什么值? 回复【8楼】machao
porta &= ~(bit(pa0)|bit(pa1)|bit(pa2));
这句是什么意义?设置后如果pa0什么也不接,你读pa口是什么值?
-----------------------------------------------------------------------
ddra &= ~(bit(pa0)|bit(1)|bit(2));
porta &= ~(bit(pa0)|bit(pa1)|bit(pa2));
这个是设置IO口输出,处于高阻态,没用上拉电阻。
PA0 是跟PB0 连接在一起的··,用pB0输出1,如果有按键按下的话,PA就接到1的信号,PA口的值就为0x01,然后判断读到的值是否为0x01,是的话,灯就亮,。 已经给你点到如此的清楚,你都还搞不清楚。我没看到你的按键电路,但看你的解释就知道你必须从基础好好的开始学习。
你的初始化如下:
void port_init()
{
ddrb |= bit(pb0)|bit(pb1);
ddra &= ~(bit(pa0)|bit(1)|bit(2));
portb |= bit(pb0);
porta &= ~(bit(pa0)|bit(pa1)|bit(pa2));
}
PB0为输出方式,输出1,是吧?!
如果:
1。PB0同PA0是“连接在一起的”(真不知道你的按键是什么样的电路),那么PA0就是“1”了吧?灯当然亮
2。如果PBO与PA0不是“连接在一起的”(只是按键按下才连在一起),尽管此时PA0为输入(这里你还写成输出!),高阻,那么读到的PA0是“1”还是“0”?!,还是“1”,灯还是亮。
看到此,我都怀疑,你是否看的懂按键电路的工作原理。如果被我说中的话,你真的要先检讨自己的学习态度和方法,否则你是不适合做这行的。 回复【10楼】machao
-----------------------------------------------------------------------
谢谢老师!!
页:
[1]