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