切换到宽版
  • 2389阅读
  • 11回复

[AVR]求教:ATM16单片机按键判断无法执行 [复制链接]

上一主题 下一主题
离线tbb1
 

发帖
8
M币
-494
专家
0
粉丝
0
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2018-03-19
求教:ATM16单片机按键判断无法执行
各位大侠,
本人用ATM16单片机控制步进电机,逻辑是开机正转,按下Mw后逆转,松开后恢复正转。方向通过对PORTA位操作进行改变。
为了调试,增加了一个点LED的语句,检测是否有按键。
1.按下面的程序,开机正转,按下Mw后LED点亮,但方向没变,说明PORTA新的赋值没有变。松开Mw后LED仍然亮着,不灭。
2.运行完LED亮灯程序后,发现按键后,并不能进入到switch语句对PINC进行判断,是什么原因呢?
为了简化,我把不必要的语句省略了。请问程序上有什么问题呢?


#define Mw  PINC&0x01  //RA-.PIN是用来读出io口的逻辑电平值。不能对它写操作。
#define Ns  PIND&0x10
#define Sp  PINA&0x02  //00000010,PA1
#define Key_Pin PINC



////////////////////////////////////
//R.A.跟踪定时器初始化
//////////////////////////////////////
void Timer1_Init(void)
{
TIMSK=TIMSK&0x54;  //01010100,T1T2溢出中断允许.原来c3,是不是应该是0x1c,TC1使能??00011100:TC1使能
TCCR1A=0x40; //0x40  4:0100--比较匹配时OC1A取反,0:和下面的TCCR1B的9组合,0100--CTC模式,OCR1A为计数最大值
TCCR1B=0x09; //0x09  00001001:WGM12=1,CTC模式。CS00=1(无分频)
TCNT1H=0x00; //计时器的底为0      
TCNT1L=0x00;
OCR1AH=0x09; //RA脉冲输出,对应PD5。16细分
OCR1AL=0xbd; //
}
/////////////////////////////////////
///DEC调整定时器初始化(2018.3.12还未涉及DEC调整)
//////////////////////////////////////
void Timer2_Init(void)
{
TIMSK=TIMSK&0x54;  //01010100:TC0/TC2使能
TCCR2=0x18;  //00011000.比较匹配时取反OC0,CTC模式,0001-1001,0x19-不分频,0x18-停止TC2.最后的001对应不分频,000-停止TC2.WGM指定为CTC方式,PB3输出
TCNT2=0x00;  //计时器起点为0
OCR2=0x56; //DEC脉冲输出,对应PD7.一倍速6b//二倍速35//八倍速0d    foc0= fclk/(2N(1+OCR0))
}

void Jianpan_Init(void)  //键盘初始化函数
{  
DDRC=0x00;    //输入态  
Key_Pin=0xef;     //启用上拉电阻  
}  

int jiance(void)     //检测函数  
{  
   if (Key_Pin==0xff)  
    {
     return 0;  
    }  
   else  
    {  
    return 1;  
    }
}

int shibie(void)      //识别按键函数
{  
  switch(PINC)  
  {  
case 0xfe:
return 1;
break;   //Mw
case 0xfd:
return 2;
break;   //MS
case 0xfb:
return 3;
break;   //Mn
case 0xf7:
return 4;
break;   //Me
default:
return 0;  
  }
}


int main(void)            
{
int Key=0;
Port_Init();      //端口初始化
Timer1_Init();
Timer2_Init();
Motor_Init();
Jianpan_Init();

sei();            //使能全局中断  
    
    while(1)
    {        

        if ((Mw)==0)
        PORTB=PORTB&0xbf;  //16x led 测试用
        else
        PORTB=PORTB&0xff;
        
          Key=shibie();//获取键码    
          switch(Key)
          {
           case 1:
            PORTA=0x84;  //10000100,没有按键时,默认向西运动
            PORTB=0xbf;  //16x led 测试用
            break;
         /* else if(Key=0)  //00001000
           {
           delayms(10);
           if((Mw)!=0)
            PORTA=0x8c;  //10001100:100-16细分,000-无细分,PA4--使能,PA3--方向(0-反向),PA2--reset(0时终止输出?).


          case 2:
            TCCR2=0x19;
            PORTB=0x67;  //01100111,不使能2f,使能27,010-4细分,100--16细分?0101111.PB0-2:32细分,PB5-reset,PB3-1时不使能,PB4:方向。正转0x27 反转ox37,PB6--16X Led

    }  //while循环
} //main循环
离线hl0716

发帖
569
M币
231
专家
2
粉丝
19
只看该作者 1楼 发表于: 2018-03-20
请登录后查看
离线huaweiwx

发帖
1372
M币
2167
专家
65
粉丝
297
只看该作者 2楼 发表于: 2018-03-20
请登录后查看
[ 此帖被huaweiwx在2018-03-20 10:07重新编辑 ]
离线tbb1

发帖
8
M币
-494
专家
0
粉丝
0
只看该作者 3楼 发表于: 2018-03-20
回 huaweiwx 的帖子
请登录后查看
离线huaweiwx

发帖
1372
M币
2167
专家
65
粉丝
297
只看该作者 4楼 发表于: 2018-03-20
回 tbb1 的帖子
请登录后查看
离线huaweiwx

发帖
1372
M币
2167
专家
65
粉丝
297
只看该作者 5楼 发表于: 2018-03-20
回 huaweiwx 的帖子
请登录后查看
离线tbb1

发帖
8
M币
-494
专家
0
粉丝
0
只看该作者 6楼 发表于: 2018-03-20
回 huaweiwx 的帖子
请登录后查看
离线huaweiwx

发帖
1372
M币
2167
专家
65
粉丝
297
只看该作者 7楼 发表于: 2018-03-20
请登录后查看
离线tbb1

发帖
8
M币
-494
专家
0
粉丝
0
只看该作者 8楼 发表于: 2018-03-29
回 huaweiwx 的帖子
请登录后查看
离线tbb1

发帖
8
M币
-494
专家
0
粉丝
0
只看该作者 9楼 发表于: 2018-03-29
回 huaweiwx 的帖子
请登录后查看
快速回复
限80 字节
“新手上路”发帖需审核后才能显示(请认真发帖),达到数码9级后取消此限制
 
上一个 下一个