📄 init_test.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 + -