xiaohong.zhang 发表于 2011-6-15 16:58:18

为什么我这程序,我还没给它按键输入值,它灯就亮了···程序一烧写进去 就开始亮

为什么我这程序,我还没给它按键输入值,它灯就亮了···程序一烧写进去 就开始亮

#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;
}

titrwh 发表于 2011-6-15 17:10:38

电路?

xiaohong.zhang 发表于 2011-6-15 17:22:54

回复【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)

titrwh 发表于 2011-6-15 17:33:48

switch(key_state)
    {
      case key_state_0:
不知道你程序在做什么?格式好像都有问题。“key_state_0”是什么?
格式应该是这样:
switch(key_state)
    {
      case 0:

machao 发表于 2011-6-15 19:51:16

如果是:

“我现在只测第一个按键,即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,把基础补好。

xiaohong.zhang 发表于 2011-6-16 08:40:34

回复【3楼】titrwh
-----------------------------------------------------------------------

回复【3楼】titrwh
switch(key_state)
    {
      case key_state_0:
不知道你程序在做什么?格式好像都有问题。“key_state_0”是什么?
格式应该是这样:
switch(key_state)
    {
      case 0:

-----------------------------------------------------------------------

之前有宏定义,key_stat_0 代表0,我这边是查询状态

xiaohong.zhang 发表于 2011-6-16 08:45:59

回复【4楼】machao
如果是:
“我现在只测第一个按键,即pb0输出,pa0输入,如果pina = 0x01,即pa0收到信号,灯就亮”
那么,你解释你的这段代码做了什么:
void port_init()
{
    ddrb |= bit(pb0)|bit(pb1);
    ddra &amp;= ~(bit(pa0)|bit(1)|bit(2));
    portb |= bit(pb0);
    porta &amp;= ~(bit(pa0)|bit(pa1)|bit(pa2));
}
如果你解释不清楚,先不要学avr,把基础补好。

-----------------------------------------------------------------------

这边是设置IO口,B口的0跟1位设置为输出,先让0位输出1;A口的1、2、3为设置为输入,

machao 发表于 2011-6-16 09:25:04

porta &= ~(bit(pa0)|bit(pa1)|bit(pa2));

这句是什么意义?设置后如果PA0什么也不接,你读PA口是什么值?

machao 发表于 2011-6-16 09:25:20

porta &= ~(bit(pa0)|bit(pa1)|bit(pa2));

这句是什么意义?设置后如果PA0什么也不接,你读PA口是什么值?

xiaohong.zhang 发表于 2011-6-16 09:49:21

回复【8楼】machao
    porta &amp;= ~(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,是的话,灯就亮,。

machao 发表于 2011-6-16 18:06:12

已经给你点到如此的清楚,你都还搞不清楚。我没看到你的按键电路,但看你的解释就知道你必须从基础好好的开始学习。

你的初始化如下:
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”,灯还是亮。

看到此,我都怀疑,你是否看的懂按键电路的工作原理。如果被我说中的话,你真的要先检讨自己的学习态度和方法,否则你是不适合做这行的。

xiaohong.zhang 发表于 2011-6-17 09:26:30

回复【10楼】machao
-----------------------------------------------------------------------

谢谢老师!!
页: [1]
查看完整版本: 为什么我这程序,我还没给它按键输入值,它灯就亮了···程序一烧写进去 就开始亮