📄 p0902-ps2.lst
字号:
309 //---------------------------------------
310 //名称: LCD清屏函数
311 //作者:cby
312 //网站:宁波单片机开发网
313 //网址:www.nbdpj.com
314 //邮箱:nbdpj@nbdpj.com
315 //日期:20081111
316 //-----------------------------------------
317 void LCD_clear(void)
318 {
319 1 unsigned char t;
320 1 unsigned char k;
321 1 for(t=0;t<6;t++)
322 1 {
323 2 for(k=0;k<84;k++)
324 2 {
325 3 LCD_write_byte(0,1);
326 3 }
327 2 }
328 1 }
329 //---------------------------------------
330 //名称: 5110LCD初始化函数
331 //作者:cby
332 //网站:宁波单片机开发网
333 //网址:www.nbdpj.com
334 //邮箱:nbdpj@nbdpj.com
335 //日期:20081111
336 //-----------------------------------------
337 void LCD_init(void)
338 {
339 1 LCD_write_byte(0x21,0); //LCD功能设置:芯片活动,水平寻址,使用扩展指令
340 1 LCD_write_byte(0xc5,0); //设置偏置电压
341 1 LCD_write_byte(0x06,0); //温度校正
342 1 LCD_write_byte(0x13,0); //1:48
343 1 LCD_write_byte(0x20,0); //LCD功能设置:芯片活动,水平寻址,使用基本指令
344 1 LCD_clear();
345 1 LCD_write_byte(0x0C,0); //设定显示配置:普通模式
346 1 }
347 //---------------------------------------
348 //名称: 设置坐标函数
349 //参数:X:0-83 Y:0-5
350 //作者:cby
351 //网站:宁波单片机开发网
352 //网址:www.nbdpj.com
353 //邮箱:nbdpj@nbdpj.com
354 //日期:20081111
355 //-----------------------------------------
356 void LCD_set_XY(unsigned char X, unsigned char Y)
357 {
358 1 LCD_write_byte(0x40 | Y, 0);
359 1 LCD_write_byte(0x80 | X, 0);
360 1 }
361 //---------------------------------------
362 //名称: 显示英文字符
363 //参数:c:显示的字符在font6x8表格中的位置
364 //作者:cby
365 //网站:宁波单片机开发网
C51 COMPILER V8.05a P0902_PS2 04/02/2009 17:17:44 PAGE 7
366 //网址:www.nbdpj.com
367 //邮箱:nbdpj@nbdpj.com
368 //日期:20081111
369 //-----------------------------------------
370 void LCD_write_char(unsigned char c)
371 {
372 1 unsigned char line;
373 1 c-= 32;
374 1 for (line=0; line<6; line++)
375 1 LCD_write_byte(font6x8[c][line], 1);
376 1 }
377 //---------------------------------------
378 //名称: 英文字符串显示函数
379 //参数:*s:英文字符串指针
380 //作者:cby
381 //网站:宁波单片机开发网
382 //网址:www.nbdpj.com
383 //邮箱:nbdpj@nbdpj.com
384 //日期:20081111
385 //-----------------------------------------
386 void LCD_write_String(unsigned char X,unsigned char Y,char *s)
387 {
388 1 LCD_set_XY(X,Y);
389 1 while (*s)
390 1 {
391 2 LCD_write_char(*s);
392 2 s++;
393 2 }
394 1 }
395 void LCD_write_String1(unsigned char X,unsigned char Y,unsigned char s)
396 {
397 1 unsigned char line;
398 1 LCD_set_XY(X*6,Y);
399 1 for (line=0; line<6; line++)
400 1 LCD_write_byte(font6x8[s][line], 1);
401 1 }
402 //---------------------------------------
403 //名称: SPI初始化函数
404 //作者:cby
405 //网站:宁波单片机开发网
406 //网址:www.nbdpj.com
407 //邮箱:nbdpj@nbdpj.com
408 //日期:20090325
409 //-----------------------------------------
410 void init_spi()
411 {
412 1 P1M0=0X40;
413 1 P1M1=0XA0;
414 1 SPCTL=0XD0;
415 1 SPSTAT=0XC0;
416 1 }
417 //---------------------------------------
418 //名称: 使用SPI接口写数据到LCD
419 //参数:dt:写入的数据 command: 1-数据/0-命令
420 //作者:cby
421 //网站:宁波单片机开发网
422 //网址:www.nbdpj.com
423 //邮箱:nbdpj@nbdpj.com
424 //日期:20090325
425 //-----------------------------------------
426 void LCD_write_byte(unsigned char dt, unsigned char command)
427 {
C51 COMPILER V8.05a P0902_PS2 04/02/2009 17:17:44 PAGE 8
428 1 sce=0;
429 1 dc=command;
430 1 SPDAT=dt;
431 1 while(!(SPSTAT&0X80));
432 1 SPSTAT=0XC0;
433 1 dc=1;
434 1 sce=1;
435 1 sdin=1;
436 1 }
437 //---------------------------------------
438 //名称: 写一个汉字到LCD函数
439 //参数:x,y:写入汉字的地址 address: 写入汉字在han表格中的位置
440 //作者:cby
441 //网站:宁波单片机开发网
442 //网址:www.nbdpj.com
443 //邮箱:nbdpj@nbdpj.com
444 //日期:20081111
445 //-----------------------------------------
446 void disp16_16(unsigned char x,unsigned char y,unsigned char address)
447 {
448 1 unsigned char c;
449 1 LCD_set_XY(x*8, y);
450 1 for(c=0;c<16;c++)
451 1 {
452 2 LCD_write_byte(han[address*32+c],1);
453 2 }
454 1 LCD_set_XY(x*8, y+1);
455 1 for(c=16;c<32;c++)
456 1 {
457 2 LCD_write_byte(han[address*32+c],1);
458 2 }
459 1 }
460 unsigned char Decode(unsigned char ScanCode)
461 //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H?
462 //也就是说shift的通码+G的通码+shift的断码+G的断码
463 {
464 1 unsigned char TempCyc;
465 1 unsigned char KeyChar=0;
466 1 if (!Key_UP) //当键盘松开时
467 1 {
468 2 switch (ScanCode)
469 2 {
470 3 case 0xF0 : // 当收到0xF0,Key_UP置1表示断码开始
471 3 Key_UP = 1;
472 3 break;
473 3
474 3 case 0x12 : // 左 SHIFT
475 3 Shift = 1;
476 3 break;
477 3
478 3 case 0x59 : // 右 SHIFT
479 3 Shift = 1;
480 3 break;
481 3 case 0x66: //backspace
482 3 if(weizhi>0)
483 3 {
484 4 weizhi--;
485 4 disbuf[weizhi]=0;
486 4 disbit=1;
487 4 }
488 3 break;
489 3 default:
C51 COMPILER V8.05a P0902_PS2 04/02/2009 17:17:44 PAGE 9
490 3 if (DisNum > 15) DisNum = 0;
491 3 if(!Shift) //如果SHIFT没按下
492 3 {
493 4 for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
494 4 if (UnShifted[TempCyc][0] == ScanCode)
495 4 {
496 5 KeyChar=UnShifted[TempCyc][1];
497 5 disbit=1;
498 5 disbuf[weizhi]=KeyChar;
499 5 if(weizhi<83) weizhi++;
500 5 }
501 4 DisNum++;
502 4 }
503 3 else //按下SHIFT
504 3 {
505 4 for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
506 4 if (Shifted[TempCyc][0] == ScanCode)
507 4 {
508 5 KeyChar=Shifted[TempCyc][1];
509 5 disbit=1;
510 5 disbuf[weizhi]=KeyChar;
511 5 if(weizhi<83) weizhi++;
512 5 }
513 4 DisNum++;
514 4 }
515 3 break;
516 3 }
517 2 }
518 1 else
519 1 {
520 2 Key_UP = 0;
521 2 switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理
522 2 {
523 3 case 0x12 : // 左 SHIFT
524 3 Shift = 0;
525 3 break;
526 3 case 0x59 : // 右 SHIFT
527 3 Shift = 0;
528 3 break;
529 3 }
530 2 }
531 1 return KeyChar;
532 1 }
533 void scakey()
534 {
535 1 if (BF)
536 1 {
537 2 Decode(keybuf);
538 2 BF=0;
539 2 EX1=0;
540 2 EA=1;
541 2 }
542 1 else
543 1 EX1 = 1; //开中断
544 1 }
545 void init1()interrupt 2 using 0
546 {
547 1 if ((IntNum > 0) && (IntNum < 9))
548 1 {
549 2 KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
550 2 if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
551 2 }
C51 COMPILER V8.05a P0902_PS2 04/02/2009 17:17:44 PAGE 10
552 1 IntNum++;
553 1 while (!Key_CLK); //等待PS/2CLK拉高
554 1 if (IntNum > 10)
555 1 {
556 2 IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
557 2 BF = 1; //标识有字符输入完了
558 2 keybuf=KeyV;
559 2 KeyV=0;
560 2 }
561 1 }
562 //---------------------------------------
563 //名称: 主函数
564 //作者:cby
565 //网站:宁波单片机开发网
566 //网址:www.nbdpj.com
567 //邮箱:nbdpj@nbdpj.com
568 //日期:20081111
569 //-----------------------------------------
570 void main()
571 {
572 1 unsigned char k;
573 1 unsigned char l;
574 1 init_spi();
575 1 res=0;
576 1 for(k=0;k<250;k++);
577 1 for(k=0;k<84;k++) disbuf[k]=0;
578 1 res=1; //LCD复位
579 1 LCD_init(); //初始化LCD模块
580 1 LCD_clear(); //清屏幕
581 1 disp16_16(0,0,0); //宁
582 1 disp16_16(2,0,1); //波
583 1 disp16_16(4,0,2); //单
584 1 disp16_16(6,0,3); //片
585 1 disp16_16(8,0,4); //机
586 1 disp16_16(1,2,5); //开
587 1 disp16_16(4,2,6); //发
588 1 disp16_16(7,2,7); //网
589 1 LCD_write_String(1,5,"www.nbdpj.com"); //www.nbdpj.com
590 1 back_led=0; //开背光
591 1 EX1=1;
592 1 EA=1;
593 1 weizhi=0;
594 1 while(1)
595 1 {
596 2 scakey();
597 2 if(disbit)
598 2 {
599 3 disbit=0;
600 3 for(k=0;k<6;k++)
601 3 {
602 4 for(l=0;l<14;l++)
603 4 {
604 5 LCD_write_String1(l,k,disbuf[k*14+l]);
605 5 }
606 4 }
607 3 }
608 2 }
609 1 }
610
MODULE INFORMATION: STATIC OVERLAYABLE
C51 COMPILER V8.05a P0902_PS2 04/02/2009 17:17:44 PAGE 11
CODE SIZE = 869 ----
CONSTANT SIZE = 1062 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 91 18
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -