📄 programe.lst
字号:
237 void wdata(uc dat) //写显示数据
238 {
239 1 chkbusy(); //写等待
240 1 P2=0xff; //使能LCD
241 1 RW=0; //读禁止
C51 COMPILER V8.08 PROGRAME 06/01/2008 22:40:39 PAGE 5
242 1 RS=1; //输出 设置
243 1 P2=dat; //写数据代码
244 1 E=1; //以下两句产生下降沿
245 1 E=0; //
246 1 }
247 //***********************************************
248 //****************显示LCD程序********************
249 //*****************可以更改程序中的64变为32就可以输出数字了**********
250 //****************************************************************
251 //*************还可以换成生成图片的形式,具体****************
252 ///****************************************************
253 void disrow(uc page,uc col,uc *temp)
254 {
255 1 uc i;
256 1 if(col<64) // 左半平面
257 1 {
258 2 L=1;R=0;
259 2 wcode(LCDPAGE+page); // 写指令 页
260 2 wcode(LCDLINE+col); //写指令行
261 2 if((col+16)<64) //如果字在左半平面显示不了,转到右半平面去
262 2 {
263 3 for(i=0;i<16;i++) //写字
264 3 wdata(*(temp+i));
265 3 }
266 2 else //右半平面
267 2 {
268 3 for(i=0;i<64-col;i++) //减去左边数,从右半平面第一位开始显示
269 3 wdata(*(temp+i)); //写字 显示
270 3 L=0;R=1; //右半平面
271 3 wcode(LCDPAGE+page); // 写指令 页
272 3 wcode(LCDLINE); //写指令行
273 3 for(i=64-col;i<16;i++) //写字 右半平面
274 3 wdata(*(temp+i));
275 3 }
276 2 }
277 1 else
278 1 {
279 2 L=0;R=1;
280 2 wcode(LCDPAGE+page); // 写指令 页
281 2 wcode(LCDLINE+col-64); //写指令行
282 2 for(i=0;i<16;i++) //写字
283 2 wdata(*(temp+i));
284 2 }
285 1 }
286 //*********************供调用 ****子程序 *************
287 //****************************************
288 void display( uc page,uc col,uc *temp)
289 {
290 1 disrow( page, col, temp); //显示上半字
291 1 disrow( page+1, col, temp+16); //显示下半字
292 1 }
293 //***********************主***控****程********序********************
294 //******************************************************************
295 //***************程序完成于2008年6月 1日,儿童节********************
296 //***************程序员:韩福伟************************************
297 //**********江西理工大学应用科学学院机电学部自动化******************
298 //******************************************************************
299 //*********
300 void main(void)
301 {
302 1 P2=0xff;
303 1 iniLCD(); //初始化 LCD
C51 COMPILER V8.08 PROGRAME 06/01/2008 22:40:39 PAGE 6
304 1 display(0,0x00,&JIANG); // 江
305 1 display(0,0x10,&XI); // 西
306 1 display(0,0x20,&LI); // 理
307 1 display(0,0x30,&GONG); // 工
308 1 display(0,0x40,&DA); // 大
309 1 display(0,0x50,&XUE); // 学
310 1 step2=0;
311 1 step1=0;
312 1 P1=0xff;
313 1 P0=0;
314 1 EX1=1;
315 1 EA=1; //开中断
316 1 speed=2010;
317 1 while(1)
318 1 {
319 2 if((scan_key1==1)&(scan_key2==0)) // 正转
320 2 {
321 3 display(6,0x00,&ZHENG); // LCD显示
322 3 display(6,0x10,&ZHUAN);
323 3 ground(step_index);
324 3 delay(speed);
325 3 step_index++; //大于7,从头再来
326 3 if(step_index>7)
327 3 step_index=0;
328 3 }
329 2 if((scan_key1==0)&(scan_key2==1)) //反转
330 2 {
331 3 ground(step_index);
332 3 display(6,0x00,&FAN); // LCD显示
333 3 display(6,0x10,&ZHUAN);
334 3 delay(speed);
335 3 step_index--;
336 3 if(step_index<0) //小于0,从头再来。
337 3 step_index=7;
338 3 }
339 2 if(scan_key1==0&scan_key2==0)
340 2 {
341 3 display(6,0x00,&TING); // 停止
342 3 display(6,0x10,&ZHI);
343 3 display(6,0x20,&BAI);
344 3 display(6,0x30,&BAI);
345 3 P0=0xff;
346 3 }
347 2 if(step1==1&step2==0)
348 2 {
349 3 speed=speed-100;
350 3 if(speed<200|speed==200) //小于话,说明电机的速度不能再提高了。
351 3 { speed=200; //speed参数自己设定,以下遇到也是一样的。我只是一个乱写的值
352 4 display(6,0x20,&ZHENG); //正常运行
353 4 display(6,0x30,&CHANG);
354 4 display(6,0x40,&YUN);
355 4 display(6,0x50,&XING);
356 4 }
357 3 else //加速
358 3 {
359 4 display(6,0x20,&JIA);
360 4 display(6,0x30,&SU);
361 4 }
362 3 }
363 2 if(step1==0&step2==1)
364 2 {
365 3 speed=speed+100; //这里面的参数,论实际情况更改
C51 COMPILER V8.08 PROGRAME 06/01/2008 22:40:39 PAGE 7
366 3 if(speed>2500|speed==2500) //如果 小于了,就说明到饿低速,可以用停止按键停止。
367 3 { speed=2500; //低速运行
368 4 display(6,0x20,&DI);
369 4 display(6,0x30,&SU);
370 4 display(6,0x40,&YUN);
371 4 display(6,0x50,&XING);
372 4 }
373 3 else
374 3 {
375 4 display(6,0x20,&JIAN); //减速
376 4 display(6,0x30,&SU);
377 4 }
378 3 }
379 2 }
380 1 }
381 //***************************************************
382 //************************* 延时子程序**************
383 //**************************************************
384 void delay(ui time) ///延时程序
385 { for (count1=0;count1<time;count1++ ) //此处可以用中断进行准确定时。我只是瞎定了几个参数
386 1 for(count2=0;count2<3;count2++);
387 1 }
388 //*********************************************************
389 //******************按键处理程序****************************
390 //************************************************************
391 void key(void) interrupt 2
392 {
393 1 uc i;
394 1 for(i=0;i<200;i++); //延时防抖
395 1 if(P3_3==0)
396 1 {
397 2 butter=~P1;
398 2 switch(butter)
399 2 {case 0x01: scan_key1=1;scan_key2=0; break; //正常运行 ,用两个数字进行选择,是不错的办法
400 3 case 0x02: scan_key1=0;scan_key2=0;break; //停止
401 3 case 0x04: scan_key1=0 ;scan_key2=1; break; //加速
402 3 case 0x08: step1=1;step2=0;break; //减速
403 3 case 0x10: step1=0;step2=1;break; //正转
404 3 default : ; //其它值返回
405 3 }
406 2 }
407 1 P1=0XFF;
408 1 }
409 //**************************************************
410 //**********************转步************************
411 //**************************************************
412 void ground(step_index) //转步
413 {
414 1 switch(step_index)
415 1 {
416 2 case 0://0 // 这里就说明了同步电机是怎么转的。我本来是用了代码的,
417 2 P0_0 = 1; //但是后来考虑了一些初学者不懂同步电机到底怎么转的
418 2 P0_1 = 0; //我就换成这个了, 知道怎么转的人,就换成代码把,一样的
419 2 P0_2 = 0;
420 2 P0_3 = 0;
421 2 break;
422 2 case 1://0,1
423 2 P0_0 = 1;
424 2 P0_1 = 1;
425 2 P0_2 = 0;
426 2 P0_3 = 0;
427 2 break;
C51 COMPILER V8.08 PROGRAME 06/01/2008 22:40:39 PAGE 8
428 2 case 2://1
429 2 P0_0 = 0;
430 2 P0_1 = 1;
431 2 P0_2 = 0;
432 2 P0_3 = 0;
433 2 break;
434 2 case 3://1,2
435 2 P0_0 = 0;
436 2 P0_1 = 1;
437 2 P0_2 = 1;
438 2 P0_3 = 0;
439 2 break;
440 2 case 4://2
441 2 P0_0 = 0;
442 2 P0_1 = 0;
443 2 P0_2 = 1;
444 2 P0_3 = 0;
445 2 break;
446 2 case 5://2,3
447 2 P0_0 = 0;
448 2 P0_1 = 0;
449 2 P0_2 = 1;
450 2 P0_3 = 1;
451 2 break;
452 2 case 6://3
453 2 P0_0 = 0;
454 2 P0_1 = 0;
455 2 P0_2 = 0;
456 2 P0_3 = 1;
457 2 break;
458 2 case 7://3,0
459 2 P0_0 = 0;
460 2 P0_1 = 0;
461 2 P0_2 = 0;
462 2 P0_3 = 1;
463 2 }
464 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1164 ----
CONSTANT SIZE = 640 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 78 8
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -