d.c
上传用户:ypj0310
上传日期:2014-11-30
资源大小:71k
文件大小:4k
开发平台:

C/C++

  1. #include"reg51.h"
  2. #include"intrins.h"
  3. #include"math.h"
  4. #include"absacc.h"
  5. #define  PORTA  XBYTE[0x8500]
  6. #define  PORTB  XBYTE[0x8502]
  7. #define  PORTC  XBYTE[0x8504]
  8. #define  PORTC0 XBYTE[0x8506]
  9. #define nop _nop_()
  10. #define Right_RUN  1
  11. #define Left_RUN  0
  12. unsigned long RunSpeed=76;
  13. unsigned  char  RUNState=1;
  14. sbit  RS=P2^0;
  15. sbit  RW=P2^1;
  16. sbit  E=P2^2;
  17. sbit P17=P1^7;
  18. bit   flag=0;
  19. unsigned char xx[]="speed(n/min):";
  20. unsigned char SD[]="76";
  21. char  state[2][14]={"direction:cw","direction:ccw"};
  22. unsigned char  FLG,INMA=0;
  23. unsigned  char  t,s=0x01;
  24. unsigned  int   a;
  25. main()
  26. {
  27.   void  OPJIAN();
  28.   unsigned char JIAN();
  29.   unsigned char JIANZHI();
  30.    void  speed();
  31.  void  SHOW_LCD();
  32.  void  show_state();
  33.  void  write1();
  34.  void  writ2(unsigned char i);
  35.  void  delay();
  36.  void time();
  37.  void  busy();
  38.  unsigned  char  i;
  39.   i=0x90;
  40.   PORTC0=i;
  41.   i=0x01;
  42.   TMOD=i;
  43.   t=0x10;
  44.   a=0x0f;
  45.   TH0=0x10;
  46.   TL0=0x0f;
  47.   FLG=INMA;  
  48.   SHOW_LCD();
  49.   show_state();
  50.   EA=1;
  51.   ET0=1;
  52.   TR0=1;
  53. while(1)
  54. {
  55.  i=JIAN();
  56.      if(i!=0)
  57. {
  58.   time();
  59.   time();
  60.  }
  61. i=JIAN();
  62. if(i!=0)
  63. {
  64. INMA=JIANZHI();
  65.    OPJIAN();
  66.  time();
  67. }
  68.   if(FLG!=INMA||flag==1)
  69.    {  FLG=INMA;
  70. SHOW_LCD();
  71.       show_state();
  72. flag=0;
  73. }
  74.   }
  75.   }
  76.  void SHOW_LCD()/*lcd设置程序*/
  77.  {
  78.   P1=0x38;
  79.   write1();
  80.   delay();
  81.   P1=0x38;
  82.   write1();
  83.   delay(); 
  84.   P1=0x38;
  85.   write1();
  86.   delay();
  87.   P1=0x01;
  88.   write1();
  89.  delay();
  90.   P1=0x0f;
  91.   write1();
  92.  delay();
  93.   P1=0x06;
  94.   write1();
  95.   delay();
  96.   P1=0x0c;
  97.   write1();
  98.   
  99.  }
  100. void  show_state()/*状态显示程序*/
  101.   {
  102.    unsigned char i=0;
  103.    P1=0x80;
  104. write1();
  105.  while(xx[i]!='')
  106.   {
  107.     writ2(xx[i]);
  108.  i++;
  109.  delay();
  110.  }
  111.    i=0;
  112.   while(SD[i]!='')
  113.     {
  114.   writ2(SD[i]);
  115.   delay();
  116.   i++;
  117.  
  118.   }
  119.   P1=0xc0;
  120.   write1();
  121.   i=0;
  122.   if(RUNState==Right_RUN)
  123.  while(state[0][i]!='')
  124.    {
  125.   writ2(state[0][i]);
  126.   i++;
  127.  }
  128. else
  129.   if(RUNState==Left_RUN)
  130.   while(state[1][i]!='')
  131.    {
  132.   writ2(state[1][i]);
  133.    i++;
  134.  }
  135.    }
  136. void  write1()/*lcd写控制字*/
  137.  {
  138.    RS=0;
  139. RW=0;
  140. E=0;
  141. busy();
  142. E=1;
  143.   }
  144. void  writ2( unsigned char i)/*lcd写数据*/
  145.  { P1=i;
  146.    RS=1;
  147. RW=0;
  148. E=0;
  149.    busy();
  150. E=1;
  151. }
  152.  
  153.  void delay()/*延时程序*/
  154. {
  155.   unsigned char  i;
  156.   for(i=0;i<100;i++)
  157.     {
  158.     i=i;
  159.  }
  160.  
  161. }
  162. void time()
  163. { unsigned char i,j;
  164. for(i=0;i<100;i++)
  165.  { 
  166. for(j=0;j<30;j++)
  167.  {
  168.    j=j;
  169.   }
  170.   }
  171. }
  172. void busy()         //判断LCD是否忙
  173. {    
  174.  do
  175.  {
  176.  P1=0xff;
  177.   RS=0;
  178.      RW=1;
  179.      E=0;
  180.   nop;
  181.   E=1;
  182.   }while(P17==1);
  183.   
  184.  }
  185.  unsigned char JIAN()/*判断是否有键按下*/
  186.  {
  187.   unsigned char  i,j;
  188.      i=0xff;
  189.      PORTA=i;
  190.      time();
  191.      i=0x00;
  192.      PORTB=i;
  193.      j=PORTA;
  194.      j=~j;
  195.      j=j&(0x0f);
  196.      return  j;
  197.  }
  198. unsigned char JIANZHI()/*读键值程序*/
  199.  {
  200.    unsigned i,j,d,k,m=1;
  201.  i=0xfe;
  202.  k=0x01;
  203.  do
  204.  {
  205.  PORTB=i;
  206.  j=PORTA;
  207.  m=j&(0x01);
  208.     if(m==0)
  209.    d=k/2;
  210.  else
  211.      {
  212.  m=j&(0x02);
  213.      if(m==0)
  214.    d=k/2+4;
  215.   else
  216.     {
  217.   m=j&(0x04);
  218.    if(m==0)
  219.   d=k/2+8;
  220.    else
  221.  {
  222.   m=j&(0x08);
  223.                   if(m==0)
  224. d=k/2+12;
  225.  }
  226.         }
  227.        }
  228. k=k+2;
  229. i=i<<1;
  230. i=i|(0x01);
  231. }while(m!=0);
  232. return  d;
  233. }
  234. void OPJIAN() /* 键值处理程序*/
  235. {
  236.    switch(INMA)
  237.  {
  238.    case 0x08:  {RUNState=Right_RUN;s=0xf7;}break;
  239.    case 0x09:  {RUNState=Left_RUN;s=0x01;}break;
  240.    case 0x0b:  {
  241.            flag=1;
  242.   t=t-2;
  243.   RunSpeed=5000000/(65536-t*256-a);
  244.   speed();}break;
  245.    case 0x0f:  {flag=1;
  246.                 t=t+2;
  247.                 RunSpeed=5000000/(65536-t*256-a);
  248.                 speed();} 
  249.  }
  250. }
  251. void speed()/*速度处理程序*/
  252.  {
  253.   unsigned  char  i=0;
  254.   SD[0]=RunSpeed/100+48;
  255.   SD[1]=RunSpeed%100/10+48;
  256.   SD[2]=RunSpeed%10+48;
  257.   }
  258.   void time1(void) interrupt 1 using 2
  259.   {
  260.    TR0=0;
  261.    PORTC=s;
  262. if(RUNState==0)
  263. {
  264. s=(s<<1);
  265. if(s==0x10)
  266.   s=0x01;
  267. }
  268.    else
  269. {
  270. s=s>>1;
  271. if(s==0x0f)
  272. s=0xf7;
  273.  }
  274.    TH0=t;
  275.   TL0=a;
  276.   TR0=1;
  277.   }
  278.    
  279.