//***************************************************************
//*     伺服馬達控制器(8ch) 版 (Smart Arm 專用)                 *
//*                                                             *
//*                                                             *
//*     SERVO MOTEOR每一階 20uS                                 *
//*                                                             *
//*                                                             *
//*                                                             *
//*     filename: SERVO8CH_ARM_1A_BK.C                          *
//*                                                             *
//***************************************************************

// #include <string.h>   /* for 'strcpypgm2ram'     */
// #include <stdlib.h>   /* for 'atoi'              */
#include <p18f452.h>  /* for 'PORTB' and 'TRISB' */
#include <pwm.h>      /* for                     */
#include <adc.h>      /* for                     */
#include <stdlib.h>   /* for                     */
#include <delays.h>   /* for 'Delay10KTCYx'      */
#include <ctype.h>    /* for '                   */
//#include <xlcd.h>     /* for '                   */

//----------------------------------------------------------------------------
//      自訂 I/O 取代字串
//----------------------------------------------------------------------------
#define RW_PIN          PORTBbits.RB2   /* PORT for RW */
#define TRIS_RW         DDRBbits.RB2    /* TRIS for RW */
#define RS_PIN          PORTBbits.RB3   /* PORT for RS */
#define TRIS_RS         DDRBbits.RB3    /* TRIS for RS */
#define E_PIN           PORTBbits.RB1   /* PORT for E  */
#define TRIS_E          DDRBbits.RB1    /* TRIS for E  */
//
#define SERVOMOTOR1_PIN    PORTEbits.RE0
#define SERVOMOTOR2_PIN    PORTEbits.RE1
#define SERVOMOTOR3_PIN    PORTEbits.RE2
#define SERVOMOTOR4_PIN    PORTCbits.RC0
#define SERVOMOTOR5_PIN    PORTCbits.RC1
#define SERVOMOTOR6_PIN    PORTCbits.RC5
#define SERVOMOTOR7_PIN    PORTAbits.RA2
#define SERVOMOTOR8_PIN    PORTAbits.RA5
//
#define KEYDA_PIN          PORTBbits.RB4
#define LED_PIN            PORTBbits.RB5

//----------------------------------------------------------------------------
//      燒錄位元設定
//----------------------------------------------------------------------------
#pragma config OSC = HSPLL, OSCS = OFF
#pragma config PWRT = OFF
#pragma config BOR = OFF
#pragma config WDT = OFF
#pragma config CCP2MUX = OFF
#pragma config LVP = OFF

//----------------------------------------------------------------------------
//      自訂函數原型宣告
//----------------------------------------------------------------------------

//void main (void);
void InterruptHandlerHigh (void);
void lcdinit (void);
void lcddisp (void);
void lcddisps1(unsigned int y);
void beep3(unsigned int soundlong,unsigned int tone);
void lcdcursoron(void);
void lcdcursoroff(void);
void checklcdbusy(void);
void car_f(void);
void car_stop(void);
void TDelay(unsigned int delaytime);
void LimitSwDetect(void);
void servo_test(void);

void DispStop(void);
void DispRun(void);
void DispEdit(void);
void DispSee(void);
void DispPage1(void);
void DispPage2(void);
void DispPage3(void);

void BCD888(unsigned int hexdata1);
void BCD88(unsigned int hexdata1);
void Display88(void);
void Display888(void);

void TransComm(unsigned char LcmData);
void TransData(unsigned char LcmData);
void TransData1(unsigned char LcmData);

void ReadDataEEPROM(char eepromaddr);
void WriteDataEEPROM(char eepromaddr,char eepromdata);
void GetDataEEPROMDisp(void);
void SaveDataEEPROM(void);
void SaveDataEEPROMInit(void);

void SetStepTimer(void);
void SetWaitTimer(void);
void SetCH1Angle(void);
void SetCH2Angle(void);
void SetCH3Angle(void);
void SetCH4Angle(void);
void SetCH5Angle(void);
void SetCH6Angle(void);
void SetCH7Angle(void);
void SetCH8Angle(void);
void PageDisplay(void);
unsigned char Trans_AngleToValue(unsigned char Angle);
void ServoMotorRun(void);
void ServoMotorReset(void);
void ServoMotorStop(void);
unsigned char CompStepValue(void);
void ProgramWaitTime(void);
void GetKey1DataROM(void);
void GetKey2DataROM(void);
void GetKey3DataROM(void);
void DispDemo1(void);
void DispDemo2(void);
void DispDemo3(void);
void DispSetup(void);

void SetRunCount(void);
void GetSetupDisp(void);
void ServoMotorResetSlow(void);
void SetAD0overflow(void);

union
{
  struct
  {
    unsigned Timeout:1;         //flag to indicate a TMR0 timeout
    unsigned None:7;
  } Bit;
  unsigned char Byte;
} Flags;

union
{
  struct
  {
    unsigned bit0:1;
    unsigned bit1:1;
    unsigned bit2:1;
    unsigned bit3:1;
    unsigned bit4:1;
    unsigned bit5:1;
    unsigned bit6:1;
    unsigned bit7:1;
  } ;
} AFlags=0;

union
{
  struct
  {
    unsigned bit0:1;
    unsigned bit1:1;
    unsigned bit2:1;
    unsigned bit3:1;
    unsigned bit4:1;
    unsigned bit5:1;
    unsigned bit6:1;
    unsigned bit7:1;
  } ;
} BFlags=0;

union
{
  struct
  {
    unsigned bit0:1;
    unsigned bit1:1;
    unsigned bit2:1;
    unsigned bit3:1;
    unsigned bit4:1;
    unsigned bit5:1;
    unsigned bit6:1;
    unsigned bit7:1;
  } ;
} CFlags=0;


#define key_flag       AFlags.bit0    /*             */
#define run_flag       AFlags.bit1    /*             */
#define time10ms_flag  AFlags.bit5    /*             */
#define time100ms_flag AFlags.bit6    /*             */
#define time1s_flag    AFlags.bit7    /*             */

#define ch1width_flag  BFlags.bit0    /*             */
#define ch2width_flag  BFlags.bit1    /*             */
#define ch3width_flag  BFlags.bit2    /*             */
#define ch4width_flag  BFlags.bit3    /*             */
#define ch5width_flag  BFlags.bit4    /*             */
#define ch6width_flag  BFlags.bit5    /*             */
#define ch7width_flag  BFlags.bit6    /*             */
#define ch8width_flag  BFlags.bit7    /*             */

#define ch1motor_flag  CFlags.bit0    /*             */
#define ch2motor_flag  CFlags.bit1    /*             */
#define ch3motor_flag  CFlags.bit2    /*             */
#define ch4motor_flag  CFlags.bit3    /*             */
#define ch5motor_flag  CFlags.bit4    /*             */
#define ch6motor_flag  CFlags.bit5    /*             */
#define ch7motor_flag  CFlags.bit6    /*             */
#define ch8motor_flag  CFlags.bit7    /*             */

//extern unsigned int text1;
//extern const rom char ch[];
  unsigned char BcdValue0=0,BcdValue1=0,BcdValue2=0;
  unsigned int  AD0result0,AD0result1,AD0result2,AD0result=0,AD0resultBk=0;
  unsigned int  PulseFrequency=0;
  unsigned char Ch1_PulseWidth=0,Ch2_PulseWidth=0,Ch3_PulseWidth=0,Ch4_PulseWidth=0;
  unsigned char Ch5_PulseWidth=0,Ch6_PulseWidth=0,Ch7_PulseWidth=0,Ch8_PulseWidth=0;
  unsigned int  T0ck1=0,T0ck2=0;
  unsigned char Ch1FRSpeedValue=0,Ch2FRSpeedValue=0,Ch3FRSpeedValue=0,Ch4FRSpeedValue=0;
  unsigned char Ch5FRSpeedValue=0,Ch6FRSpeedValue=0,Ch7FRSpeedValue=0,Ch8FRSpeedValue=0;
  unsigned char DetectNumber=0,Station=1,RfKeyData,ADispData,BDispData;
  unsigned char KeyDataValue,SetupMode=0,ModeValue=3;
  unsigned char StopTimeS1=0,StopTimeS2=0,StopTimeS3=0,StopTimeS4=0,StopTimeS5=0,StopTimeS6=0;
  unsigned char StopTime=5,TestValue;
  unsigned char keydata1,keydata2;
  unsigned char setstepvalue0,setstepvalue1,stepvalue0,stepvalue1,steptotalvalue=0;
  unsigned char setwaitvalue0,setwaitvalue1,waitvalue0,waitvalue1,waittotalvalue=0;
  unsigned char setch1value0,setch1value1,setch1value2,ch1value0,ch1value1,ch1value2,ch1totalvalue=0;
  unsigned char setch2value0,setch2value1,setch2value2,ch2value0,ch2value1,ch2value2,ch2totalvalue=0;
  unsigned char setch3value0,setch3value1,setch3value2,ch3value0,ch3value1,ch3value2,ch3totalvalue=0;
  unsigned char setch4value0,setch4value1,setch4value2,ch4value0,ch4value1,ch4value2,ch4totalvalue=0;
  unsigned char setch5value0,setch5value1,setch5value2,ch5value0,ch5value1,ch5value2,ch5totalvalue=0;
  unsigned char setch6value0,setch6value1,setch6value2,ch6value0,ch6value1,ch6value2,ch6totalvalue=0;
  unsigned char setch7value0,setch7value1,setch7value2,ch7value0,ch7value1,ch7value2,ch7totalvalue=0;
  unsigned char setch8value0,setch8value1,setch8value2,ch8value0,ch8value1,ch8value2,ch8totalvalue=0;
  unsigned char PageNumber=0;
  unsigned char ch1totalvalueBk=0,ch2totalvalueBk=0,ch3totalvalueBk=0,ch4totalvalueBk=0;
  unsigned char ch5totalvalueBk=0,ch6totalvalueBk=0,ch7totalvalueBk=0,ch8totalvalueBk=0;
  unsigned char steptotalvalueBk=0,waittotalvalueBk=0,GetBigValue;
  unsigned char RunFlag=0,AD0sampo;
  unsigned char RunCountvalue0,RunCountvalue1,RunCountvalue2,RunCountvalue=0,RunCountvalueBk=0;

  const rom char  keytable[]={0x01,0x04,0x07,0x0A,0x02,0x05,0x08,0x00,
                              0x03,0x06,0x09,0x0B,0x0C,0x0D,0x0E,0x0F};


      const rom char InitProcess[]={  2,  0,  5,  0,115,115, 40, 40, 95,0,   //P0   速度  停留時間  ch1   ch2   ch3   ch4   ch5   ch6   ch7   ch8
                                      2,  0, 65,  0,115,115, 40, 40, 95,0,   //P1   1~99  0.1~9.9s  夾手  底轉  下肢   x    中肢  上肢  轉手   x
                                      2,  0, 65,  0, 60, 60, 40, 90, 95,0,   //P2
                                      2, 10, 65, 60, 60, 60, 40, 90, 95,0,   //P3
                                      2, 10, 65, 60,115,115, 40, 40, 95,0,   //P4
                                      3,  0, 65, 60,115,115, 40, 40, 95,0,   //P5
                                      3,  0,  5, 60,115,115, 40, 40, 95,0,   //P6
                                      3,  0,  5, 60, 60, 60, 40, 90, 95,0,   //P7
                                      2,  0,  5,  0, 60, 60, 40, 90, 95,0,   //P8
                                    255,  0,  0,  0,  0,  0,  0,  0,  0,0};         //P9  end

  const rom char InitKey1Process[]={  2,  0,  5,  0,115,115, 40, 40, 95,0,   //P0   內定按鍵1程序  ch1   ch2   ch3   ch4   ch5   ch6   ch7   ch8
                                      2,  0, 65,  0,115,115, 40, 40, 95,0,   //P1                  夾手  底轉  下肢   x    中肢  上肢  轉手   x
                                      2,  0, 65,  0, 60, 60, 40, 90, 95,0,   //P2
                                      2, 10, 65, 60, 60, 60, 40, 90, 95,0,   //P3
                                      2, 10, 65, 60,115,115, 40, 40, 95,0,   //P4
                                      3,  0, 65, 60,115,115, 40, 40, 95,0,   //P5
                                      3,  0,  5, 60,115,115, 40, 40, 95,0,   //P6
                                      3,  0,  5, 60, 60, 60, 40, 90, 95,0,   //P7
                                      2,  0,  5,  0, 60, 60, 40, 90, 95,0,   //P8
                                    255,  0,  0,  0,  0,  0,  0,  0,  0,0};         //P9  end

  const rom char InitKey2Process[]={  2,  0,  5,  0, 80, 80, 90,180, 95,0,    //P0   內定按鍵2程序
                                      2,  0,  5,  0, 80, 80, 50,170, 95,0,    //P1
                                      2, 10, 65,  0, 80, 80, 50,170, 95,0,    //P2
                                      2, 10, 65,  0, 80, 80, 90,180, 95,0,    //P3
                                      3,  0, 65, 90, 80, 80, 90,180, 95,0,    //P4
                                      3, 10, 65, 90, 80, 80, 50,170, 95,0,    //P5
                                      3, 10, 65, 90, 80, 80, 50,170,  0,0,    //P6
                                      2, 10,  5, 90, 80, 80, 50,170,  0,0,    //P7
                                      2,  0,  5, 90, 80, 80, 90,180,  0,0,    //P8
                                    255,  0,  0,  0,  0,  0,  0,  0,  0,0};         //P9  end

  const rom char InitKey3Process[]={  2,  0,  5,  0,115,115, 40, 40, 95,0,   //P0   內定按鍵3程序  ch1   ch2   ch3   ch4   ch5   ch6   ch7   ch8
                                      2,  0, 65,  0,115,115, 40, 40, 95,0,   //P1                  夾手  底轉  下肢   x    中肢  上肢  轉手   x
                                      2,  0, 65,  0, 60, 60, 40, 15, 95,0,   //P2
                                      2,  0, 65,  0, 60, 60, 40, 15,  0,0,   //P3
                                      2,  0, 65,  0, 60, 60, 15,  5,  0,0,   //P4
                                      2,  0, 65,  0, 60, 60, 55, 15,  0,0,   //P5
                                      2,  0, 65,  0, 60, 60, 15,  5,  0,0,   //P6
                                      2,  0, 65,  0, 60, 60, 55, 15,  0,0,   //P7
                                      2,  0, 65,  0, 60, 60, 15,  5,  0,0,   //P8
                                      2,  0, 65,  0, 60, 60, 55, 15,  0,0,   //P9
                                      2, 10, 65, 60, 60, 60, 40, 40, 95,0,   //P10
                                      2, 10, 65, 60,115,115, 40, 40, 95,0,   //P11
                                      3,  0, 65, 60,115,115, 40, 40, 95,0,   //P12
                                      3,  0,  5, 60,115,115, 40, 40, 95,0,   //P13
                                      3,  0,  5, 60, 60, 60, 40, 90, 95,0,   //P14
                                      2,  0,  5,  0, 60, 60, 40, 90, 95,0,   //P15
                                    255,  0,  0,  0,  0,  0,  0,  0,  0,0};  //P16 end


//----------------------------------------------------------------------------
//      主程式
//----------------------------------------------------------------------------
void main ()
{
  unsigned int  i=0,j=0;
  unsigned char x=0,y=0;
  unsigned char ii=0,jj=0,kk=0,SensorDtat;

  Delay10KTCYx (1);
  Flags.Byte = 0;
  run_flag=0;                   //AFlags.bit1  flag clear
  INTCON = 0b00100000;          //disable global and enable TMR0,INT0 interrupt
  INTCON2 = 0b10000100;         //TMR0 high priority , int0 falling
  RCONbits.IPEN = 1;            //enable priority levels
//TMR0H = 0xB1;                 //clear timer   65536-20000=45536
//TMR0L = 0xE0;                 //clear timer
  TMR0L =156;                   //clear timer
  TMR0H =0;                     //clear timer
  T0CON = 0xC0;                 //set up timer0 - prescaler 1:2        8bit TIMER
  INTCONbits.GIEH = 1;          //enable interrupts
//ADC規劃
        ADCON0=0b00000000;
        ADCON1=0b00000100;
//  LATB = 0b00100000;



  PORTA = 0b00011011;
  TRISA = 0b00000011;           //AD
  PORTB = 0b11101111;           //RB5 flash
  TRISB = 0b00010001;
  PORTC = 0b11011100;
  TRISC = 0b00000000;
  PORTD = 0b11111111;
  TRISD = 0b00001111;
  PORTE = 0b00000000;           //
  TRISE = 0b00000000;
  //



       /***************** servo reset (快速) *********/
          ServoMotorReset();      //(快速 reset)
          Delay10KTCYx (250);     /* 延時 (   * 10k cycles) */
          ServoMotorStop();
       /***************** servo reset end ************/

       lcdinit();        //lcd 初設
         Delay10KTCYx (20);   /* 開機延時 (10 * 100 cycles) */
       DispPage1();
       /***************** servo reset (慢速) *********/
//     steptotalvalue=1;
//     waittotalvalue=0;
//     ch1totalvalue=0;
//     ch2totalvalue=0;
//     ch3totalvalue=0;
//     ch4totalvalue=0;
//     ch5totalvalue=0;
//     ch6totalvalue=0;
//     ch7totalvalue=0;
//     ch8totalvalue=0;
//     ServoMotorRun();          //執行 servo motor 程序

       /***************** servo reset (快速) *********/
          ServoMotorReset();      //(快速 reset)
          Delay10KTCYx (250);     /* 延時 (   * 10k cycles) */
          ServoMotorStop();
       /***************** servo reset end ************/

        for( i=0;i<200;i++)
        {
          Delay1KTCYx (20);       /* 延時 (   * 10k cycles) */
        }

          DispPage2();      //lcd 顯示開機畫面


          ReadDataEEPROM(0xFF);
          TestValue=EEDATA;
          if(TestValue!=0xA5)
          {
            SaveDataEEPROMInit();        //  第一次初設
            WriteDataEEPROM(0xFF,0xA5);  //  (EEPROM 位址 0xFF===>data 0xa5)
            ClrWdt();                 //CLEAR WATCHDOG
            Delay10KTCYx (5);
            ClrWdt();                 //CLEAR WATCHDOG
            Delay10KTCYx (5);
          }

         AD0result=40;    //<----------<test
//     OpenADC( ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_3ANA_0REF,ADC_CH0 & ADC_INT_OFF );   //AD 設定, 開 A/D==>AN0,AN1,AN3  無中斷
//     CloseADC();   //AD 設定

//-----------------------------------------------
//        servo_test();     //servo 中點測試
//servo_test_loop:
//            goto    servo_test_loop;
//----------------------------------------------------------------------------
//      程序 1
//----------------------------------------------------------------------------
program1:

          lcdcursoroff();         // LCM 游標 OFF

          LED_PIN = 1;            // LED off RB5


  while (1)
    {

      /*---------------是否按鍵盤----------------------*/
      if (KEYDA_PIN==1)
      {
         keydata1=(PORTD & 0b00001111);
         keydata2=keytable[keydata1];   //鍵碼查表轉換
           switch(keydata2)
           {
                case 0x01:
                          DispDemo1();      //顯示 DEMO1
                           ReadDataEEPROM(0xFB); //取執行次數參數值
                           RunCountvalue=EEDATA;
                         /***************** servo reset (快速) *********/
                           ServoMotorReset();      //(快速 reset)
                           Delay10KTCYx (100);     /* 延時 (   * 10k cycles) */
                           ServoMotorStop();
                         /***************** servo reset end ************/
                          run_flag=1;       //LED FLASH
                        do
                        {

                          /*************** program 0 ****************/
                          PageNumber=0;
                   //     PageDisplay();

                          GetKey1DataROM();         //依據 PAGE 自動 Rom Table 參數
                          ServoMotorRun();          //執行 servo motor 程序
                          ProgramWaitTime();        // program 完成後,等待時間

                          /*************** program 1~23**************/
                          do
                          {
                            PageNumber++;
                      //    PageDisplay();

                            GetKey1DataROM();         //依據 PAGE 自動 Rom Table 參數
                            if ( steptotalvalue==0 || steptotalvalue==255)
                            {
                              PageNumber=25;    //離開
                            }
                            else
                            {
                              ServoMotorRun();          //執行 servo motor 程序
                              ProgramWaitTime();        // program 完成後,等待時間
                            }

                          } while(PageNumber<23);
                            RunCountvalue--;            //執行次數減1

                        } while(RunCountvalue!=0);
                          ServoMotorResetSlow();    //自動歸位 (慢速)
                          ServoMotorRun();          //執行 servo motor 程序
                          ProgramWaitTime();        // program 完成後,等待時間
                           ServoMotorStop();        //馬達停止
                           run_flag=0;       //LED FLASH off
                           PageNumber=0;     //歸0
                           DispPage2();      //lcd 顯示開機畫面
                        break;

                case 0x02:
                          DispDemo2();      //顯示 DEMO2
                           ReadDataEEPROM(0xFB); //取執行次數參數值
                           RunCountvalue=EEDATA;
                         /***************** servo reset (快速) *********/
                           ServoMotorReset();      //(快速 reset)
                           Delay10KTCYx (100);     /* 延時 (   * 10k cycles) */
                           ServoMotorStop();
                         /***************** servo reset end ************/
                          run_flag=1;       //LED FLASH
                        do
                        {

                          /*************** program 0 ****************/
                          PageNumber=0;
                   //     PageDisplay();

                          GetKey2DataROM();         //依據 PAGE 自動 Rom Table 參數
                          ServoMotorRun();          //執行 servo motor 程序
                          ProgramWaitTime();        // program 完成後,等待時間

                          /*************** program 1~23**************/
                          do
                          {
                            PageNumber++;
                      //    PageDisplay();

                            GetKey2DataROM();         //依據 PAGE 自動 Rom Table 參數
                            if ( steptotalvalue==0 || steptotalvalue==255)
                            {
                              PageNumber=25;    //離開
                            }
                            else
                            {
                              ServoMotorRun();          //執行 servo motor 程序
                              ProgramWaitTime();        // program 完成後,等待時間
                            }

                          } while(PageNumber<23);
                            RunCountvalue--;            //執行次數減1

                        } while(RunCountvalue!=0);
                          ServoMotorResetSlow();    //自動歸位 (慢速)
                          ServoMotorRun();          //執行 servo motor 程序
                          ProgramWaitTime();        // program 完成後,等待時間
                           ServoMotorStop();        //馬達停止
                           run_flag=0;       //LED FLASH off
                           PageNumber=0;     //歸0
                           DispPage2();      //lcd 顯示開機畫面
                        break;

                case 0x03:
                          DispDemo3();      //顯示 DEMO3
                           ReadDataEEPROM(0xFB); //取執行次數參數值
                           RunCountvalue=EEDATA;
                         /***************** servo reset (快速) *********/
                           ServoMotorReset();      //(快速 reset)
                           Delay10KTCYx (100);     /* 延時 (   * 10k cycles) */
                           ServoMotorStop();
                         /***************** servo reset end ************/
                          run_flag=1;       //LED FLASH
                        do
                        {

                          /*************** program 0 ****************/
                          PageNumber=0;
                   //     PageDisplay();

                          GetKey3DataROM();         //依據 PAGE 自動 Rom Table 參數
                          ServoMotorRun();          //執行 servo motor 程序
                          ProgramWaitTime();        // program 完成後,等待時間

                          /*************** program 1~23**************/
                          do
                          {
                            PageNumber++;
                      //    PageDisplay();

                            GetKey3DataROM();         //依據 PAGE 自動 Rom Table 參數
                            if ( steptotalvalue==0 || steptotalvalue==255)
                            {
                              PageNumber=25;    //離開
                            }
                            else
                            {
                              ServoMotorRun();          //執行 servo motor 程序
                              ProgramWaitTime();        // program 完成後,等待時間
                            }

                          } while(PageNumber<23);
                            RunCountvalue--;            //執行次數減1

                        } while(RunCountvalue!=0);
                          ServoMotorResetSlow();    //自動歸位 (慢速)
                          ServoMotorRun();          //執行 servo motor 程序
                          ProgramWaitTime();        // program 完成後,等待時間
                           ServoMotorStop();        //馬達停止
                           run_flag=0;       //LED FLASH off
                           PageNumber=0;     //歸0
                           DispPage2();      //lcd 顯示開機畫面
                        break;


                case 0x0a:
                          /************* 自編參數設定 *************/
                          /* 1.執行次數  2.回授偵測   *************/
                          /****************************************/
                          DispSetup();
                          while (KEYDA_PIN==1);
                          Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */
                      //   ReadDataEEPROM(0xFB); //取執行次數參數值
                      //   RunCountvalue=EEDATA;
                           GetSetupDisp();

                           do
                           {
                             SetRunCount();
                             while (KEYDA_PIN==1);
                             Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                      //     SetAD0overflow();
                      //     while (KEYDA_PIN==1);
                      //     Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                           } while (keydata2 != 0x0C);         //按C鍵離開

                             WriteDataEEPROM(0xFB,RunCountvalue);    //將設定值存入 EEPROM 中
                             Delay10KTCYx (10);                      /* 延時 (   * 10k cycles) */
                             WriteDataEEPROM(0xFC,AD0result);    //將設定值存入 EEPROM 中
                             Delay10KTCYx (10);                      /* 延時 (   * 10k cycles) */
                             lcdcursoroff();     // LCM 游標 OFF

                               PageNumber=0;     //page 回到 0
                               DispPage2();      //lcd 顯示開機畫面
                        break;

                case 0x0b:
                          /************* 自編瀏覽功能 *************/

                          DispPage3();      //lcd 顯示參數畫面
                          DispSee();

                          while (KEYDA_PIN==1);
                          Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                          PageDisplay();
                          GetDataEEPROMDisp();  //依據 PAGE 自動顯示參數
                  do
                  {
                        lcdcursoroff();     // LCM 游標 OFF
                        while (KEYDA_PIN!=1);
                         keydata1=(PORTD & 0b00001111);
                         keydata2=keytable[keydata1];        //鍵碼查表轉換
                    switch(keydata2)
                    {
                      case 0x0B:
                              if ( PageNumber>=24 )
                              { PageNumber=0; }
                              else
                              {
                                PageNumber++;
                              }
                              PageDisplay();
                              GetDataEEPROMDisp();  //依據 PAGE 自動顯示參數

                              while (KEYDA_PIN==1);
                              Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */
                           break;

                      case 0x0F:
                               PageNumber=0;     //page 回到 0
                               DispPage2();      //lcd 顯示開機畫面

                           break;

                      case 0x0E:
                           DispEdit();

                          do
                          {
                            SetStepTimer();
                             while (KEYDA_PIN==1);
                             Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                            SetWaitTimer();
                             while (KEYDA_PIN==1);
                             Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                            SetCH1Angle();
                             while (KEYDA_PIN==1);
                             Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                            SetCH2Angle();
                             while (KEYDA_PIN==1);
                             Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                            SetCH3Angle();
                             while (KEYDA_PIN==1);
                             Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                            SetCH4Angle();
                             while (KEYDA_PIN==1);
                             Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                            SetCH5Angle();
                             while (KEYDA_PIN==1);
                             Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                            SetCH6Angle();
                             while (KEYDA_PIN==1);
                             Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                            SetCH7Angle();
                             while (KEYDA_PIN==1);
                             Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                            SetCH8Angle();
                             while (KEYDA_PIN==1);
                             Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */


                          } while (keydata2 != 0x0C);         //按C鍵離開

                            SaveDataEEPROM();   //將設定值存入 EEPROM 中
                            lcdcursoroff();     // LCM 游標 OFF
                           break;
                    }
                  } while (keydata2 != 0x0F);         //按f鍵離開

                   break;

                case 0x0c:

                        break;

                case 0x0d:

                        break;

                case 0x0e:




                        break;

                case 0x0f:
                          /************* 自編執行功能 *************/
                           ReadDataEEPROM(0xFB); //取執行次數參數值
                           RunCountvalue=EEDATA;
                         /***************** servo reset (快速) *********/
                           ServoMotorReset();      //(快速 reset)
                           Delay10KTCYx (100);     /* 延時 (   * 10k cycles) */
                           ServoMotorStop();
                         /***************** servo reset end ************/
                          DispPage3();      //lcd 顯示參數畫面
                          DispRun();
                          run_flag=1;       //LED FLASH
                        do
                        {

                          /*************** program 0 ****************/
                          PageNumber=0;
                          PageDisplay();

                          GetDataEEPROMDisp();      //依據 PAGE 自動顯示參數
                          ServoMotorRun();          //執行 servo motor 程序
                          ProgramWaitTime();        // program 完成後,等待時間

                          /*************** program 1 ****************/
                     //   PageNumber=1;
                     //   PageDisplay();

                     //   GetDataEEPROMDisp();      //依據 PAGE 自動顯示參數
                     //   ServoMotorRun();          //執行 servo motor 程序
                     //   ProgramWaitTime();        // program 完成後,等待時間

                          /*************** program 1~23**************/
                          do
                          {
                            PageNumber++;
                            PageDisplay();

                            GetDataEEPROMDisp();  //依據 PAGE 自動顯示參數
                            if ( steptotalvalue==0 || steptotalvalue==99 || steptotalvalue==255)
                            {
                              PageNumber=25;    //離開
                            }
                            else
                            {
                              ServoMotorRun();          //執行 servo motor 程序
                              ProgramWaitTime();        // program 完成後,等待時間
                            }

                          } while(PageNumber<23);
                            RunCountvalue--;            //執行次數減1

                        } while(RunCountvalue!=0);
                          ServoMotorResetSlow();    //自動歸位 (慢速)
                          ServoMotorRun();          //執行 servo motor 程序
                          ProgramWaitTime();        // program 完成後,等待時間
                           ServoMotorStop();        //馬達停止
                           run_flag=0;       //LED FLASH off
                           PageNumber=0;     //歸0
                           DispPage2();      //lcd 顯示開機畫面
                        break;

                default:
                        break;

           }
                   while (KEYDA_PIN==1);       //判斷按鍵是否放開 ?
                   Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

      }

    }  //while end program1





}  //main end

//----------------------------------------------------------------------------
//      高優先權中斷向量定址
//----------------------------------------------------------------------------
// High priority interrupt vector

#pragma code InterruptVectorHigh = 0x08
void
InterruptVectorHigh (void)
{
  _asm
    goto InterruptHandlerHigh //jump to interrupt routine
  _endasm
}

//----------------------------------------------------------------------------
//      高優先權中斷服務程式
//----------------------------------------------------------------------------
// High priority interrupt routine

#pragma code
#pragma interrupt InterruptHandlerHigh

void
InterruptHandlerHigh ()
{
//   if (INTCONbits.INT0IF==1)
//  {                                   //check for INT0 INTERRUPT
//    INTCONbits.INT0IF=0;
//    RfKeyData= (PORTA & 0b00111100 )>>2;
//  }
  if (INTCONbits.TMR0IF==1)
   {                                    //check for TMR0 overflow
      INTCONbits.TMR0IF = 0;            //clear interrupt flag
      TMR0L =156;                       //clear timer (256-156)*2/2/5=20uS
      TMR0H =0;                         //clear timer
//    Flags.Bit.Timeout = 1;            //indicate timeout
    PulseFrequency++;
    if (PulseFrequency==960)            //50Hz  (1000*20=20mS) F=1/t
    {
       if(ch1motor_flag==1)
       { SERVOMOTOR1_PIN=1; }

       if(ch2motor_flag==1)
       { SERVOMOTOR2_PIN=1; }

       if(ch3motor_flag==1)
       { SERVOMOTOR3_PIN=1; }

       if(ch4motor_flag==1)
       { SERVOMOTOR4_PIN=1; }

       if(ch5motor_flag==1)
       { SERVOMOTOR5_PIN=1; }

       if(ch6motor_flag==1)
       { SERVOMOTOR6_PIN=1; }

       if(ch7motor_flag==1)
       { SERVOMOTOR7_PIN=1; }

       if(ch8motor_flag==1)
       { SERVOMOTOR8_PIN=1; }

           PulseFrequency=0;
   //      BFlags=0;        //set byte
           ch1width_flag=0;
           ch2width_flag=0;
           ch3width_flag=0;
           ch4width_flag=0;
           ch5width_flag=0;
           ch6width_flag=0;
           ch7width_flag=0;
           ch8width_flag=0;

    }


    if (ch1width_flag==0)           //ch1 server motor
    {
       Ch1_PulseWidth++;
       if (Ch1_PulseWidth==Ch1FRSpeedValue)
       {
           SERVOMOTOR1_PIN=0;
           Ch1_PulseWidth=0;
           ch1width_flag=1;
       }
    }

    if (ch2width_flag==0)           //ch2 server motor
    {
       Ch2_PulseWidth++;
       if (Ch2_PulseWidth==Ch2FRSpeedValue)
       {
           SERVOMOTOR2_PIN=0;
           Ch2_PulseWidth=0;
           ch2width_flag=1;
       }
    }

    if (ch3width_flag==0)           //ch3 server motor
    {
       Ch3_PulseWidth++;
       if (Ch3_PulseWidth==Ch3FRSpeedValue)
       {
           SERVOMOTOR3_PIN=0;
           Ch3_PulseWidth=0;
           ch3width_flag=1;
       }
    }

    if (ch4width_flag==0)           //ch4 server motor
    {
       Ch4_PulseWidth++;
       if (Ch4_PulseWidth==Ch4FRSpeedValue)
       {
           SERVOMOTOR4_PIN=0;
           Ch4_PulseWidth=0;
           ch4width_flag=1;
       }
    }

    if (ch5width_flag==0)           //ch5 server motor
    {
       Ch5_PulseWidth++;
       if (Ch5_PulseWidth==Ch5FRSpeedValue)
       {
           SERVOMOTOR5_PIN=0;
           Ch5_PulseWidth=0;
           ch5width_flag=1;
       }
    }

    if (ch6width_flag==0)           //ch6 server motor
    {
       Ch6_PulseWidth++;
       if (Ch6_PulseWidth==Ch6FRSpeedValue)
       {
           SERVOMOTOR6_PIN=0;
           Ch6_PulseWidth=0;
           ch6width_flag=1;
       }
    }

    if (ch7width_flag==0)           //ch7 server motor
    {
       Ch7_PulseWidth++;
       if (Ch7_PulseWidth==Ch7FRSpeedValue)
       {
           SERVOMOTOR7_PIN=0;
           Ch7_PulseWidth=0;
           ch7width_flag=1;
       }
    }

    if (ch8width_flag==0)           //ch8 server motor
    {
       Ch8_PulseWidth++;
       if (Ch8_PulseWidth==Ch8FRSpeedValue)
       {
           SERVOMOTOR8_PIN=0;
           Ch8_PulseWidth=0;
           ch8width_flag=1;
       }
    }




//  if (run_flag==1)                     //設旗標 AFlags.bit1=1
//  {
      T0ck1++;
      if (T0ck1==5000)             //5000*20uS=0.1s
      {
        if (run_flag==1)                     //設旗標 AFlags.bit1=1
        {
          LED_PIN = ~ LED_PIN;   //toggle LED on RB5
        }
        else
        { LED_PIN = 1;}     //LED OFF

        T0ck1=0;
        time100ms_flag=1;
      }
//  }

      T0ck2++;
      if (T0ck2==500)             //500*20uS=10mS
      {
        time10ms_flag=1;
        T0ck2=0;
      }



   }//END IF


}


//=======================================================
//  servo motor angle --> MotorPulseValue  0.7ms~2.3ms
//=======================================================
unsigned char Trans_AngleToValue(unsigned char Angle)
{
    unsigned int MotorPulseValue,AngleBk;
    AngleBk=Angle;

    MotorPulseValue=((AngleBk*100)/225);
       return   MotorPulseValue;
}

//===============================================
//  servo 中點測試   20*75=1500uS (中點)
//===============================================
void servo_test(void)
{
        ch1motor_flag=1;        //ch1 motor on
        Ch1FRSpeedValue=75;

        ch2motor_flag=1;        //ch2 motor on
        Ch2FRSpeedValue=75;

}

//===============================================
//      servo motor stop
//===============================================
void ServoMotorStop(void)
{
      ch1motor_flag=0;        //ch1 motor off
      ch2motor_flag=0;        //ch2 motor off
      ch3motor_flag=0;        //ch3 motor off
      ch4motor_flag=0;        //ch4 motor off
      ch5motor_flag=0;        //ch5 motor off
      ch6motor_flag=0;        //ch6 motor off
      ch7motor_flag=0;        //ch7 motor off
      ch8motor_flag=0;        //ch8 motor off
}


//===============================================
//      前進程式     20*75=1500uS (中點)
//===============================================
void car_f(void)
{
        ch1motor_flag=1;        //ch1 motor on
        Ch1FRSpeedValue=85;

        ch2motor_flag=1;        //ch2 motor on
        Ch2FRSpeedValue=65;

}

//===============================================
//    快前進程式     20*75=1500uS (中點)
//===============================================
void car_ff(void)
{
        ch1motor_flag=1;        //ch1 motor on
        Ch1FRSpeedValue=90;

        ch2motor_flag=1;        //ch2 motor on
        Ch2FRSpeedValue=60;

}

//===============================================
//      LCD 啟始程式 (4bit 控制方式)
//===============================================
void lcdinit(void)
{
      checklcdbusy();
      RS_PIN=0;
      RW_PIN=0;
      E_PIN=0;
      PORTD=0x00;
      Nop();
      Nop();
      PORTD=(0x30 & 0b11110000);
      E_PIN=1;
      Delay10TCYx(1);   /* pause for a moment (1 * 10 cycles) */
      E_PIN=0;
      Delay10KTCYx(1);   /* pause for a moment (1 * 10 cycles) */

      checklcdbusy();
      PORTD=(0x30 & 0b11110000);
      E_PIN=1;
      Delay10TCYx(1);   /* pause for a moment (1 * 10 cycles) */
      E_PIN=0;
      Delay10KTCYx(1);   /* pause for a moment (1 * 10 cycles) */

      TransComm(0x32);
      TransComm(0x28);
      TransComm(0x0C);
      TransComm(0x06);
      Delay10KTCYx(5);   /* pause for a moment (1 * 10 cycles) */
      TransComm(0x01);


}
//===============================================
//      lcd cursor on  程式
//===============================================
void lcdcursoron(void)
{
      TransComm(0x0F);

}
//===============================================
//      lcd cursor off 程式
//===============================================
void lcdcursoroff(void)
{
      TransComm(0x0C);

}
//==============================================
//      LCD 檢查忙碌旗標  (4bit時檢查兩次)
//==============================================
void checklcdbusy(void)
{
    do
    {
      RS_PIN=0;
      RW_PIN=1;
      Nop();
      Nop();
      Nop();
      Nop();
//    DDRDbits.RD7=1;           //INPUT
      TRISD = 0b11111111;       // INPUT
      E_PIN=1;
      Delay10TCYx(2);   /* pause for a moment (1 * 10 cycles) */
      E_PIN=0;
      //
    }
      while (PORTDbits.RD7==1);

      Nop();
      Nop();
      E_PIN=1;
      Delay10TCYx(2);   /* pause for a moment (1 * 10 cycles) */
      E_PIN=0;


//    DDRDbits.RD7=0;           //OUTPUT
      TRISD = 0b00001111;       // OUTPUT
//    Nop();
//    Nop();
//    RW_PIN=0;
}

//==============================================
//      LCD 顯示一串字程式
//==============================================
const rom unsigned char ch[][17]=
{
        "== 8 CH Servo ==",  // 0
        "Control [Ver1.2]",  // 1
        "                ",  // 2
        "  Eidea Jacky   ",  // 3
        "= Key Function =",  // 4
        "A) Setup B) See ",  // 5
        "C) Enter D) x   ",  // 6
        "E) Edit  F) Run ",  // 7
        "P000 t[00] w[00]",  // 8
        "1[000][000][000]",  // 9
        "4[000][000][000]",  //10
        "7[000][000] See ",  //11
        "== Robot Arm  ==",  //12
        "==   Demo 1   ==",  //13
        "==   Demo 2   ==",  //14
        "==   Demo 3   ==",  //15
        "Press Reset EXIT",  //16
        "== Arm  Setup ==",  //17
        "RunCount [000]  ",  //18
        "Ch1over  [000]  "}; //19

void lcddisps1(unsigned int y)
{
        unsigned int x;
        unsigned char getdata;

        RS_PIN=1;
        RW_PIN=0;
        E_PIN=0;

        for (x=0;x<16;x++)
        {
                getdata=ch[y][x];
                TransData(getdata);
        }

        RS_PIN=0;
}

//===============================================
//       LCM 4bit  兩次取碼  (寫命令)
//===============================================
void TransComm(unsigned char LcmData)
{
    unsigned char LcmDataBk;

      RS_PIN=0;
      RW_PIN=0;
      E_PIN=0;

    LcmDataBk=LcmData;
    PORTD=(LcmData & 0b11110000);
      E_PIN=1;
      Delay10TCYx(1);   /* pause for a moment (1 * 10 cycles) */
      E_PIN=0;
      Delay1KTCYx(1);   /* pause for a moment (1 * 10 cycles) */
    //
}
//===============================================
//       LCM 4bit  兩次取碼  (寫資料)
//===============================================
void TransData(unsigned char LcmData)
{
    unsigned char LcmDataBk;
    LcmDataBk=LcmData;
    PORTD=(LcmData & 0b11110000);
      E_PIN=1;
      Delay10TCYx(1);   /* pause for a moment (1 * 10 cycles) */
      E_PIN=0;
      Delay1KTCYx(1);   /* pause for a moment (1 * 10 cycles) */
    //
}
//===============================================
//       LCM 4bit  兩次取碼  (寫資料) 單byte
//===============================================
void TransData1(unsigned char LcmData)
{
    unsigned char LcmDataBk;
        RS_PIN=1;
        RW_PIN=0;
        E_PIN=0;
    LcmDataBk=LcmData;
    PORTD=(LcmData & 0b11110000);
      E_PIN=1;
      Delay10TCYx(1);   /* pause for a moment (1 * 10 cycles) */
      E_PIN=0;
      Delay1KTCYx(1);   /* pause for a moment (1 * 10 cycles) */
    //
    PORTD=(LcmDataBk<<4 & 0b11110000);
      E_PIN=1;
      Delay10TCYx(1);   /* pause for a moment (1 * 10 cycles) */
      E_PIN=0;
      Delay1KTCYx(1);   /* pause for a moment (1 * 10 cycles) */

        RS_PIN=1;
      Delay1KTCYx(1);   /* pause for a moment (1 * 10 cycles) */
}
//===============================================
//       顯示 Run
//===============================================
void DispRun(void)
{
      RS_PIN=0;
      RW_PIN=0;
      E_PIN=0;
    TransComm(0xDC);            //lcd disp address
      RS_PIN=1;
      RW_PIN=0;
      E_PIN=0;
    TransData(0x52);            //lcd 顯示一個字  ASCII
    TransData(0x75);
    TransData(0x6E);
    TransData(0x20);
      RS_PIN=0;
}
//===============================================
//       顯示 Stop
//===============================================
void DispStop(void)
{
      RS_PIN=0;
      RW_PIN=0;
      E_PIN=0;
    TransComm(0xDC);            //lcd disp address
      RS_PIN=1;
      RW_PIN=0;
      E_PIN=0;
    TransData(0x53);            //lcd 顯示一個字  ASCII
    TransData(0x74);
    TransData(0x6F);
    TransData(0x70);
      RS_PIN=0;
}
//===============================================
//       顯示 Edit
//===============================================
void DispEdit(void)
{
      RS_PIN=0;
      RW_PIN=0;
      E_PIN=0;
    TransComm(0xDC);            //lcd disp address
      RS_PIN=1;
      RW_PIN=0;
      E_PIN=0;
    TransData(0x45);            //lcd 顯示一個字  ASCII
    TransData(0x64);
    TransData(0x69);
    TransData(0x74);
      RS_PIN=0;
}

//===============================================
//       顯示 See
//===============================================
void DispSee(void)
{
      RS_PIN=0;
      RW_PIN=0;
      E_PIN=0;
    TransComm(0xDC);            //lcd disp address
      RS_PIN=1;
      RW_PIN=0;
      E_PIN=0;
    TransData(0x53);            //lcd 顯示一個字  ASCII
    TransData(0x65);
    TransData(0x65);
    TransData(0x20);
      RS_PIN=0;
}
//===============================================
//      buzzer      副程式
//===============================================
void beep3(unsigned int soundlong,unsigned int tone)
{
        unsigned int j,k,spfreq;
        spfreq=(100/tone)/2;

        INTCONbits.GIEH = 0;          //disable interrupts
        for(j=0; j<soundlong; j++)
        {
                for(k=0;k<spfreq;k++)
                        PORTCbits.RC3=0;
                for(k=0;k<spfreq;k++)
                        PORTCbits.RC3=1;
        }
        INTCONbits.GIEH = 1;          //enable interrupts
}
//===============================================
//      delay       副程式
//===============================================
void TDelay(unsigned int delaytime)
{
        unsigned int i;

        for(i=0; i<delaytime; i++)
        {
            Nop();
        }
}
//===============================================
//      HEX TO BCD
//      BCD RANG 0~999
//===============================================
void BCD888(unsigned int hexdata1)
{

        BcdValue2=hexdata1/100;
        BcdValue1=(hexdata1-=BcdValue2*100)/10;
        BcdValue0=(hexdata1-=BcdValue1*10);

}
//===============================================
//      HEX TO BCD
//      BCD RANG 0~999
//===============================================
void BCD88(unsigned int hexdata1)
{
        BcdValue2=hexdata1/100;
        BcdValue1=(hexdata1-=BcdValue2*100)/10;
        BcdValue0=(hexdata1-=BcdValue1*10);
}

//===============================================
//      顯示開機畫面 1
//===============================================
void DispPage1(void)
{

     TransComm(0x80);  //address
     lcddisps1(0);     //lcd 顯示一串字
     TransComm(0xC0);  //address
     lcddisps1(1);     //lcd 顯示一串字
     TransComm(0x90);  //address
     lcddisps1(2);     //lcd 顯示一串字
     TransComm(0xD0);  //address
     lcddisps1(3);     //lcd 顯示一串字
}

//===============================================
//      顯示開機畫面 2
//===============================================
void DispPage2(void)
{

     TransComm(0x80);  //address
     lcddisps1(4);     //lcd 顯示一串字
     TransComm(0xC0);  //address
     lcddisps1(5);     //lcd 顯示一串字
     TransComm(0x90);  //address
     lcddisps1(6);     //lcd 顯示一串字
     TransComm(0xD0);  //address
     lcddisps1(7);     //lcd 顯示一串字
}

//===============================================
//      顯示自編設定畫面
//===============================================
void DispPage3(void)
{
     TransComm(0x80);  //address
     lcddisps1(8);     //lcd 顯示一串字
     TransComm(0xC0);  //address
     lcddisps1(9);     //lcd 顯示一串字
     TransComm(0x90);  //address
     lcddisps1(10);     //lcd 顯示一串字
     TransComm(0xD0);  //address
     lcddisps1(11);     //lcd 顯示一串字
}

//===============================================
//      顯示參數設定畫面
//===============================================
void DispSetup(void)
{
     TransComm(0x80);  //address
     lcddisps1(17);     //lcd 顯示一串字
     TransComm(0xC0);  //address
     lcddisps1(18);     //lcd 顯示一串字
     TransComm(0x90);  //address
     lcddisps1(2);     //lcd 顯示一串字
//   lcddisps1(19);     //lcd 顯示一串字
     TransComm(0xD0);  //address
     lcddisps1(2);     //lcd 顯示一串字
}

//===============================================
//      顯示DEMO畫面 1
//===============================================
void DispDemo1(void)
{

     TransComm(0x80);  //address
     lcddisps1(12);     //lcd 顯示一串字
     TransComm(0xC0);  //address
     lcddisps1(13);     //lcd 顯示一串字
     TransComm(0x90);  //address
     lcddisps1(2);     //lcd 顯示一串字
     TransComm(0xD0);  //address
     lcddisps1(16);     //lcd 顯示一串字
}

//===============================================
//      顯示DEMO畫面 2
//===============================================
void DispDemo2(void)
{

     TransComm(0x80);  //address
     lcddisps1(12);     //lcd 顯示一串字
     TransComm(0xC0);  //address
     lcddisps1(14);     //lcd 顯示一串字
     TransComm(0x90);  //address
     lcddisps1(2);     //lcd 顯示一串字
     TransComm(0xD0);  //address
     lcddisps1(16);     //lcd 顯示一串字
}

//===============================================
//      顯示DEMO畫面 3
//===============================================
void DispDemo3(void)
{

     TransComm(0x80);  //address
     lcddisps1(12);     //lcd 顯示一串字
     TransComm(0xC0);  //address
     lcddisps1(15);     //lcd 顯示一串字
     TransComm(0x90);  //address
     lcddisps1(2);     //lcd 顯示一串字
     TransComm(0xD0);  //address
     lcddisps1(16);     //lcd 顯示一串字
}

//===============================================
//      內部 Read Data EEPROM
//===============================================
void ReadDataEEPROM(char eepromaddr)
{
    EEADR=eepromaddr;
    EECON1bits.EEPGD=0;
    EECON1bits.CFGS=0;
    EECON1bits.RD=1;
//  StopTimeS1=EEDATA;
}

//===============================================
//      內部 Write Data EEPROM
//===============================================
void WriteDataEEPROM(char eepromaddr,char eepromdata)
{
    EEADR=eepromaddr;
    EEDATA=eepromdata;
    EECON1bits.EEPGD=0;
    EECON1bits.CFGS=0;
    EECON1bits.WREN=1;

    INTCONbits.GIEH = 0;          //disable interrupts
    EECON2=0x55;
    EECON2=0xAA;
    EECON1bits.WR=1;
    INTCONbits.GIEH = 1;          //enable interrupts

    EECON1bits.WREN=0;
}



//===============================================
//      內部 Data EEPROM DISP   (依據 PAGE 自動)
//===============================================
void GetDataEEPROMDisp(void)
{
    ReadDataEEPROM((PageNumber*10)+0);
    steptotalvalue=EEDATA;
     BCD88(steptotalvalue);
       setstepvalue1=BcdValue1;
       setstepvalue0=BcdValue0;
    TransComm(0x87);  //address
    Display88();

    ReadDataEEPROM((PageNumber*10)+1);
    waittotalvalue=EEDATA;
     BCD88(waittotalvalue);
       setwaitvalue1=BcdValue1;
       setwaitvalue0=BcdValue0;
    TransComm(0x8D);  //address
    Display88();

    ReadDataEEPROM((PageNumber*10)+2);
    ch1totalvalue=EEDATA;
     BCD888(ch1totalvalue);
       setch1value2=BcdValue2;
       setch1value1=BcdValue1;
       setch1value0=BcdValue0;
    TransComm(0xC2);  //address
    Display888();

    ReadDataEEPROM((PageNumber*10)+3);
    ch2totalvalue=EEDATA;
     BCD888(ch2totalvalue);
       setch2value2=BcdValue2;
       setch2value1=BcdValue1;
       setch2value0=BcdValue0;
    TransComm(0xC7);  //address
    Display888();

    ReadDataEEPROM((PageNumber*10)+4);
    ch3totalvalue=EEDATA;
     BCD888(ch3totalvalue);
       setch3value2=BcdValue2;
       setch3value1=BcdValue1;
       setch3value0=BcdValue0;
    TransComm(0xCC);  //address
    Display888();

    ReadDataEEPROM((PageNumber*10)+5);
    ch4totalvalue=EEDATA;
     BCD888(ch4totalvalue);
       setch4value2=BcdValue2;
       setch4value1=BcdValue1;
       setch4value0=BcdValue0;
    TransComm(0x92);  //address
    Display888();

    ReadDataEEPROM((PageNumber*10)+6);
    ch5totalvalue=EEDATA;
     BCD888(ch5totalvalue);
       setch5value2=BcdValue2;
       setch5value1=BcdValue1;
       setch5value0=BcdValue0;
    TransComm(0x97);  //address
    Display888();

    ReadDataEEPROM((PageNumber*10)+7);
    ch6totalvalue=EEDATA;
     BCD888(ch6totalvalue);
       setch6value2=BcdValue2;
       setch6value1=BcdValue1;
       setch6value0=BcdValue0;
    TransComm(0x9C);  //address
    Display888();

    ReadDataEEPROM((PageNumber*10)+8);
    ch7totalvalue=EEDATA;
     BCD888(ch7totalvalue);
       setch7value2=BcdValue2;
       setch7value1=BcdValue1;
       setch7value0=BcdValue0;
    TransComm(0xD2);  //address
    Display888();

    ReadDataEEPROM((PageNumber*10)+9);
    ch8totalvalue=EEDATA;
     BCD888(ch8totalvalue);
       setch8value2=BcdValue2;
       setch8value1=BcdValue1;
       setch8value0=BcdValue0;
    TransComm(0xD7);  //address
    Display888();

}

//===============================================
//      取 SETUP VALUE 並顯示
//===============================================
void GetSetupDisp(void)
{

     ReadDataEEPROM(0xFB); //取執行次數參數值
     RunCountvalue=EEDATA;
     BCD888(RunCountvalue);
    TransComm(0xCA);  //address
    Display888();

}

//===================================================
//      內部 Data EEPROM SAVE (依據 PAGE 自動儲存)
//===================================================
void SaveDataEEPROM(void)
{
}

//===============================================
//      內部 Data EEPROM SAVE
//===============================================
void SaveDataEEPROMInit(void)
{

}

//===============================================
//      內部 KEY1 ARM 執行程序
//===============================================
void GetKey1DataROM(void)
{
          steptotalvalue=InitKey1Process[(PageNumber*10)+0];  //
          waittotalvalue=InitKey1Process[(PageNumber*10)+1];  //
          ch1totalvalue=InitKey1Process[(PageNumber*10)+2];  //
          ch2totalvalue=InitKey1Process[(PageNumber*10)+3];  //
          ch3totalvalue=InitKey1Process[(PageNumber*10)+4];  //
          ch4totalvalue=InitKey1Process[(PageNumber*10)+5];  //
          ch5totalvalue=InitKey1Process[(PageNumber*10)+6];  //
          ch6totalvalue=InitKey1Process[(PageNumber*10)+7];  //
          ch7totalvalue=InitKey1Process[(PageNumber*10)+8];  //
          ch8totalvalue=InitKey1Process[(PageNumber*10)+9];  //
}

//===============================================
//      內部 KEY2 ARM 執行程序
//===============================================
void GetKey2DataROM(void)
{
          steptotalvalue=InitKey2Process[(PageNumber*10)+0];  //
          waittotalvalue=InitKey2Process[(PageNumber*10)+1];  //
          ch1totalvalue=InitKey2Process[(PageNumber*10)+2];  //
          ch2totalvalue=InitKey2Process[(PageNumber*10)+3];  //
          ch3totalvalue=InitKey2Process[(PageNumber*10)+4];  //
          ch4totalvalue=InitKey2Process[(PageNumber*10)+5];  //
          ch5totalvalue=InitKey2Process[(PageNumber*10)+6];  //
          ch6totalvalue=InitKey2Process[(PageNumber*10)+7];  //
          ch7totalvalue=InitKey2Process[(PageNumber*10)+8];  //
          ch8totalvalue=InitKey2Process[(PageNumber*10)+9];  //
}

//===============================================
//      內部 KEY3 ARM 執行程序
//===============================================
void GetKey3DataROM(void)
{
          steptotalvalue=InitKey3Process[(PageNumber*10)+0];  //
          waittotalvalue=InitKey3Process[(PageNumber*10)+1];  //
          ch1totalvalue=InitKey3Process[(PageNumber*10)+2];  //
          ch2totalvalue=InitKey3Process[(PageNumber*10)+3];  //
          ch3totalvalue=InitKey3Process[(PageNumber*10)+4];  //
          ch4totalvalue=InitKey3Process[(PageNumber*10)+5];  //
          ch5totalvalue=InitKey3Process[(PageNumber*10)+6];  //
          ch6totalvalue=InitKey3Process[(PageNumber*10)+7];  //
          ch7totalvalue=InitKey3Process[(PageNumber*10)+8];  //
          ch8totalvalue=InitKey3Process[(PageNumber*10)+9];  //
}

//===============================================
//      設定單步停留時間
//===============================================
void SetStepTimer(void)
{
      steptotalvalueBk=steptotalvalue;
   do
   {
        TransComm(0x87);  //address
        lcdcursoron();
        while (KEYDA_PIN!=1);
          keydata1=(PORTD & 0b00001111);
          keydata2=keytable[keydata1];        //鍵碼查表轉換
          if (keydata2<=9)
          {
            setstepvalue1=keydata2;            //設定單步停留時間數值備份
            stepvalue1=keydata2*10;           //十位數
            TransData1(keydata2+0x30);         //lcd 顯示一個字

            while (KEYDA_PIN==1);
             Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */
          }
//        else { break; }

        while (KEYDA_PIN!=1);
          keydata1=(PORTD & 0b00001111);
          keydata2=keytable[keydata1];        //鍵碼查表轉換
          if (keydata2<=9)
          {
            setstepvalue0=keydata2;            //設定單步停留時間數值備份
            stepvalue0=keydata2;               //個位數
            TransData1(keydata2+0x30);         //lcd 顯示一個字

            while (KEYDA_PIN==1);
             Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */
      steptotalvalue=stepvalue1+stepvalue0;
      steptotalvalueBk=steptotalvalue;
          }
//        else { break; }

   } while (keydata2 != 0x0c);         //按c鍵離開
   steptotalvalue=steptotalvalueBk;

}
//===============================================
//      設定動作完成等待停留時間
//===============================================
void SetWaitTimer(void)
{
   waittotalvalueBk=waittotalvalue;
   do
   {
        TransComm(0x8d);  //address
        lcdcursoron();
        while (KEYDA_PIN!=1);
          keydata1=(PORTD & 0b00001111);
          keydata2=keytable[keydata1];        //鍵碼查表轉換
          if (keydata2<=9)
          {
            setwaitvalue1=keydata2;            //設定單步停留時間數值備份
            waitvalue1=keydata2*10;            //十位數
            TransData1(keydata2+0x30);         //lcd 顯示一個字

            while (KEYDA_PIN==1);
             Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */
          }
//        else { break; }

        while (KEYDA_PIN!=1);
          keydata1=(PORTD & 0b00001111);
          keydata2=keytable[keydata1];        //鍵碼查表轉換
          if (keydata2<=9)
          {
            setwaitvalue0=keydata2;            //設定單步停留時間數值備份
            waitvalue0=keydata2;               //個位數
            TransData1(keydata2+0x30);         //lcd 顯示一個字

            while (KEYDA_PIN==1);
             Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */
   waittotalvalue=waitvalue1+waitvalue0;
   waittotalvalueBk=waittotalvalue;
          }
//        else { break; }

   } while (keydata2 != 0x0c);         //按c鍵離開
   waittotalvalue=waittotalvalueBk;

}
//===============================================
//      設定 ch1 角度
//===============================================
void SetCH1Angle(void)
{
   ch1totalvalueBk=ch1totalvalue;
   do
   {
              TransComm(0xC2);  //address
      //      lcdcursoron();
              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=1)
                {
                  setch1value2=keydata2;            //設定數值備份
                  ch1value2=keydata2*100;           //百位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                }
//              else { break; }

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=9)
                {
                  setch1value1=keydata2;            //設定數值備份
                  ch1value1=keydata2*10;            //時位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                }
//              else { break; }

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=9)
                {
                  setch1value0=keydata2;            //設定數值備份
                  ch1value0=keydata2;               //個位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

   ch1totalvalue=ch1value2+ch1value1+ch1value0;
   ch1totalvalueBk=ch1totalvalue;
                }
//              else { break; }



   } while (keydata2 != 0x0c);         //按c鍵離開
   ch1totalvalue=ch1totalvalueBk;

}
//===============================================
//      設定 ch2 角度
//===============================================
void SetCH2Angle(void)
{
   ch2totalvalueBk=ch2totalvalue;
   do
   {
              TransComm(0xC7);  //address
      //      lcdcursoron();
              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=1)
                {
                  setch2value2=keydata2;            //設定數值備份
                  ch2value2=keydata2*100;           //百位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                }
//              else { break; }

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=9)
                {
                  setch2value1=keydata2;            //設定數值備份
                  ch2value1=keydata2*10;            //時位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                }
//              else { break; }

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=9)
                {
                  setch2value0=keydata2;            //設定數值備份
                  ch2value0=keydata2;           //個位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

   ch2totalvalue=ch2value2+ch2value1+ch2value0;
   ch2totalvalueBk=ch2totalvalue;
                }
//              else { break; }

   } while (keydata2 != 0x0c);         //按c鍵離開
   ch2totalvalue=ch2totalvalueBk;

}
//===============================================
//      設定 ch3 角度
//===============================================
void SetCH3Angle(void)
{
   ch3totalvalueBk=ch3totalvalue;
   do
   {
              TransComm(0xCC);  //address
      //      lcdcursoron();
              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=1)
                {
                  setch3value2=keydata2;            //設定數值備份
                  ch3value2=keydata2*100;           //百位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                }
//              else { break; }

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=9)
                {
                  setch3value1=keydata2;            //設定數值備份
                  ch3value1=keydata2*10;            //時位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                }
//              else { break; }

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=9)
                {
                  setch3value0=keydata2;            //設定數值備份
                  ch3value0=keydata2;               //個位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

   ch3totalvalue=ch3value2+ch3value1+ch3value0;
   ch3totalvalueBk=ch3totalvalue;
                }
//              else { break; }



   } while (keydata2 != 0x0c);         //按c鍵離開
   ch3totalvalue=ch3totalvalueBk;

}
//===============================================
//      設定 ch4 角度
//===============================================
void SetCH4Angle(void)
{
   ch4totalvalueBk=ch4totalvalue;

   do
   {
              TransComm(0x92);  //address
      //      lcdcursoron();
              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=1)
                {
                  setch4value2=keydata2;            //設定數值備份
                  ch4value2=keydata2*100;           //百位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                }
//              else { break; }

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=9)
                {
                  setch4value1=keydata2;            //設定數值備份
                  ch4value1=keydata2*10;            //時位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                }
//              else { break; }

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=9)
                {
                  setch4value0=keydata2;            //設定數值備份
                  ch4value0=keydata2;               //個位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

   ch4totalvalue=ch4value2+ch4value1+ch4value0;
   ch4totalvalueBk=ch4totalvalue;
                }
//              else { break; }



   } while (keydata2 != 0x0c);         //按c鍵離開
   ch4totalvalue=ch4totalvalueBk;

}
//===============================================
//      設定 ch5 角度
//===============================================
void SetCH5Angle(void)
{
   ch5totalvalueBk=ch5totalvalue;
   do
   {
              TransComm(0x97);  //address
      //      lcdcursoron();
              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=1)
                {
                  setch5value2=keydata2;            //設定數值備份
                  ch5value2=keydata2*100;           //百位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                }
//              else { break; }

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=9)
                {
                  setch5value1=keydata2;            //設定數值備份
                  ch5value1=keydata2*10;            //時位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                }
//              else { break; }

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=9)
                {
                  setch5value0=keydata2;            //設定數值備份
                  ch5value0=keydata2;               //個位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

   ch5totalvalue=ch5value2+ch5value1+ch5value0;
   ch5totalvalueBk=ch5totalvalue;
                }
//              else { break; }



   } while (keydata2 != 0x0c);         //按c鍵離開
   ch5totalvalue=ch5totalvalueBk;

}
//===============================================
//      設定 ch6 角度
//===============================================
void SetCH6Angle(void)
{
   ch6totalvalueBk=ch6totalvalue;
   do
   {
              TransComm(0x9C);  //address
      //      lcdcursoron();
              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=1)
                {
                  setch6value2=keydata2;            //設定數值備份
                  ch6value2=keydata2*100;           //百位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                }
//              else { break; }

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=9)
                {
                  setch6value1=keydata2;            //設定數值備份
                  ch6value1=keydata2*10;            //時位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                }
//              else { break; }

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=9)
                {
                  setch6value0=keydata2;            //設定數值備份
                  ch6value0=keydata2;               //個位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

   ch6totalvalue=ch6value2+ch6value1+ch6value0;
   ch6totalvalueBk=ch6totalvalue;
                }
//              else { break; }



   } while (keydata2 != 0x0c);         //按c鍵離開
   ch6totalvalue=ch6totalvalueBk;

}
//===============================================
//      設定 ch7 角度
//===============================================
void SetCH7Angle(void)
{
   ch7totalvalueBk=ch7totalvalue;
   do
   {
              TransComm(0xD2);  //address
      //      lcdcursoron();
              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=1)
                {
                  setch7value2=keydata2;            //設定數值備份
                  ch7value2=keydata2*100;           //百位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                }
//              else { break; }

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=9)
                {
                  setch7value1=keydata2;            //設定數值備份
                  ch7value1=keydata2*10;            //時位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                }
//              else { break; }

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=9)
                {
                  setch7value0=keydata2;            //設定數值備份
                  ch7value0=keydata2;               //個位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

   ch7totalvalue=ch7value2+ch7value1+ch7value0;
   ch7totalvalueBk=ch7totalvalue;
                }
//              else { break; }



   } while (keydata2 != 0x0c);         //  c鍵離開
   ch7totalvalue=ch7totalvalueBk;

}
//===============================================
//      設定 ch8 角度
//===============================================
void SetCH8Angle(void)
{
   ch8totalvalueBk=ch8totalvalue;
   do
   {
              TransComm(0xD7);  //address
      //      lcdcursoron();
              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=1)
                {
                  setch8value2=keydata2;            //設定數值備份
                  ch8value2=keydata2*100;           //百位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                }
//              else { break; }

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=9)
                {
                  setch8value1=keydata2;            //設定數值備份
                  ch8value1=keydata2*10;            //時位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                }
//              else { break; }

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=9)
                {
                  setch8value0=keydata2;            //設定數值備份
                  ch8value0=keydata2;               //個位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

   ch8totalvalue=ch8value2+ch8value1+ch8value0;
   ch8totalvalueBk=ch8totalvalue;
                }
//              else { break; }



   } while (keydata2 != 0x0c);         //按c鍵離開
   ch8totalvalue=ch8totalvalueBk;

}

//===============================================
//      設定 執行次數
//===============================================
void SetRunCount(void)
{
   RunCountvalueBk=RunCountvalue;
   do
   {
              TransComm(0xCA);  //address
              lcdcursoron();

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=1)
                {
                  RunCountvalue2=keydata2*100;           //百位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                }
//              else { break; }

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=9)
                {
                  RunCountvalue1=keydata2*10;            //時位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                }
//              else { break; }

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=9)
                {
                  RunCountvalue0=keydata2;               //個位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

   RunCountvalue=RunCountvalue2+RunCountvalue1+RunCountvalue0;
   RunCountvalueBk=RunCountvalue;
                }
//              else { break; }



   } while (keydata2 != 0x0c);         //按c鍵離開
   RunCountvalue=RunCountvalueBk;

}

//===============================================
//      設定 AD0 OVERFLOW 參數
//===============================================
void SetAD0overflow(void)
{
   AD0resultBk=AD0result;
   do
   {
              TransComm(0x9A);  //address
              lcdcursoron();

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=1)
                {
                  AD0result2=keydata2*100;           //百位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                }
//              else { break; }

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=9)
                {
                  AD0result1=keydata2*10;            //時位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

                }
//              else { break; }

              while (KEYDA_PIN!=1);
                keydata1=(PORTD & 0b00001111);
                keydata2=keytable[keydata1];        //鍵碼查表轉換
                if (keydata2<=9)
                {
                  AD0result0=keydata2;               //個位數
                  TransData1(keydata2+0x30);         //lcd 顯示一個字

                  while (KEYDA_PIN==1);
                  Delay1KTCYx (20);   /* pause for a moment (1 * 1000 cycles) */

   AD0result=AD0result2+AD0result1+AD0result0;
   AD0resultBk=AD0result;
                }
//              else { break; }

   } while (keydata2 != 0x0c);         //按c鍵離開
   AD0result=AD0resultBk;

}
//===============================================
//      PAGE 顯示
//===============================================
void PageDisplay(void)
{
    lcdcursoroff();
    TransComm(0x81);  //address
    BCD888(PageNumber);
      TransData1(BcdValue2+0x30);         //lcd 顯示一個字
      TransData1(BcdValue1+0x30);         //lcd 顯示一個字
      TransData1(BcdValue0+0x30);         //lcd 顯示一個字
}
//===============================================
//      DISPLAY 88
//===============================================
void Display88(void)
{
      TransData1(BcdValue1+0x30);         //lcd 顯示一個字
      TransData1(BcdValue0+0x30);         //lcd 顯示一個字
}
//===============================================
//      DISPLAY 888
//===============================================
void Display888(void)
{
      TransData1(BcdValue2+0x30);         //lcd 顯示一個字
      TransData1(BcdValue1+0x30);         //lcd 顯示一個字
      TransData1(BcdValue0+0x30);         //lcd 顯示一個字
}

//===============================================
//      servo motor run 程式
//===============================================
void ServoMotorRun(void)
{

}

//===============================================
//      ch1~ch8 stepvalue 比大小程式
//===============================================
unsigned char CompStepValue(void)
{
    unsigned char bigvalue1,bigvalue2,bigvalue3,bigvalue4,bigvalue5,bigvalue6;
    unsigned char bigvalue;

        if (ch1totalvalue>ch2totalvalue)
        {
           bigvalue1=ch1totalvalue;
        }
        else
        {
           bigvalue1=ch2totalvalue;
        }

        if (ch3totalvalue>ch4totalvalue)
        {
           bigvalue2=ch3totalvalue;
        }
        else
        {
           bigvalue2=ch4totalvalue;
        }

        if (ch5totalvalue>ch6totalvalue)
        {
           bigvalue3=ch5totalvalue;
        }
        else
        {
           bigvalue3=ch6totalvalue;
        }

        if (ch7totalvalue>ch8totalvalue)
        {
           bigvalue4=ch7totalvalue;
        }
        else
        {
           bigvalue4=ch8totalvalue;
        }

        if (bigvalue1>bigvalue2)
        {
           bigvalue5=bigvalue1;
        }
        else
        {
           bigvalue5=bigvalue2;
        }

        if (bigvalue3>bigvalue4)
        {
           bigvalue6=bigvalue3;
        }
        else
        {
           bigvalue6=bigvalue4;
        }

        if (bigvalue5>bigvalue6)
        {
           bigvalue=bigvalue5;
        }
        else
        {
           bigvalue=bigvalue6;
        }

        return bigvalue;
}
//===============================================
//      servo motor reset 程式
//===============================================
void ServoMotorReset(void)
{
        unsigned char i=0;  //0度

        ch1totalvalue=0;
        ch2totalvalue=0;
        ch3totalvalue=0;
        ch4totalvalue=0;
        ch5totalvalue=0;
        ch6totalvalue=0;
        ch7totalvalue=0;
        ch8totalvalue=0;
        //
        ch1totalvalueBk=0;
        ch2totalvalueBk=0;
        ch3totalvalueBk=0;
        ch4totalvalueBk=0;
        ch5totalvalueBk=0;
        ch6totalvalueBk=0;
        ch7totalvalueBk=0;
        ch8totalvalueBk=0;

        ch1motor_flag=1;        //ch1 motor on
        Ch1FRSpeedValue=Trans_AngleToValue(i);

        ch2motor_flag=1;        //ch2 motor on
        Ch2FRSpeedValue=Trans_AngleToValue(i);

        ch3motor_flag=1;        //ch3 motor on
        Ch3FRSpeedValue=Trans_AngleToValue(i);

        ch4motor_flag=1;        //ch4 motor on
        Ch4FRSpeedValue=Trans_AngleToValue(i);

        ch5motor_flag=1;        //ch5 motor on
        Ch5FRSpeedValue=Trans_AngleToValue(i);

        ch6motor_flag=1;        //ch6 motor on
        Ch6FRSpeedValue=Trans_AngleToValue(i);

        ch7motor_flag=1;        //ch7 motor on
        Ch7FRSpeedValue=Trans_AngleToValue(i);

        ch8motor_flag=1;        //ch8 motor on
        Ch8FRSpeedValue=Trans_AngleToValue(i);


}

//===============================================
//      servo motor reset slow 程式
//===============================================
void ServoMotorResetSlow(void)
{
        unsigned char i=0;  //0度

        steptotalvalue=2;
        waittotalvalue=0;
        ch1totalvalue=i;
        ch2totalvalue=i;
        ch3totalvalue=i;
        ch4totalvalue=i;
        ch5totalvalue=i;
        ch6totalvalue=i;
        ch7totalvalue=i;
        ch8totalvalue=i;

}

void ProgramWaitTime(void)
{
//    waittotalvalueBk=waittotalvalue;
      do
      {
         if(waittotalvalue!=0)
         {
            while(time100ms_flag!=1);      //等待 100ms
             waittotalvalue--;
         }
            time100ms_flag=0;
       } while(waittotalvalue!=0);
//      waittotalvalue=waittotalvalueBk;
}
//----------------------------------------------------------------------------
