?? menupro.c
字號:
//深圳之行 要解決的事情 // RTC時鐘是否正確 // 光標 // BMP圖形顯示 // 網口測試 // 掉電,關機 // 標準鍵盤可用? // minicom窗口漢字顯示 // 熱敏打印機可靠?訪問文件可靠? //MenuPro.c #include <time.h> #include "pos.h" #include "MenuPro.h" //typedef unsigned char BYTE; typedef unsigned int WORD; typedef unsigned long DWORD; extern struct tm *glb_now; //顯示 菜單,等待用戶選擇 //按下ESC,返回-1 //按下CR,返回被選中的菜單號( 0 -- ScrLines-1)WORD MenuDisplay(BYTE *MenuTxt,int ScrLines,int DispPosition ) { int cnt,MenuLine,ScrLine,TopLine,ScrCnt,t_cnt=0; WORD KeyVal; BYTE BorW; char d_buf[32]; char DateTimeStr[32]; int cc = 0,dp=0,ItemLen = 15; //ItemLen 可以作為函數參數,由調用者根據菜單寬調整ItemLen dp = DispPosition * 8; //計算顯示 左邊界 ScrCnt = (ScrLines>3)? 3:ScrLines; //if(NeedSaveLcd) //{ // allocate memory for string // ScrSaveMem = (char *)malloc(2048); //申請內存 // LCD_ScreenSave(0,0,8,16,ScrSaveMem); //保存全屏 //}else{ //LCD_Init(); //LCD_Clear('W'); //'W'->白底黑字/'B'->黑底白字 //LCD6963_ClearScreen(); //LCD 軟件初始化 //} LCD_SubScrClr(0,0,13*4-1,192,'W'); //清部分屏幕 //劃出窗口邊線 LCD_DrawH_Line(7,dp + 8,dp+119,'W'); LCD_DrawH_Line(49,dp + 8,dp+119,'W'); LCD_DrawV_Line(8,dp+7,49,'W'); LCD_DrawV_Line(8,dp+120,49,'W'); KeyVal = 0x11; MenuLine = 0; //當前反白顯示的菜單項 TopLine = 0; //屏幕第一行對應的菜單項 ScrLine = 0; //反白項在屏幕上的行 //在窗口內顯示前三行內容 BorW = 1; //dp = DispPosition; for(cnt = 0;cnt<ScrCnt;cnt++) { LCD_DisplayOneLine(1+cnt*2,dp+20,(BYTE *)(MenuTxt+cnt*ItemLen),'D',BorW,0); //第一行反白顯示 BorW = 0; } do { if(KB_GetStatus()) KeyVal = KB_GetValue(); else KeyVal = 0x11; usleep(25000); t_cnt++; if( t_cnt == 4 ){ //間隔一秒顯示:日期時間 (當時間為一個整十秒時,顯示當前發票號) GetTimeAndDate( DateTimeStr ); //2004/02/01 12:22:00 if( DateTimeStr[18]=='0' ) DisplayInvNoStr(); //LCD_DisplayOneLine( 8, 0,InvoiceDataBuf.CurCode,'D',1,0 ); //反白顯示 else { //LCD_DisplayOneLine( 8, 0,(unsigned char *)&DateTimeStr[11],'D',1,0 ); //反白顯示 LCD_DisplayOneLine( 8, 0,(unsigned char *)&DateTimeStr[2],'D',1,0 ); //反白顯示 } t_cnt = 0; } if( KeyVal == 0xf0 || KeyVal == 0x11 ) continue; //printf("\nThe KB ->%x,%d",KeyVal,cc++); //WatchdogReset(); //Resets the watchdog timer periodically to prevent timeout. switch (KeyVal) { case K_UP: case K_LEFT: if(MenuLine==0) ; //MenuLine == 0 不動 else { MenuLine -= ((MenuLine-1)<0)? 0:1; //min == 0 ScrLine -= (ScrLine==0)? 0:1; //min == 0 本行應反白 TopLine = (ScrLine==0)? MenuLine:TopLine; for(cnt=0;cnt<ScrCnt;cnt++) { BorW = (ScrLine==cnt)? 1:0; LCD_DisplayOneLine(1+cnt*2,dp+20,(BYTE *)(MenuTxt+(TopLine+cnt)*ItemLen),'D',BorW,0); } } break; case K_DN: case K_RIGHT: if(MenuLine == ScrLines-1) ; //MenuLine == ScrLine 不動 else { MenuLine += ((MenuLine+1)==ScrLines)? 0:1; //max == ScrLies ScrLine += (ScrLine==2)? 0:1; //max == 2 本行應反白 if(MenuLine>2) TopLine = MenuLine - ScrLine; //-2; for(cnt=0;cnt<ScrCnt;cnt++) { BorW = (ScrLine==cnt)? 1:0; LCD_DisplayOneLine(1+cnt*2,dp+20,(BYTE *)(MenuTxt+(TopLine+cnt)*ItemLen),'D',BorW,0); } } break;// MenuLine = 0; //當前反白顯示的菜單項// TopLine = 0; //屏幕第一行對應的菜單項// ScrLine = 0; //反白項在屏幕上的行 case K_HOME: if(ScrLines > 3) {MenuLine = 0; //max == ScrLies ScrLine = 0; //max == 2 本行應反白 TopLine = 0; //-2; for(cnt=0;cnt<ScrCnt;cnt++) { BorW = (ScrLine==cnt)? 1:0; LCD_DisplayOneLine(1+cnt*2,dp+20,(BYTE *)(MenuTxt+(TopLine+cnt)*ItemLen),'D',BorW,0); } } break; case K_END: if(ScrLines > 3) {MenuLine = ScrLines-1; //max == ScrLies ScrLine = 2; //max == 2 本行應反白 TopLine = MenuLine - ScrLine; for(cnt=0;cnt<ScrCnt;cnt++) { BorW = (ScrLine==cnt)? 1:0; LCD_DisplayOneLine(1+cnt*2,dp+20,(BYTE *)(MenuTxt+(TopLine+cnt)*ItemLen),'D',BorW,0); } } break; case K_PGDN: if(ScrLines > 3) {if(TopLine + 3 > ScrLines - 3) MenuLine = ScrLines - 3; else MenuLine = TopLine + 3; //max == ScrLies-3 ScrLine = 0; //max == 2 本行應反白 if(MenuLine>2) TopLine = MenuLine - ScrLine; //-2; for(cnt=0;cnt<ScrCnt;cnt++) { BorW = (ScrLine==cnt)? 1:0; LCD_DisplayOneLine(1+cnt*2,dp+20,(BYTE *)(MenuTxt+(TopLine+cnt)*ItemLen),'D',BorW,0); } } break; case K_PGUP: if(ScrLines > 3) {if(TopLine - 3 < 0) //MenuLine == 0 不動 MenuLine = 0; else MenuLine = TopLine - 3; //min == 0 ScrLine = 0; //min == 0 本行應反白 TopLine = (ScrLine==0)? MenuLine:TopLine; for(cnt=0;cnt<ScrCnt;cnt++) { BorW = (ScrLine==cnt)? 1:0; LCD_DisplayOneLine(1+cnt*2,dp+20,(BYTE *)(MenuTxt+(TopLine+cnt)*ItemLen),'D',BorW,0); } } break; default: break; } //遇到 回車/ESC鍵 退出 }while(!(KeyVal == K_CR || KeyVal == K_CR_1 || KeyVal == K_ESC)); //按下CR/ESC結束菜單選擇 //if(NeedSaveLcd) //{ LCD_ScreenRestore(0,0,8,16,ScrSaveMem); //恢復屏幕 // free memory // free(ScrSaveMem); //釋放內存 //} if( KeyVal == K_ESC) { MenuLine = -1; printf("\n%s\n","User press ESC key ."); } //按下ESC,返回-1 else //printf("\nSelect Menu No:%d->%s\n",MenuLine,MenuTxt+MenuLine*ItemLen); memset(d_buf,0,17); sprintf(d_buf,"Select ITEM %d",MenuLine ); LCD44780_Display( d_buf ); return MenuLine; }//progmar startvoid Main_Menu( void ){ char ret; int choose0,loop; //需要時建立 /ramdisk/PosDef.ini 文件 if( kds_MakeFirstInitFile()==0 ) printf("\nTne INI file create sucesseful ! \n"); WelcomScreen(); //顯示 歡迎信息 TaxStatusReadFromPosDefIni(); //從 PosDef.ini 文件讀出稅控狀態內容 TaxStatusDisplay(); //在 狀態行 顯示 "稅控 正常 紙卷" ...... InvoiceStructDisplay(); //顯示 發票截止號,當前發票號 ShowTimeAndDate(); glb_now->tm_hour=8; glb_now->tm_min=0; glb_now->tm_sec=0; glb_now->tm_year=2004-START_YEAR;// linux date start at year 1900 glb_now->tm_mon=5-START_MONTH; // 0 to 11 glb_now->tm_mday=22; // 1 to 31 InitDate_1(); //設置日期時間 /* //測試 for(loop=0;loop<6;loop++) { ShowTimeAndDate(); sleep(1); //延時一秒 } */ printf("Application Start up .\n"); while( 1 ) { TaxStatusDisplay(); //在 狀態行 顯示 "稅控 正常 紙卷" ...... choose0 = MenuDisplay((BYTE *)Menu_0,6,0);// 發送菜單并顯示并得到返回值 switch ( choose0 ) { case 0: Main_0_MenuPro(); //本機設置 break; case 1: Main_1_MenuPro(); //商業收款 break; case 2: Main_2_MenuPro(); //稅控開票 break; case 3: Main_3_MenuPro(); //稅控功能 break; case 4: Main_4_MenuPro(); //刷銀行卡 break; case 5: Main_5_MenuPro(); //退出應用 break; } //end switch } //end while}int Main_0_MenuPro( void ) { int choose0; /* char aa[32]; //只是為了測試函數 KB_NumStrInput() LCD_Clear( 'W' ); LCD_DisplayOneLine(0,0,(BYTE *)"測試",'D',1,0); //反白顯示 KB_NumStrInput( 0,4,10,'D',10,0,aa,1 ); */ do{ choose0 = MenuDisplay((BYTE *)Main_0_Menu,6,2); if( choose0 == -1 ) break; switch ( choose0 ) { case 0: Main_0_0_MenuPro(); //系統參數 break; case 1: Main_0_1_MenuPro(); //網絡參數 break; case 2: //Main_0_2_MenuPro(); //商品類別 break; case 3: //Main_0_3_MenuPro(); //商品明細 break; case 4: Main_0_4_MenuPro(); //稅控參數 TaxCtrl.c break; case 5: //Main_0_5_MenuPro(); //設銀聯卡 break; }//end switch }while(1); return 0;} int Main_0_0_MenuPro( void ) { int choose0; do{ choose0 = MenuDisplay((BYTE *)Main_0_0_Menu,6,8); if( choose0 == -1 ) break; switch ( choose0 ) { case 0: //Main_0_0_0_MenuPro(); //設串口參數 Ex:COM1-9600,n,8,1;COM2-115200,n,8,1 break; case 1: //Main_0_0_1_MenuPro(); //設備與串口 Ex:COM1-Modem,COM2-PinPad,COM3-... break; case 2: //Main_0_0_2_MenuPro(); //熱敏打印機 Ex:有/無 break; case 3: //Main_0_0_3_MenuPro(); //稅控打印機 Ex:EPSON/Star/... break; case 4: //Main_0_0_4_MenuPro(); //調整電子鐘 break; case 5: //Main_0_0_5_MenuPro(); //設置調試態 //將COM_0設置/取消 debug status break; }//end switch }while(1); return 0;} int Main_0_1_MenuPro( void ) { int choose0; do{ choose0 = MenuDisplay((BYTE *)Main_0_1_Menu,4,8); if( choose0 == -1 ) break; switch ( choose0 ) { case 0: //Main_0_1_0_MenuPro(); //設置本機地址 Ex:192.168.0.100 break; case 1: //Main_0_1_1_MenuPro(); //設置網絡掩碼 Ex:255.255.255.0 break; case 2: //Main_0_1_0_MenuPro(); //設置網關地址 break; case 3: //Main_0_1_1_MenuPro(); //設代理服務器 break; }//end switch }while(1); return 0;}/*struct tm{int tm_sec;int tm_min;int tm_hour;int tm_mday;int tm_mon;int tm_year;int tm_wday;int tm_yday;int tm_isdst;};*/ //商業收款int Main_1_MenuPro( void )
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -