⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 init_test.c

📁 银杏科技有限公司dsp实验开发板的实验程序
💻 C
字号:
#include <string.h>
#include <stdio.h>
/*
 *  ======== main ========
 */

int s;
char *b;

char key_buffer[8][6];
char key_num=0;

#define  UART_COUNTER  0x62
#define  KEYIN_COUNTER 0X61
#define  LCD_SIZE      23
#define  KEY_SIZE      6
#define  LED_SIZE      14

ioport unsigned port8000;     /*  for CTRL word */
ioport unsigned porte000;     /*  for DC MOTOR run */
ioport unsigned portc000;     /*  for LEDs show */
ioport unsigned portf000;     /*  for STEPMOTOR */

unsigned int  CtrlWord=0;
char LCD_Buffer[LCD_SIZE]=
      {0x55,0x66} ;          /* LCD SHOW's buffer */
char KEY_Buffer[KEY_SIZE];   /* KEY INPUT's buffer */
int  Iskey=0; 			     /* if Iskey!=0,then have KEY in */
                             /* its high 8 bits are key code ! */
char LED_Buffer[LED_SIZE]=
      {0x55,0x77};           /* LED SHOW's buffer */                             
int  NowLine=1,NowCol=0;
int  IsQuitKey=0;            /*  if == 1, quit key input */				

unsigned int  chk_prog28000(void);
unsigned int  chk_data8000(void);
void u_printf(char *buf,int size);
void key_input(char *buf,int size);
void pllx100();
void pllx10();
void speak(int length,int flag);

int test()
{
   int i;
   
   i=0;
   
   return(i);
}
   
void mydelay()
{    /*  when clkout=10MHz, about 0.2s  */
   int i,j;

   for(i=0;i<500;i++)
     for(j=0;j<1000;j++);

}

void mydelay1()
{    /*  when clkout=10MHz, about 0.2s  */
   int i,j;

     for(j=0;j<1000;j++);

}


void error_sound(int error)
{

    if(error==1)
    {  speak(2000,1);mydelay();  } 
    else
    {  speak(7500,1);mydelay();
       speak(7500,1);mydelay();  }

}

int is_getkey(void)
{  int i;

    if(( KEY_Buffer[0] == 'k') && (KEY_Buffer[5] == 0x0d))    
    {   Iskey=((KEY_Buffer[4] & 0xff) << 8 );
        Iskey |= (KEY_Buffer[3] & 0xff);
        for(i=0;i<6;i++)
           KEY_Buffer[i]=0;     /*  clear key buffer */
    }    
    return(Iskey);      /*  return key code, low 8 bit is code  */                                                 


}
int get_key(int iswait)
{ volatile int *addr_counter;
  int i;
    
    Iskey=0;
    key_input(&KEY_Buffer[0],6);
    if(iswait == 0)     /*  if iswait==1, then must wait for rev end,
                            else return direct !   */
       return(Iskey);      /*  return key code  */                                                 
  
    addr_counter = (int *)KEYIN_COUNTER;  
    while( *addr_counter);  /*  wait for a key input... */
    
    strcpy(key_buffer[key_num++],KEY_Buffer);
    
      if(( KEY_Buffer[0] == 'E') && (KEY_Buffer[5] == 0x0d))    
    {   Iskey=((KEY_Buffer[4] & 0xff) << 8 );
        Iskey |= (KEY_Buffer[3] & 0xff);
        for(i=0;i<6;i++)
           KEY_Buffer[i]=0;     /*  clear key buffer */
    }    
    else
    {
        for(i=0;i<6;i++)
           KEY_Buffer[i]=0;     /*  clear key buffer */
        //mydelay();
    }    
    return(Iskey);      /*  return key code, low 8 bit is code  */                                                 

}



int lcd_printf(int ln, int col, char *buf, int iswait)
{   volatile int *addr_counter;
    
    addr_counter = (int *)UART_COUNTER;
    
    LCD_Buffer[2]=ln;     /*  which LN will show the string */
    LCD_Buffer[3]=col;    /*  which COL will show string */
    LCD_Buffer[4]=strlen(buf)/2;  /* how many chinese char(2 byte) will show */
    
    memcpy(&LCD_Buffer[5],buf, LCD_Buffer[4]*2);
    
    LCD_Buffer[21]=0x88;
    LCD_Buffer[22]=0x99;
    
    u_printf(&LCD_Buffer[0],23);
    
    if(iswait == 1)     /*  if iswait==1, then must wait for send end,
                            else return direct !   */

      while( *addr_counter);
    
    return( *addr_counter);  /*  return number of left char will not send  */                                                 
}

int led_printf(char *buf, int iswait)
{   volatile int *addr_counter;
    int j;
    
    addr_counter = (int *)UART_COUNTER;
    
                         /* if buf="", clr LED */
    for(j=0;j<8;j++)
    {  if(*buf == '\0')
            LED_Buffer[11-j]=0xf;
        else
        {  if( *buf == ' ')
           {  LED_Buffer[11-j]=0xf; buf++; }
           else
           {  if( *buf <= '9') 
                  LED_Buffer[11-j]= *buf++ & 0xf;
              else
                  LED_Buffer[11-j]= *buf++-'a'+0xa;    
           }
         }         
    }        
           
    LED_Buffer[12]=0x88;
    LED_Buffer[13]=0x99;
    
    u_printf(&LED_Buffer[0],14);
    
    if(iswait == 1)     /*  if iswait==1, then must wait for send end,
                            else return direct !   */

      while( *addr_counter);
    
    return( *addr_counter);  /*  return number of left char will not send  */                                                 
}

void key_shown(char key)
{  char buf[3];
   int  noshow=0;
   
   switch(key)
   {  
       case 59:   /*  ESC */
           IsQuitKey=1;
           return;
       case 60:   /*  '4'  */
           strcpy(buf,"4");
           break; 
       case 61:        
           strcpy(buf,"8");
           break; 
       case 62:        
           strcpy(buf,"C");
           break; 
       case 51:   /*  '1' */
           strcpy(buf,"1");
           break;
       case 52:   /*  '5'  */
           strcpy(buf,"5");
           break; 
       case 53:   /* '9' */     
           strcpy(buf,"9");
           break; 
       case 54:        
           strcpy(buf,"D");
           break;
       case 43:   /*  '2' */
           strcpy(buf,"2");
           break;
       case 44:   /*  '6'  */
           strcpy(buf,"6");
           break; 
       case 45:   /* 'a' */     
           strcpy(buf,"A");
           break; 
       case 46:        
           strcpy(buf,"E");
           break;                 
       case 35:   /*  '3' */
           strcpy(buf,"3");
           break;
       case 36:   /*  '7'  */
           strcpy(buf,"7");
           break; 
       case 37:   /* 'b' */     
           strcpy(buf,"B");
           break; 
       case 38:        
           strcpy(buf,"F");
           break;                 
       case 29:   /*  '+' */
           strcpy(buf,"+");
           break;
       case 21:   /*  '-'  */
           strcpy(buf,"-");
           break; 
       case 13:   /* 'x' */     
           strcpy(buf,"X");
           break; 
       case 5:        
           strcpy(buf,"/");
           break;                 
       case 30:   /*  '0' */
           strcpy(buf,"0");
           break;
       case 22:   /*  '.'  */
           strcpy(buf,".");
           break; 
       case 14:   /* ';' */     
           strcpy(buf,":");
           break; 
       case 6:    /*  RUN key  */    
           noshow=1;
           break; 
       default:
           noshow=1;
           break;                    
                            
    }       
    
    if( noshow == 1)
       return;
                       
    lcd_printf(NowLine,NowCol,buf,0);
   // mydelay1();    /* wait MCU to shown */
    NowCol++;
    if((NowCol%8) == 0)
    {  NowCol=0; NowLine++;  } 
}      
 
void lcd_clr(int iswait)
{   volatile int *addr_counter;
    
    addr_counter = (int *)UART_COUNTER;
    
    LCD_Buffer[2]=0xff;  
    LCD_Buffer[3]=0xff;    
    LCD_Buffer[4]=0xff;  
    
    LCD_Buffer[21]=0x88;
    LCD_Buffer[22]=0x99;
    
    u_printf(&LCD_Buffer[0],23);
    
    if(iswait == 1)     /*  if iswait==1, then must wait for send end,
                            else return direct !   */
      while( *addr_counter);
    
}

int test_mem(int allmem)
{  int memok,test_ret;

   pllx100();		/*  change clk=100MHz  */
   
   
   switch(allmem)
   {
      case 0:       /*  check all mem !  */
              
      case 1:       /*  only check PROGRAM 18000h  */
              
      case 2:       /*  only check PROGRAM 28000h  */
              memok=chk_prog28000();
              if(memok == 1)
                 test_ret=1;      /*  prog 28000h is ok ! */
              else
                 test_ret=-2;     /*  prog 28000h maybe error */   
              break;
      case 3:       /*  only check DATA SRAM 8000h */
              memok=chk_data8000();
              if(memok == 1)
                 test_ret=1;      /*  data 8000h is ok ! */
              else
                 test_ret=-3;     /*  data 8000h maybe error */   

              break;
      default:
              test_ret=0;      /*  return 0, not check the mem !  */                       
   }
   
   pllx10();
   return(test_ret);      
}

void test_DCmotor()
{ int i,j,k;

   CtrlWord |= 0x1;         /* make D0=1  */
   port8000=CtrlWord;       /* start DC MOTOR power */
   
   i=lcd_printf(3,0,"摆动",1);   /*  wait for send end ! */
   for(i=0;i<20;i++)       /*  right and left */
   {
      porte000=0;
      mydelay();
      porte000=1;
      mydelay();
   }   
   
   i=lcd_printf(3,2,"正转",1);
   porte000=1;              /*  rotate + for 5s  */
   for(i=0;i<25;i++)       /* delay about 5s  */
     mydelay();
   
   i=lcd_printf(3,4,"反转",1);
   porte000=0;
   for(i=0;i<25;i++)       /*   rotate - for 5s   */
     mydelay();
     

   for(i=0;i<4;i++)
   {
      porte000=0;
      mydelay();
      porte000=1;
      mydelay();
   }   

   i=lcd_printf(3,6,"慢转",1); 
   for(k=0;k<4;k++)          /* rotate slowly  */
     for(i=0;i<1000;i++)
     {   porte000=1;        
         for(j=0;j<10000;j++);
         porte000=0;
         for(j=0;j<1300;j++);
       
     }    
     
   CtrlWord &= 0xfffe;      /*  make D0=0;  */
   port8000=CtrlWord;        
}

void test_stepmotor()
{  int motor,i,j,k;

   i=lcd_printf(3,1,"反转. ",1);
   for(i=0;i<5;i++)
   {
      motor=1;
      for(j=0;j<4;j++)
      {   
         portf000=motor;     /*  send drive pluse to motor */ 
         motor=motor<<1;
         for(k=0;k<5;k++)    /*  delay */
            mydelay();
      }      
   }
   
   i=lcd_printf(3,5,"正转. ",1); 
   for(i=0;i<5;i++)
   {
      motor=0x8;
      for(j=0;j<4;j++)
      {   
         portf000=motor;     /*  send drive pluse to motor */ 
         motor=motor >> 1;
         for(k=0;k<5;k++)    /*  delay */
            mydelay();
      }      
   } 
 

}

void test_led()
{   int led=0,i=0,j=0;

    for(i=0;i<5;i++)    /* all LEDs flash 5 times  */
    {
       portc000=0;
       mydelay();
       portc000=0xffff;
       mydelay();
    }   
    
    for(j=0;j<5;j++)   /*  LEDs bright one by one  */
    {
       portc000=0;     /*  shut down all led ! */
       led=1;
 
       for(i=0;i<16;i++)
       { 
          portc000=led;     /*  bright one LED */
          mydelay();        /*  delay 0.5 s  */  
          portc000=0;
          led=led << 1;
       }
    } 

    for(i=0;i<5;i++)        /*  flash all again */
    {
       portc000=0;
       mydelay();
       portc000=0xffff;
       mydelay();
    }   

    portc000=0;         /*  close all LEDs  */              
}
    
   
void main()
{  int i,key,j;
    
        
    /* pllx100();  */

    init_start();
 
    lcd_clr(1);    /*  clear LCD display  */
 
    for(i=0;i<5;i++)
    {
    led_printf("",1);
    mydelay();
    led_printf("83207537",1);
    mydelay();
    }
    
    led_printf("",1);
    mydelay();        /*  give MCU time to end clearing LED */ 
/*    i=lcd_printf(1,0,"1",1);
    mydelay();
    strcpy(buf,"1 ");
    lcd_printf(2,0,buf,1);
*/          
    i=lcd_printf(1,0,"你好,银杏科技 !",1);   /*  wait for send end ! */
    mydelay();
    
    i=lcd_printf(2,0,"下面测试键盘:",1);
    mydelay();
    
    i=lcd_printf(3,0,"请依次按下所有键",1);   /*  wait for send end ! */
    mydelay();  
    
    i=lcd_printf(4,0,"      ESC退出",1);
    mydelay();

    for(i=0;i<32;i++)
    {   
        do{
            key=get_key(1);
          }while(key==0);
        
       for(j=0;j<1;j++)  
          mydelay1();           /*  wait for MCU ... */
        
        if(i==0)
        {   mydelay();
            lcd_clr(1);           /*  clear LCD display */ 
            mydelay();
            
        }          
        
        key_shown(key & 0xff);

        if(IsQuitKey ==1 )
           break;
        
      }    
    
    lcd_clr(1);    /*  clear LCD display  */
    mydelay();

    i=lcd_printf(1,0,"正在测试存储器,",1);   /*  wait for send end ! */
    mydelay();
    i=lcd_printf(2,0,"请稍候. . . ",1);   /*  wait for send end ! */
    mydelay();
    

    i=test_mem(2);		 /*  test ext_sram ok? PROG-28000h */
                         /*  if return=1, then ext_sram ok ! */
    error_sound(i);		/* if ok, one shot sound, then two long sound */
    
    i=test_mem(3);       /*  test ext_sram ok ? data-8000h  */
    error_sound(i);		/* if ok, one shot sound, then two long sound */
                         
    lcd_clr(1);    /*  clear LCD display  */
    mydelay();
    i=lcd_printf(1,0,"正在测试直流电机",1);   /*  wait for send end ! */
    mydelay();
    i=lcd_printf(2,0,"请稍候. . . ",1);   /*  wait for send end ! */
    mydelay();
    test_DCmotor();      /*  drive DC motor to run */

    lcd_clr(1);    /*  clear LCD display  */
    mydelay();
    i=lcd_printf(1,0,"正在测试步进电机",1);   /*  wait for send end ! */
    mydelay();
    i=lcd_printf(2,0,"请稍候. . . ",1);   /*  wait for send end ! */
    mydelay();
    test_stepmotor();    /*  drive stepmotor run */

    lcd_clr(1);    /*  clear LCD display  */
    mydelay();
    i=lcd_printf(1,0,"正在测试交通灯",1);   /*  wait for send end ! */
    mydelay();
    i=lcd_printf(2,0,"请稍候. . . ",1);   /*  wait for send end ! */
    test_led();          /*  flash the 16s led one by one */
    
    i=lcd_printf(4,2,"测试完毕!",1);   /*  wait for send end ! */

    while(1)
    {
       speak(1000,1);
       for(i=0;i<20;i++)
          mydelay();
    }          
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -