#include #include #include #include #include #include #define KEY_F1 0x1C #define KEY_F2 0x1D #define KEY_F3 0x1E #define KEY_F4 0x1F #define KEY_UP 0x1B #define KEY_DN 0x17 #define KEY_0 0x01 #define KEY_1 0x04 #define KEY_2 0x05 #define KEY_3 0x06 #define KEY_4 0x08 #define KEY_5 0x09 #define KEY_6 0x0a #define KEY_7 0x0c #define KEY_8 0x0d #define KEY_9 0x0e #define KEY_BS 0x0F #define KEY_PLUS 0x07 #define KEY_MINUS 0x0B #define KEY_Enter1 0x03 #define KEY_Enter2 0x13 unsigned uComPort,uBaseUart,uBaudRate,D_time_X=0; char szCmd[80],szResult[80],szKeys[16]; unsigned A,B,C,D,E,P,AA,BB,CC,DD,EE,PP; /* ---- main ------------------------------------------------------------- */ main() { char cChar; int iRet; uComPort=2; uBaudRate=9600; /* com 2 */ open_com(uComPort,uBaudRate); /* default */ for(;;) { printf("\n*--------- MMI Starter-Kit demo program -------------*"); show_status(); printf("\n* 0 : initial the MMI Starter_Kit program *"); printf("\n*----------------------------------------------------*"); printf("\n* 1 : PC Demo_1 --> Change Pages *"); printf("\n* 2 : PC Demo_2 --> A+B and B+C *"); printf("\n* 3 : PC Demo_3 --> show counter *"); printf("\n*----------------------------------------------------*"); printf("\n* C : change to PC mode *"); printf("\n* L : change to PLC mode *"); printf("\n* S : send and receive command *"); printf("\n* Q : quit *"); printf("\n*---------------- Press Keyword ---------------------*"); printf("\n"); if (D_time_X==0) delay_calibration(); /* PowerOn calibration once */ cChar=getche(); switch (cChar) { case '0': init(); break; case '1': pc_demo_1(); break; case '2': pc_demo_2(); break; case '3': pc_demo_3(); break; case 'c': case 'C': change_to_mode_1(); break; case 'l': case 'L': change_to_mode_3(); break; case 's': case 'S': pc_fun_s(); break; case 'q': case 'Q': goto ret_label; default : printf(" --> Error Keyword"); break; } } ret_label: printf("\n*--------- MMI Starter-Kit demo program -------------*"); } /* ---- delay calibration ------------------------------------------------ */ delay_calibration() { struct time t1,t2; int i; gettime(&t1); for(D_time_X=0; D_time_X<1000; D_time_X++) delay(10); gettime(&t2); i = t2.ti_sec - t1.ti_sec; if (i<0) i+=60; i *= 100; i += t2.ti_hund - t1.ti_hund; D_time_X = 1000/i + 1; } /* ---- show status ------------------------------------------------------ */ show_status() { printf("\n* STATUS : COM=%d,",uComPort); printf(" Baud_Rate=%5d *",uBaudRate); printf("\n*----------------------------------------------------*"); } /* ---- open_com -------------------------------------------------------- */ open_com(unsigned uPort, unsigned uBaudRate) { unsigned uVal,uCom; switch(uPort) { case 1 : uBaseUart=0x3f8; uCom=0; break; case 2 : uBaseUart=0x2f8; uCom=1; break; case 3 : uBaseUart=0x3e8; uCom=2; break; case 4 : uBaseUart=0x2e8; uCom=3; break; default: return 1; /* port must 1/2/3/4 */ } switch(uBaudRate) { case 1200 : uVal=0x83; break; case 2400 : uVal=0xA3; break; case 4800 : uVal=0xC3; break; case 9600 : uVal=0xE3; break; default : return 2; /* baud rate error */ } bioscom(0,uVal,uCom); return(0); } /* ---- function 0 -------------------------------------------------*/ init() { unsigned iRet,iPort,i1,i2,i3; printf(" --> (0):initial\n"); printf("COM port (1/2/3/4)="); scanf("%d",&i1); printf("Baudrate (1200/2400/4800/9600)="); scanf("%d",&i2); iRet=open_com(i1,i2); if (iRet==0) { printf("--> OK"); uComPort=i1; uBaudRate=i2; } else if (iRet==1) printf("--> port error"); else if (iRet==2) printf("--> baudrate error"); getch(); } /* ---- function 1 -------------------------------------------------*/ pc_demo_1() { int iRet; for (;;) { szResult[0]=0; iRet=send_and_receive("$00P00",szResult); /* page_0 */ printf("\nPage0, RetVal=%d, Result=%s, press any key to stop", iRet,szResult); D_delay(1000); if (kbhit()!=0) {getch(); return;} szResult[0]=0; iRet=send_and_receive("$00P01",szResult); /* page_1 */ printf("\nPage1, RetVal=%d, Result=%s, press any key to stop", iRet,szResult); D_delay(1000); if (kbhit()!=0) {getch(); return;} szResult[0]=0; iRet=send_and_receive("$00P02",szResult); /* page_2 */ printf("\nPage2, RetVal=%d, Result=%s, press any key to stop", iRet,szResult); D_delay(1000); if (kbhit()!=0) {getch(); return;} szResult[0]=0; iRet=send_and_receive("$00P03",szResult); /* page_3 */ printf("\nPage3, RetVal=%d, Result=%s, press any key to stop", iRet,szResult); D_delay(1000); if (kbhit()!=0) {getch(); return;} szResult[0]=0; iRet=send_and_receive("$00P04",szResult); /* page_4 */ printf("\nPage4, RetVal=%d, Result=%s, press any key to stop", iRet,szResult); D_delay(1000); if (kbhit()!=0) {getch(); return;} } } /* ---- function 2 -------------------------------------------------*/ pc_demo_2() { int iRet,key,i,j,k; char str[10]; szResult[0]=0; iRet=send_and_receive("$00P02",szResult); printf("\nPage2, RetVal=%d, Result=%s, press any key to stop", iRet,szResult); D_delay(300); A=1; B=2; C=3; D=A+B; E=B+C; P=1; AA=BB=CC=DD=EE=PP=0; for (;;) { if (A!=AA) {show_val_1(1,7,A); AA=A;} if (B!=BB) {show_val_1(3,7,B); BB=B;} if (C!=CC) {show_val_1(5,7,C); CC=C;} if (D!=DD) {show_val_1(2,20,D); DD=D;} if (E!=EE) {show_val_1(4,20,E); EE=E;} if (P!=PP) {show_cursor(P); PP=P;} if (KBHIT()!=0) { i=0; while (szKeys[i]!=0) { key=szKeys[i++]; switch(key) { case KEY_UP : P--; if (P<1) P=3; break; case KEY_DN : P++; if (P>3) P=1; break; case KEY_PLUS : key_plus(P); break; case KEY_MINUS: key_minus(P); break; case KEY_Enter1 : case KEY_Enter2 :break; } } D=A+B; E=B+C; } if (kbhit()!=0) {getch(); break;} } } show_val_1(int row, int col, int val) { char str[10]; int i,j; strcpy(szCmd,"$00T000 "); szCmd[4]=row+'0'; szCmd[5]=col/16+'0'; col=col%16; if (col>=10) szCmd[6]=col-10+'A'; else szCmd[6]=col+'0'; itoa(val,szCmd+7,10); for (i=0; i<11; i++) if (szCmd[i]==0) szCmd[i]=' '; /* sprintf(str,"%d",val); strcat(szCmd,str); */ send_and_receive(szCmd,szResult); D_delay(100); } show_cursor(int p) { if (PP!=0) { switch (PP) { case 1 : sprintf(szCmd,"$00T106 "); break; case 2 : sprintf(szCmd,"$00T306 "); break; case 3 : sprintf(szCmd,"$00T506 "); break; } send_and_receive(szCmd,szResult); D_delay(10); } switch (p) { case 1 : sprintf(szCmd,"$00T106>"); break; case 2 : sprintf(szCmd,"$00T306>"); break; case 3 : sprintf(szCmd,"$00T506>"); break; } send_and_receive(szCmd,szResult); D_delay(10); } KBHIT() { int i,k,iRet,key,key1,key2,j; k=0; iRet=send_and_receive("$00K",szResult); if (iRet==0) { j=4; while (szResult[j]!=0) { if (j==4) for (i=0; i<16; i++) szKeys[i]=0; key1=ascii_to_hex(szResult[j]); key2=ascii_to_hex(szResult[j+1]); key=key1*16+key2; szKeys[k++]=key; j+=2; iRet=1; } } return(iRet); } key_plus(int p) { switch(p) { case 1 : A++; break; case 2 : B++; break; case 3 : C++; break; } } key_minus(int p) { switch(p) { case 1 : A--; break; case 2 : B--; break; case 3 : C--; break; } } /* ---- function 3 -------------------------------------------------*/ pc_demo_3() { int iRet,i,j,key,key1,key2; char str[4],show; szResult[0]=0; iRet=send_and_receive("$00P03",szResult); printf("\ndemo_3, RetVal=%d, Result=%s, press any key to stop", iRet,szResult); D_delay(300); sprintf(szCmd,"$00T500PC Demo 3,NO UP/DW"); iRet=send_and_receive(szCmd,szResult); printf("\ndemo_3, RetVal=%d, Result=%s, press any key to stop", iRet,szResult); i=0; for (;;) { show_counter: sprintf(szCmd,"$00T20A"); sprintf(str,"%d",i); strcat(szCmd,str); iRet=send_and_receive(szCmd,szResult); printf("\ndemo_3, RetVal=%d, Result=%s, press any key to stop", iRet,szResult); D_delay(100); iRet=send_and_receive("$00K",szResult); if (iRet==0) { j=4; while (szResult[j]!=0) { key1=ascii_to_hex(szResult[j]); key2=ascii_to_hex(szResult[j+1]); key=key1*16+key2; printf("\nReceive KEY_CODE=%x",key); show=0; if (key==KEY_F1) {i=100; show=1;} else if (key==KEY_F2) {i=200; show=1;} else if (key==KEY_F3) {i=300; show=1;} else if (key==KEY_F4) {i=400; show=1;} if (show==1) goto show_counter; j+=2; } } i++; D_delay(1000); if (kbhit()!=0) {getch(); break;} } } ascii_to_hex(char ascii) { if (ascii<'0') return(0); else if (ascii<='9') return(ascii-'0'); else if (ascii<'A') return(0); else if (ascii<='F') return(ascii-'A'+10); else if (ascii<'a') return(0); else if (ascii<='f') return(ascii-'a'+10); } /* ---- function S ------------------------------------------------- */ pc_fun_s() { int iRet; printf("\nCommand="); scanf("%s",szCmd); iRet=send_and_receive(szCmd,szResult); if (iRet==0) printf("Send Command OK, Receive =%s",szResult); else if (iRet==1) printf("Send Command TimeOut"); else if (iRet==2) printf("Receive Result TimeOut"); else printf(" --> Error ?"); getch(); } send_and_receive(char szCmd[], char szResult[]) { int i; float f1,fTimeOut; char c; fTimeOut=1000000.0; f1=0; i=0; for (;;) { if ((inportb(uBaseUart+5)&0x20)!=0) /* check line ready */ { outportb(uBaseUart,szCmd[i]); if (szCmd[++i]==0x0) break; /* cmd end ? */ f1=0; /* reset the timeout timer */ } else { f1++; if (f1>fTimeOut) return(1); /* timeout control */ } } while ((inportb(uBaseUart+5)&0x20)==0); /* wait until ready */ outportb(uBaseUart,0x0d); i=0; f1=0; for (;;) { if ((inportb(uBaseUart+5)&0x01)!=0) /* check line ready */ { c=inportb(uBaseUart)&0xff; if (c==0x0d) break; /* wait until 0x0d */ szResult[i++]=c; /* save the output string */ f1=0; /* reset the timeout timer */ } else { f1++; if (f1>fTimeOut) return(2); /* timeout control */ } } szResult[i]=0; /* string must terminated by 0 */ return(0); } /* ---- delay ------------------------------------------------- */ D_delay(unsigned int delay_time) { unsigned i; for(i=0; i