📄 main.c
字号:
#include <msp430x22x4.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define EnableON P1OUT|=BIT4 ; //ENABLE置为高 各相输出被强制关闭
#define EnableOFF P1OUT&=~BIT4; //ENABLE置为低
//////////////////////////////////////////////////////
void initTIMERA0(void)
{
TACTL=TASSEL_2+MC_1; //开启定时器0中断 TA选择main时钟 增计数模式
CCR0=50;
}
#pragma vector=TIMERA0_VECTOR
__interrupt void TIMERA(void)
{
P3OUT^=BIT0; //取反
}
////////////////////////////////////////////////////////////按键部分
unsigned char keypoint=0;
void delay(int v) //延时函数
{
while(v!=0)v--;
}
unsigned char key(void) //按键分析函数
{
unsigned char a;
unsigned char x=0xff;
P2OUT=0Xe0; //扫描第一行
a=P2IN&0X0F;
switch(a)
{
case 0x0E: x=0;break;
case 0x0D: x=1;break;
case 0x0B: x=2;break;
case 0x07: x=3;break;
default:break;
}
P2OUT=0Xd0; //扫描第二行
a=P2IN&0X0F;
switch(a)
{
case 0X0E: x=4;break;
case 0X0D: x=5;break;
case 0X0B: x=6;break;
case 0X07: x=7;break;
default:break;
}
P2OUT=0Xb0; //扫描第三行
a=P2IN&0X0F;
switch(a)
{
case 0X0E: x=8;break;
case 0X0D: x=9;break;
case 0X0B: x=10;break;
case 0X07: x=11;break;
default:break;
}
P2OUT=0X70; //扫描第四行
a=P2IN&0X0F;
switch(a)
{
case 0X0E: x=12;break;
case 0X0D: x=13;break;
case 0X0B: x=14;break;
case 0X07: x=15;break;
default:break;
}
return(x);
}
///////////////////////////////////////////////////////////////////
unsigned char keypress(void) //分析按键是否按下函数
{
unsigned char x=0;
P2OUT=0x00; //键盘硬件:P20--P23为列线,最左边一根为P20,列线120k电阻上拉,
if((P2IN&0X0f)!=0X0F) x=1; // P24--P27为行线,最上边一根为P24,
return(x); // 无按键,返回 0; 有按键返回 1
}
#pragma vector=PORT2_VECTOR
__interrupt void port2key(void)
{
if(keypress())
{
delay(300) ; //消抖
if(keypress())
{
keypoint=key();
}
while(keypress()); //等待按键松开
}
P2OUT=0X00;
P2IFG=0X00; //清除中断标志
LPM0_EXIT;
}
////////////////////////////////////////////步进电机设置
void setspeed(void) //改变速度
{
EnableON;
delay(500);
CCTL0 = CCIE;
CCR0 = 5000;
EnableOFF;
_NOP();
}
///////////////////////////////////////////////////
void init(void)
{
P1DIR=0xff;
P1SEL=0X00;
P3DIR=0XFF;
P3OUT|=BIT1; //CK2置高
P1OUT|=BIT3; //RESET置为高
P1OUT|=BIT7; //REF IN 设置
initTIMERA0();
P1OUT &=~BIT2; //正转
setspeed(); //初始速度
P2DIR=0Xf0; //P20到P23输入 P24到P27输出
P2SEL=0X00; //p2为普通I/O管脚
P2IES=0X0f; //列线下降沿允许P2中断
P2IE=0X0f; //P20到P23允许中断
P2OUT=0X00;
P2IFG=0X00; //中断寄存器清零
}
void main()
{
WDTCTL=WDTHOLD+WDTPW;
init();
_EINT();
while(1)
{
LPM0;
switch(keypoint)
{
case 1:
{
P1OUT&=~BIT5; //整步
P1OUT&=~BIT6;
}
break;
case 2:
{
P1OUT|=BIT5;
P1OUT&=~BIT6; //1/2步
}
break;
case 3:
{
P1OUT&=~BIT5;
P1OUT|=BIT6; //1/4步
}
break;
case 4:
{
P1OUT|=BIT5;
P1OUT|=BIT6; //1/8步
} break;
case 5:
{
EnableON;
delay(200);
P1OUT|=BIT2; //变为正转
EnableOFF;
}
break;
case 6:
{
EnableON;
delay(200);
P1OUT&=~BIT2; //变为反转
EnableOFF;
}
break;
default:break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -