📄 programe.c
字号:
E=1; //以下两句产生下降沿
E=0; //
}
//*******************把显示数据写到内存单元中 *****************
void wdata(uc dat) //写显示数据
{
chkbusy(); //写等待
P2=0xff; //使能LCD
RW=0; //读禁止
RS=1; //输出 设置
P2=dat; //写数据代码
E=1; //以下两句产生下降沿
E=0; //
}
//***********************************************
//****************显示LCD程序********************
//*****************可以更改程序中的64变为32就可以输出数字了**********
//****************************************************************
//*************还可以换成生成图片的形式,具体****************
///****************************************************
void disrow(uc page,uc col,uc *temp)
{
uc i;
if(col<64) // 左半平面
{
L=1;R=0;
wcode(LCDPAGE+page); // 写指令 页
wcode(LCDLINE+col); //写指令行
if((col+16)<64) //如果字在左半平面显示不了,转到右半平面去
{
for(i=0;i<16;i++) //写字
wdata(*(temp+i));
}
else //右半平面
{
for(i=0;i<64-col;i++) //减去左边数,从右半平面第一位开始显示
wdata(*(temp+i)); //写字 显示
L=0;R=1; //右半平面
wcode(LCDPAGE+page); // 写指令 页
wcode(LCDLINE); //写指令行
for(i=64-col;i<16;i++) //写字 右半平面
wdata(*(temp+i));
}
}
else
{
L=0;R=1;
wcode(LCDPAGE+page); // 写指令 页
wcode(LCDLINE+col-64); //写指令行
for(i=0;i<16;i++) //写字
wdata(*(temp+i));
}
}
//*********************供调用 ****子程序 *************
//****************************************
void display( uc page,uc col,uc *temp)
{
disrow( page, col, temp); //显示上半字
disrow( page+1, col, temp+16); //显示下半字
}
//***********************主***控****程********序********************
//******************************************************************
//***************程序完成于2008年6月 1日,儿童节********************
//***************程序员:韩福伟************************************
//**********江西理工大学应用科学学院机电学部自动化******************
//******************************************************************
//*********
void main(void)
{
P2=0xff;
iniLCD(); //初始化 LCD
display(0,0x00,&JIANG); // 江
display(0,0x10,&XI); // 西
display(0,0x20,&LI); // 理
display(0,0x30,&GONG); // 工
display(0,0x40,&DA); // 大
display(0,0x50,&XUE); // 学
step2=0;
step1=0;
P1=0xff;
P0=0;
EX1=1;
EA=1; //开中断
speed=2010;
while(1)
{
if((scan_key1==1)&(scan_key2==0)) // 正转
{
display(6,0x00,&ZHENG); // LCD显示
display(6,0x10,&ZHUAN);
ground(step_index);
delay(speed);
step_index++; //大于7,从头再来
if(step_index>7)
step_index=0;
}
if((scan_key1==0)&(scan_key2==1)) //反转
{
ground(step_index);
display(6,0x00,&FAN); // LCD显示
display(6,0x10,&ZHUAN);
delay(speed);
step_index--;
if(step_index<0) //小于0,从头再来。
step_index=7;
}
if(scan_key1==0&scan_key2==0)
{
display(6,0x00,&TING); // 停止
display(6,0x10,&ZHI);
display(6,0x20,&BAI);
display(6,0x30,&BAI);
P0=0xff;
}
if(step1==1&step2==0)
{
speed=speed-100;
if(speed<200|speed==200) //小于话,说明电机的速度不能再提高了。
{ speed=200; //speed参数自己设定,以下遇到也是一样的。我只是一个乱写的值
display(6,0x20,&ZHENG); //正常运行
display(6,0x30,&CHANG);
display(6,0x40,&YUN);
display(6,0x50,&XING);
}
else //加速
{
display(6,0x20,&JIA);
display(6,0x30,&SU);
}
}
if(step1==0&step2==1)
{
speed=speed+100; //这里面的参数,论实际情况更改
if(speed>2500|speed==2500) //如果 小于了,就说明到饿低速,可以用停止按键停止。
{ speed=2500; //低速运行
display(6,0x20,&DI);
display(6,0x30,&SU);
display(6,0x40,&YUN);
display(6,0x50,&XING);
}
else
{
display(6,0x20,&JIAN); //减速
display(6,0x30,&SU);
}
}
}
}
//***************************************************
//************************* 延时子程序**************
//**************************************************
void delay(ui time) ///延时程序
{ for (count1=0;count1<time;count1++ ) //此处可以用中断进行准确定时。我只是瞎定了几个参数
for(count2=0;count2<3;count2++);
}
//*********************************************************
//******************按键处理程序****************************
//************************************************************
void key(void) interrupt 2
{
uc i;
for(i=0;i<200;i++); //延时防抖
if(P3_3==0)
{
butter=~P1;
switch(butter)
{case 0x01: scan_key1=1;scan_key2=0; break; //正常运行 ,用两个数字进行选择,是不错的办法
case 0x02: scan_key1=0;scan_key2=0;break; //停止
case 0x04: scan_key1=0 ;scan_key2=1; break; //加速
case 0x08: step1=1;step2=0;break; //减速
case 0x10: step1=0;step2=1;break; //正转
default : ; //其它值返回
}
}
P1=0XFF;
}
//**************************************************
//**********************转步************************
//**************************************************
void ground(step_index) //转步
{
switch(step_index)
{
case 0://0 // 这里就说明了同步电机是怎么转的。我本来是用了代码的,
P0_0 = 1; //但是后来考虑了一些初学者不懂同步电机到底怎么转的
P0_1 = 0; //我就换成这个了, 知道怎么转的人,就换成代码把,一样的
P0_2 = 0;
P0_3 = 0;
break;
case 1://0,1
P0_0 = 1;
P0_1 = 1;
P0_2 = 0;
P0_3 = 0;
break;
case 2://1
P0_0 = 0;
P0_1 = 1;
P0_2 = 0;
P0_3 = 0;
break;
case 3://1,2
P0_0 = 0;
P0_1 = 1;
P0_2 = 1;
P0_3 = 0;
break;
case 4://2
P0_0 = 0;
P0_1 = 0;
P0_2 = 1;
P0_3 = 0;
break;
case 5://2,3
P0_0 = 0;
P0_1 = 0;
P0_2 = 1;
P0_3 = 1;
break;
case 6://3
P0_0 = 0;
P0_1 = 0;
P0_2 = 0;
P0_3 = 1;
break;
case 7://3,0
P0_0 = 0;
P0_1 = 0;
P0_2 = 0;
P0_3 = 1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -