打印
[AVR单片机]

大家帮我看下我的avr按键程序哪里出现问题了

[复制链接]
1034|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
282045368|  楼主 | 2015-1-5 11:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的是PD0-PD3,PE4-PE7作为按键的输入。
PD0-PD3,按键的另外一端接地,
PE4-PE7,按键的另外一段接电源。



#include <delay.h>
int key;
/*
默认初始化状态为:PD0-PD3 输入 on output
                   PE4-PE7 输入  off output     
DDRD &= 0xf0;  //PD0-PD3 输入
PORTD &= 0x0f; //set PD0-PD4 all on output

DDRE &= 0x0f;//PE4-PE7 输入
PORTE &= 0x00;//set PE4-PE7 all off output

*/


int keysarch(void)
{
    key = 0;
    if(PIND&0x0f != 0x0f)        //set PD0-PD3 all on output
    {
        delay_ms(10);
        if(PIND&0x0f != 0x0f)
        {
            switch(PIND&0x0f)
            {
                case 0x0e:key = 1;break;
                case 0x0d:key = 2;break;
                case 0x0b:key = 3;break;
                case 0x07:key = 4;break;
                default: key = 0;break;
            }

        }
    }

    if(PINE&0xf0 != 0x00)
    {
        delay_ms(10);
        if(PINE&0xf0 != 0x00)
        {
            switch(PINE&0xf0)      
            {
                case 0x10:key = 5;break;
                case 0x20:key = 6;break;
                case 0x40:key = 7;break;
                case 0x80:key = 8;break;
                default: key = 0;break;
            }
        }
    }
    return key;

}

相关帖子

沙发
kingtekharlin| | 2015-1-5 23:51 | 只看该作者
看起来有点问题。你直接都是应用PINE来操作的,最好是先存放到一个变量里面,然后用这个变量再来作判断。因为这个PINE的值是会变的。
以51单片机为例:
    - 18 -  {  uchar temp,key;     P3=0xfe;     temp=P3;      temp=temp&0xf0;     if(temp!=0xf0)     {        delayms(10);    temp=P3;    temp=temp&0xf0;       if(temp!=0xf0)       {          temp=P3;         switch(temp)         {            case 0xee:

详细 QQ 1085487223

使用特权

评论回复
板凳
ningling_21| | 2015-1-6 11:41 | 只看该作者
类似这样的  if(PIND&0x0f != 0x0f)

改成

if((PIND&0x0f) != 0x0f)

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
282045368 + 1 很给力!
地板
hillslb| | 2015-1-6 17:03 | 只看该作者
本帖最后由 hillslb 于 2015-1-6 17:22 编辑

按键PD建议上拉10K的电阻到VCC,PE建议下拉10K的电阻到GND。
int keysarch(void)
{
        unsigned int key = 0;
        unsigned char temp1 ,temp2, temp3, temp4;
        temp1  = PIND&0x0f;
        temp2 =  PINE&0xf0;
        if(temp1 != 0x0f||temp2 != 0x00)
        {
                delay_ms(10);
               temp3 =  PIND&0x0f;
               temp4 =  PINE&0xf0;
                if(temp1 == temp3)
                {
                        switch(temp3)
                        {
                        case 0x0e:
                                key = 1;
                                break;
                        case 0x0d:
                                key = 2;
                                break;
                        case 0x0b:
                                key = 3;
                                break;
                        case 0x07:
                                key = 4;
                                break;
                        default:
                                break;
                        }
                }
                if(temp2 == temp4)
                {
                        switch(temp4)      
                        {
                        case 0x10:
                                key = 5;
                                break;
                        case 0x20:
                                key = 6;
                                break;
                        case 0x40:
                                key = 7;
                                break;
                        case 0x80:
                                key = 8;
                                break;
                        default:
                                break;
                        }
                }
                break;
        }
        return key;
}
变量key可以声明为unsigned char key ,函数返回值类型也为unsigned char。
若不对PD和PE上拉或者下拉,需要在读IO之前输出一个与期望相反的电平,延时一段时间后在读IO。
delay_ms(10)函数是一个死循环一般很少这样用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

19

帖子

0

粉丝