求教: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循环