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