搜索
bottom↓
回复: 11

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

[复制链接]

出0入0汤圆

发表于 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;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-6-15 17:10:38 | 显示全部楼层
电路?

出0入0汤圆

 楼主| 发表于 2011-6-15 17:22:54 | 显示全部楼层
回复【1楼】titrwh
-----------------------------------------------------------------------

电路很简单,就是PB0、PB1、PA0、PA1、PA2无根线控制的键盘,PB0、PB1输出,PA0、PA1、PA2输入,我现在只测第一个按键,即pb0输出,pa0输入,如果PINA = 0X01,即pa0收到信号,灯就亮·,现在的问题是,我还没给他信号,灯就自己亮,测了好几次,系统默认两线已接通··

(原文件名:QQ截图未命名.jpg)

出0入0汤圆

发表于 2011-6-15 17:33:48 | 显示全部楼层
switch(key_state)
    {
        case key_state_0:
不知道你程序在做什么?格式好像都有问题。“key_state_0”是什么?
格式应该是这样:
switch(key_state)
    {
        case 0:

出0入0汤圆

发表于 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,把基础补好。

出0入0汤圆

 楼主| 发表于 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,我这边是查询状态

出0入0汤圆

 楼主| 发表于 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为设置为输入,

出0入0汤圆

发表于 2011-6-16 09:25:04 | 显示全部楼层
porta &= ~(bit(pa0)|bit(pa1)|bit(pa2));  

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

出0入0汤圆

发表于 2011-6-16 09:25:20 | 显示全部楼层
porta &= ~(bit(pa0)|bit(pa1)|bit(pa2));  

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

出0入0汤圆

 楼主| 发表于 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,是的话,灯就亮,。

出0入0汤圆

发表于 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”,灯还是亮。

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

出0入0汤圆

 楼主| 发表于 2011-6-17 09:26:30 | 显示全部楼层
回复【10楼】machao
-----------------------------------------------------------------------

谢谢老师!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 04:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表