/*AT89S52测试脉冲输出 2012 5 8PCB四入四出板
 L270 CODE 771 PAST 测试步进电机伺服电机旋转位置**/
 /*****---------------********/
 /*****|手动:     XXX |******/
 /*****|               |******/  
 /***** ---------------*******/
                #include <REG51.H>
                #include <intrins.H>
                #define  uint unsigned int  
                #define  uchar unsigned char
                uint     aa=0;
                #define  Lcd_Bus P2     /*MCU P2<---> LCM */
                sbit     RS=P3^5;        //RS     PIN4
                sbit     RW=P3^6;        //RW  PIN5
                sbit     E=P3^7;        //E     PIN6
                sbit        KEYA=P1^3;       /*加按键*/
                sbit        KEYB=P1^2;       /*减按键*/
                sbit        KEY1=P1^0;       /*功能按键*/
                sbit        KEY2=P1^1;       /*功能按键*/
                sbit     MDIRECT=P3^1;  //Direction
                sbit     MTORCP=P3^0;   //
                bdata    char com_data;           /********/
                uchar    flag;
                uint     h,l,m,n,k,s,g,x;           /****个十百代码缓冲**/
                uint     i,j;                     /**半自动按键输入计数器**/
                uint     t1,t2,t3;                /****总数个十百千****/
                void     delay_iic(int v);        /****eeprom读写延时**/
                void     write_com(unsigned char cmdcode);
                void     write_data(unsigned char Dispdata);
                void     delay(uint k);           /****延时****/
 /*------------------延时1mS子程序------------------------*/
               void Delay1ms()        //@11.0592MHz
               {
                unsigned char i, j;
                _nop_();
                _nop_();
                _nop_();
                i = 11;
                j = 190;
                 do
                   {
                 while (--j);
                 }
                 while (--i);
                }
 /*------------------延时子程序------------------------*/
                void delay(uint t)
                {
                uint i,j;
                for(i=0;i<t;i++)
                for(j=0;j<121;j++);
                }
 /*------------------检查忙位--------------------------*/
         void chk_busy()
               {
                RS=0;
                RW=1;
                E=1;
                Lcd_Bus=0xff;
                while((Lcd_Bus&0x80)==0x80);
                E=0;
                }
 /*------------------写命令到LCD-----------------------*/
           void write_com(unsigned char cmdcode)
                {
                 chk_busy();
                 RS=0;
                 RW=0;
                 E=1;
                 Lcd_Bus=cmdcode;
                 delay(5);                                        /*在数据写入的时候加入适当的延时*/
                 E=0;
                 delay(5);
                }
 /*-------------------写数据到LCD----------------------*/
           void write_data(unsigned char Dispdata)
                {
                 chk_busy();
                 RS=1;
                 RW=0;
                 E=1;
                 Lcd_Bus=Dispdata;
                 delay(5);                                        /*在数据写入的时候加入适当的延时 */
                 E=0;
                 delay(5);
                }
 /*------------------初始化LCD屏-----------------------*/
            void lcdreset()
                {
                 delay(300);
                 RW=0;
                 delay(10);                                       /*选择基本指令集 */
                 write_com(0x30);                                 /*选择8bit数据流 */
                 delay(5);
                 write_com(0x0F);                                 /*开显示(无游标、不反白) */
                 delay(10);
                 write_com(0x01);                                 /*清除显示,并且设定地址指针为00H */
                 delay(50);
                // write_com(0x18);                                 /*游标或显示移位控制 */
                 delay(50);
                 write_com(0x04);                                 /*游标的移动方向及指定显示的移位*/
                 delay(0);
                }
 /**************顶出**************************/
                void xsdc()
                {
                 write_com(0x84);    /*---顶---*/
                 write_data(0xB6);
                 write_data(0xA5);                               
                 write_com(0x85);    /*---出---*/
                 write_data(0xB3);
                 write_data(0xF6);   
                }
 /**************顶退**************************/
                void xsdt()
                {
                 write_com(0x84);    /*---顶---*/
                 write_data(0xB6);
                 write_data(0xA5);                               
                 write_com(0x85);    /*---退---*/
                 write_data(0xCD);
                 write_data(0xCB);   
                }
 /***************显示  手动 ***************/
                void xs0()
                {
                 write_com(0x80);    /*---手---*/
                 write_data(0xCA);
                 write_data(0xD6);                               
                 write_com(0x81);    /*---动---*/
                 write_data(0xB6);
                 write_data(0xAF);  
                 write_com(0x82);    /*---CLEAR---*/
                 write_data(0xB6);
                 write_data(0xA0);
                 }
 /*----------电机前进------------*/
                void   MotorForward( uint m)            /*写数据B子函数*/
                {
                 uint i;
                 EA=0;                              //关总中断
                 for(i=0;i<m;i++)                //800个脉冲转动一圈。
                 {
                  MTORCP=0;                      /*子函数开始*/
                    Delay1ms();                    //延时1毫秒
                  MTORCP=1;
                   Delay1ms();
                 }
                EA=1;                          //开总中断
                }      
 /*----------电机后退------------*/
                void   MotorBack(uint m)          /*写数据B子函数*/
                {                            /*子函数开始*/
                 uint i;
                    EA=0;                          //关总中断
                 for(i=0;i<m;i++)            //800个脉冲转动一圈。
                 {
                  MTORCP=0;                  /*子函数开始*/
                  Delay1ms();
                    MTORCP=1;
                   Delay1ms();
                 }
                 EA=1;                            //开总中断
                }
 /*----------------清除 动作 显示 -----------*/
                void  xs9()
                {   
                 write_com(0x84);            /*---CLEAR---*/
                 write_data(0xB6);
                 write_data(0xA0);                                 
                 write_com(0x85);            /*---CLEAR---*/
                 write_data(0xB6);
                 write_data(0xA0);                 
                }
 /*------------------主循环程序----------------*/      
                 void   main( )              /*主程序开始*/
                 {  
                 P0=255;
                 P1=255;
                 P2=255;
                 P3=255;
                 lcdreset();                 /*液晶复位*/
                 xs0();                         /*显示手动 设定波值*/
                 delay(3000);
                  while(1)                    //主程序循环
                  {
                  delay(200);
                  k=0;
                  i=0;
                  j=0;
                  delay(200);
                  delay(200);
                   if(!KEY1)                    //检测自动键  aa=926;
                   {                         //按下自动键进入条件判断语句
                    for(;k<=5;)              /*小于等于5循环*/
                    {
                     if(!KEY1)               /*检测自动按键为低电平?*/
                     {                       /*循环检测 */
                     k++;
                     delay(5);
                     }
                     else if(~!KEY1)         /*检测自动按键为高电平?*/
                     {
                     k=0;                    /*寄存器复位*/   
                     }    
                    }
                    xsdc();                    //显示顶出
                    MotorForward(800);             //电机前进
                    xs9();                    //清除 动作 显示
                    k=0;                        /*抗干扰计数器*/
                   }
                   if(!KEY2)                    //检测自动键  aa=926;
                   {                         //按下自动键进入条件判断语句
                    for(;k<=5;)              /*小于等于5循环*/
                    {
                     if(!KEY2)               /*检测自动按键为低电平?*/
                     {                       /*循环检测 */
                     k++;
                     delay(5);
                     }
                     else if(~!KEY2)         /*检测自动按键为高电平?*/
                     {
                     k=0;                    /*寄存器复位*/   
                     }    
                    }
                    xsdt();                    //显示顶出
                    MotorBack(800);             //电机前进
                    xs9();                    //清除 动作 显示
                    k=0;                        /*抗干扰计数器*/
                   }
                   if(!KEYA)                    //检测自动键  aa=926;
                   {                         //按下自动键进入条件判断语句
                    for(;k<=5;)              /*小于等于5循环*/
                    {
                     if(!KEYA)               /*检测自动按键为低电平?*/
                     {                       /*循环检测 */
                     k++;
                     delay(5);
                     }
                     else if(~!KEYA)         /*检测自动按键为高电平?*/
                     {
                     k=0;                    /*寄存器复位*/   
                     }    
                    }
                    xsdc();                    //显示顶出
                    MotorForward(400);         //电机前进
                    xs9();                    //清除 动作 显示
                    k=0;                        /*抗干扰计数器*/
                   }
                   if(!KEYB)                    //检测自动键  aa=926;
                   {                         //按下自动键进入条件判断语句
                    for(;k<=5;)              /*小于等于5循环*/
                    {
                     if(!KEYB)               /*检测自动按键为低电平?*/
                     {                       /*循环检测 */
                     k++;
                     delay(5);
                     }
                     else if(~!KEYB)         /*检测自动按键为高电平?*/
                     {
                     k=0;                    /*寄存器复位*/   
                     }    
                    }
                    xsdt();                    //显示顶出
                    MotorBack(400);             //电机前进
                    xs9();                    //清除 动作 显示
                    k=0;                        /*抗干扰计数器*/
                   }
                  }
                 }  //2015 10 17 16:58