📄 stepper.c
字号:
#include "Stepper.h"
uchar keyscan(void);
void getkey(void);
void display(void);
char code str0[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x89,0xc0,0xbf,0xc0,0xc0,0xc0};//0,1,2,3,4,5,6,7,8,9,启动,结束,反向,无,无,复位
char code str1[]={0x28,0x14,0x24,0x44,0x12,0x22,0x42,0x11,0x21,0x41,0x81,0x82, 0x84,0x18,0x48,0x88};
int code str2[]={ 0,40,80,120,160,200,240,280,320,360,100000,0,0,0,0,0} ; // 周期
static int p,flag_p;
unsigned int count,t;
char key;
/* 定时器0服务子程序 */
void time0() interrupt 1 using 1 // 用定时器0中断来产生CLK时钟
{
/* 定时10ms,产生20ms周期的时钟,也就是50Hz的时钟 */
TH0 = T/256;
TL0 = T%256;
if(count!=0)
{
CLK = ~CLK;
count--;
if(p!=10||key!=0)
{
if(count%40==0)
{
flag_p--;
P0=str0[flag_p];
LED1=0;
for(t=0;t<=10000;t++);
LED1=1;
}
}
}
else
{
P0=0x89;TR0=0;
}
}
/* 键消抖延时函数 */
void delay(void)
{
uchar i;
for (i=300;i>0;i--);
}
/* 键扫描函数 */
uchar keyscan(void)
{
uchar scancode,tmpcode;
P1 = 0xf0; // 发全0行扫描码
if ((P1&0xf0)!=0xf0) // 若有键按下
{
delay(); // 延时去抖动
if ((P1&0xf0)!=0xf0) // 延时后再判断一次,去除抖动影响
{
scancode = 0xfe;
while((scancode&0x10)!=0) // 逐行扫描
{
P1 = scancode; // 输出行扫描码
if ((P1&0xf0)!=0xf0) // 本行有键按下
{
tmpcode = (P1&0xf0)|0x0f;
/* 返回特征字节码,为1的位即对应于行和列 */
return((~scancode)+(~tmpcode));
}
else scancode = (scancode<<1)|0x01; // 行扫描码左移一位
}
}
}
return(0); // 无键按下,返回值为0
}
//取键值
void getkey(void)
{
key=keyscan();
for(p=0;p<=15;)
{
if (key==str1[p])
{
break;
}
else
{
p++;
}
}
}
//显示子程序
void display(void)
{
if(key==0)
{
P0=0xc0;
}
else
{
P0=str0[p];
}
}
/* 主程序 */
void main()
{
uchar key;
TMOD = 0x01; // 设置定时器0工作模式
EA = 1;
ET0 = 1;
/* 设置为2相激励 */
M1 = 0;
M2 = 0;
EN = 0; // 切断驱动输出
RET = 0; // 归位输入无效
CWB = 1; // 初始设置为顺时针方向
while(1)
{
key=keyscan(); // 调用键盘扫描函数
getkey();
switch(key)
{
case 0x81: // 0行3列,启动键
EN = 1; // 打开驱动输出
TH0 = -T/256; // 改变T可以改变步进电机转动速度
TL0 = -T%256;
TR0 = 1; // 定时器0开始计数
count=str2[p];
display();
break;
case 0x82: // 1行3列,停止键
TR0 = 0; // 定时器0停止计数
EN = 0; // 切断驱动输出
break;
case 0x84: // 2行3列,切换转向按键
CWB = ~CWB;
if(LED2==1)
LED2 = 0;
else
LED2=1;
break;
case 0x88: // 3行3列,归位键
RET = 1;
delay();
RET = 0;
break;
case 0x11: // 7
TR0 = 1; // 定时器0开始计数
count=str2[p];
display();
flag_p =p;
break;
case 0x21: // 8
TR0 = 1; // 定时器0开始计数
count=str2[p];
display();
flag_p =p;
break;
case 0x41: //9
TR0 = 1; // 定时器0开始计数
count=str2[p];
display();
flag_p =p;
break;
case 0x12: // 4
TR0 = 1; // 定时器0开始计数
count=str2[p];
display();
flag_p =p;
break;
case 0x22: //5
TR0 = 1;
count=str2[p];
flag_p =p;
display();
break;
case 0x42: //6
TR0 = 1; // 定时器0开始计数
count=str2[p];
flag_p =p;
display();
break;
case 0x14: //1
TR0 = 1; // 定时器0开始计数
count=str2[p];
flag_p =p;
display();
break;
case 0x24: //2
TR0 = 1; // 定时器0开始计数
count=str2[p];
flag_p =p;
display();
break;
case 0x44: //3
TR0 = 1; // 定时器0开始计数
count=str2[p];
flag_p =p;
display();
break;
default:
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -