?? lcd.lst
字號:
233 3 intbuf[++c]=inum%t+'0';
234 3 intbuf[++c]=' ';
235 3 goto putmes;
236 3 }
237 2 if(inum<t&flag)
238 2 continue;
C51 COMPILER V8.08 LCD 11/29/2007 11:29:41 PAGE 5
239 2 else {
240 3 flag=0;
241 3 intbuf[c]=inum/t;
242 3 inum-=(long)(intbuf[c]) * t;
243 3 intbuf[c]+='0';
244 3 c++;
245 3 }
246 2 }//以上部分是將puti()函數重新寫一次,但不給數組加結束符
247 1 putmes:
248 1 for(k=c;*str!='\0';k++){//以下為數組復制的算法
249 2 intbuf[k]=*str;
250 2 str++;
251 2 if(*str==' '){
252 3 intbuf[++c]='\0';
253 3 break;
254 3 }
255 2 }
256 1 intbuf[k]='\0';//intbuf數組復制完畢
257 1 showline(intbuf,page);//顯示行控制
258 1 }
259 void showline(uchar *str,bit page){//page值為0,顯示第一行,page為1,顯示第二行
260 1 uchar idata k;
261 1 if(page==0){//控制顯示在第幾行是通過k的地址不同來實現的
262 2 for(k=0x80;k<0x90;k++){
263 3 if(*str=='\0'){//*str的指針不下移,會執行到k=0x8f為止
264 4 sendc(k);
265 4 sendd(' ');//顯示空格清掉上次顯示部分
266 4 }
267 3 else{
268 4 sendc(k);
269 4 sendd(*str);
270 4 str++;
271 4 }
272 3 }
273 2 }
274 1 if(page==1){
275 2 for(k=0xc0;k<0xd0;k++){
276 3 if(*str=='\0'){
277 4 sendc(k);
278 4 sendd(' ');
279 4 }
280 3 else {
281 4 sendc(k);
282 4 sendd(*str);
283 4 str++;
284 4 }
285 3 }
286 2 }
287 1 }
288 void showpage(uchar *str,uchar *show){//顯示整屏
289 1 showline(str,0);//str顯示在第一行
290 1 showline(show,1);//show顯示在第二行
291 1 }
292 uchar scankey(){//掃描鍵值函數
293 1 uchar c;
294 1 SFRPAGE=0X0F;
295 1 c=P5;
296 1 c=c&0xf8;//電路中有按鍵按下是低電平
297 1 if(c==0x0f8)
298 1 return(0);
299 1 delay1ms(20);
300 1 switch(c){
C51 COMPILER V8.08 LCD 11/29/2007 11:29:41 PAGE 6
301 2 case 0xd8:
302 2 return 4;
303 2 case 0xe8:
304 2 return 2;
305 2 case 0xf0:
306 2 return 3;
307 2 case 0xb8:
308 2 return 1;
309 2 case 0x78:
310 2 return 5;
311 2 default: return 0;//此行事實上包含了對串鍵的處理
312 2 }
313 1 }
314 uchar menu_sec(uchar *menuname,uchar code *menu,uchar menu_num){
315 1 /*菜單選擇控制,菜單可在code數組中定義,menu_num為菜單項數,menulenth為菜單一項的長度*/
316 1 char idata c,i=0;
317 1 showline(menuname,0);//菜單翻頁中menumame是不隨著翻動的
318 1 showline(&(menu[i*menulenth]),1);
319 1 for(;;){
320 2 c=scankey();
321 2 if(c==0)
322 2 continue;
323 2 if(c==1){//下翻頁操作
324 3 i++;
325 3 if(i>=menu_num)//i值上溢處理
326 3 i=0;
327 3 showline(&(menu[i*menulenth]),1);
328 3 }
329 2 if(c==3){//上翻頁操作
330 3 i--;
331 3 if(i<0)//i值下溢處理
332 3 i=menu_num-1;
333 3 showline(&(menu[i*menulenth]),1);
334 3 }
335 2 if(c==4)
336 2 return -1;//作為exit鍵
337 2 if(c==5)
338 2 return -2;//預想作為快捷鍵
339 2 if(c==2){//確定鍵處理
340 3 //此程序有待用戶改進
341 3 return i;
342 3 }
343 2 for(c=0;c<3;c++)//完成一次掃描后給一定的延時
344 2 delay1ms(100);
345 2 }
346 1 }
347 int getint(){
348 1 getdata();
349 1 return (atoi(keybuf));//調用的是系統函數,將字符串轉化成int型數據
350 1 }
351 float getfloat(){
352 1 getdata();
353 1 return (atof(keybuf));//調用的是系統函數,將字符串轉化成float型數據
354 1 }
355 void getdata(){//取鍵盤+LCD輸入值,可取16個字節長度的字符串
356 1 char xdata i,j,t,flag;
357 1 uchar k,c;
358 1 keystart:
359 1 flag=0;
360 1 for (k=0;k<16;k++){//先將緩沖區清零,以免把歷史數據當成目前數據
361 2 keybuf[k]='\0';
362 2 }
C51 COMPILER V8.08 LCD 11/29/2007 11:29:41 PAGE 7
363 1 showline(keybuf,1);//將輸入值回顯在第二行,以方便即時矯正
364 1 i=0;
365 1 j=0;
366 1 showline(disdata[i],0);//顯示供選擇輸入的字符
367 1 curshow;//顯示光標
368 1 home;//回首位,作為初始狀態
369 1 for(;;){
370 2 do{
371 3 k=scankey();
372 3 if(k==0)
373 3 t=-1;
374 3 }while(!k);//有按鍵按下時判斷是否為有效按鍵,若不是,一直等待
375 2 if(k==1){//下翻頁鍵使之光標下移
376 3 j++;
377 3 toup;
378 3 t=-1;
379 3 if(j>15){//按鍵按過頭后要翻到下一頁顯示,且使光標顯示在首位
380 4 j=0;
381 4 i++;
382 4 if(i>DISROW)
383 4 i=0;
384 4 showline(disdata[i],0);
385 4 curshow;
386 4 home;
387 4 }
388 3 }
389 2 if(k==2){
390 3 //確定鍵,使光標所在位置的字符為有效輸入,若為按長鍵表示結束輸入
391 3 while(scankey()==2){
392 4 t++;
393 4 if(t>20)
394 4 goto getdatacon;
395 4 }
396 3 if(flag>=16)
397 3 goto keystart;//輸入值過多,控制其回到首位矯正
398 3
399 3 keybuf[flag]=disdata[i][j];
400 3 showline(keybuf,1);//將輸入值回顯
401 3 home;
402 3 delay1ms(3);//回顯完畢后要控制其光標恢復到首行輸入狀態
403 3 flag++;
404 3 for(c=0;c<j;c++){
405 4 toup;
406 4 delay1ms(1);
407 4 }
408 3 goto firstout;
409 3 getdatacon:
410 3 showline("Has inputed: ",0);
411 3 showline(keybuf,1);//需長按鍵
412 3 while(scankey()==2);
413 3 curshut;//隱藏光標
414 3 goto KEYEND;
415 3 }
416 2 if(k==3){//上翻頁鍵控制光標上移
417 3 j--;
418 3 t=-1;
419 3 if(j<0) {//同樣存在過頭處理,但是不是回到首位,而是末位
420 4 j=15;
421 4 i--;
422 4 if(i<0)
423 4 i=DISROW;
424 4 showline(disdata[i],0);
C51 COMPILER V8.08 LCD 11/29/2007 11:29:41 PAGE 8
425 4 curshow;
426 4 home;
427 4 delay1ms(3);
428 4 for(c=0;c<j;c++){
429 5 toup;
430 5 delay1ms(1);
431 5 }
432 4 }
433 3 else{
434 4 todown;
435 4 }
436 3
437 3 }
438 2 if(k==5){//delete 鍵,使輸入緩沖區的最后一位刪掉
439 3 flag--;
440 3 if(flag<1)
441 3 flag=0;
442 3 keybuf[flag]='\0';
443 3 showline(keybuf,1);
444 3 curshow;
445 3 home;
446 3 delay1ms(3);
447 3 for(c=0;c<j;c++){
448 4 toup;
449 4 delay1ms(1);
450 4 }
451 3 }
452 2 firstout: //每個循環必要的延時
453 2 for(k=0;k<2;k++)
454 2 delay1ms(100);
455 2 }
456 1 KEYEND:
457 1 _nop_();
458 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2653 ----
CONSTANT SIZE = 63 ----
XDATA SIZE = 32 4
PDATA SIZE = ---- ----
DATA SIZE = ---- 39
IDATA SIZE = ---- 11
BIT SIZE = ---- 6
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -