找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 905|回复: 1
收起左侧

基于P89V51控制LCD显示屏源程序

[复制链接]
ID:456119 发表于 2018-12-27 09:39 | 显示全部楼层 |阅读模式
基于P89V51控制LCD显示屏

单片机源程序如下:
  1. #include "System.h"
  2. #include "STRING.h"
  3. #include "LCD.h"
  4. #include "I2C.h"
  5. #include "Relay_Parameter.h"
  6. #include "Display.h"

  7. uchar xdata xy1[19][2]={
  8.                                       {21,30},{22,30},{21,56},{21,82},
  9.                                                                     {21,108},{22,108},{23,108},{24,108},{25,108},                     
  10.                                                                     {21,134},{22,134},{23,134},{24,134},{25,134},
  11.                           {14,75},{15,75},{16,75},{17,75},{18,75}
  12.                              };//光标坐标

  13. uchar xdata x,y;

  14. /****键盘控制LCD上的光标左移****/
  15. void Left_M(uchar JL_or_ceshi)//0为测试界面,1计量界面
  16. {
  17.         uchar xdata i,a,b;
  18.         if(JL_or_ceshi==1)
  19.         {
  20.                 a=14;b=19;
  21.         }
  22.         else
  23.         {
  24.                 if((Relay1.delay_type[0]-0x30)==3) {a=0;b=14;}
  25.           else {a=0;b=9;}
  26.         }       
  27.         for(i=a;i<b;i++)
  28.         {
  29.                 if(x==xy1[i][0]&&y==xy1[i][1])
  30.                 {
  31.                         LcmClear_1();
  32.                         if(i!=a)
  33.                         {
  34.                                 if(xy1[i][0]==21&&xy1[i][1]==82)
  35.         {
  36.                                         dprintf(xy1[i-1][0],xy1[i-1][1],StrForMixed10,0);
  37.                                         dprintf(xy1[i-1][0]+1,xy1[i-1][1],StrForMixed10,0);
  38.                                         dprintf(xy1[i-1][0]+2,xy1[i-1][1],StrForMixed10,0);
  39.                                         dprintf(xy1[i-1][0]+3,xy1[i-1][1],StrForMixed10,0);
  40.                                         dprintf(xy1[i-1][0]+4,xy1[i-1][1],StrForMixed10,0);
  41.                                         dprintf(xy1[i-1][0]+5,xy1[i-1][1],StrForMixed10,0);
  42.         }
  43.                                 else
  44.                                 {
  45.                                         dprintf(xy1[i-1][0],xy1[i-1][1],StrForMixed10,0);
  46.                                 }
  47.                                 x=xy1[i-1][0];y=xy1[i-1][1];
  48.                  }
  49.                  else
  50.                  {
  51.                          dprintf(xy1[i][0],xy1[i][1],StrForMixed10,0);
  52.                          x=xy1[i][0];y=xy1[i][1];
  53.                  }
  54.                  break;
  55.          }                
  56.         }
  57. }

  58. /****键盘控制LCD上的光标右移****/
  59. void Right_M(uchar JL_or_ceshi)//0测试界面,1计量界面
  60. {
  61.         uchar xdata i,a,b;
  62.         if(JL_or_ceshi==1)
  63.         {
  64.                 a=14;b=19;
  65.         }
  66.         else
  67.         {
  68.                 if((Relay1.delay_type[0]-0x30)==3) {a=0;b=14;}
  69.           else {a=0;b=9;}
  70.         }
  71.         for(i=a;i<b;i++)
  72.         {
  73.                 if(x==xy1[i][0]&&y==xy1[i][1])
  74.                  {
  75.                          LcmClear_1();
  76.                          if(i!=(b-1))
  77.                          {
  78.                                  if(xy1[i][0]==22&&xy1[i][1]==30)
  79.                                  {
  80.                                          dprintf(xy1[i+1][0],xy1[i+1][1],StrForMixed10,0);
  81.                                          dprintf(xy1[i+1][0]+1,xy1[i+1][1],StrForMixed10,0);
  82.                                          dprintf(xy1[i+1][0]+2,xy1[i+1][1],StrForMixed10,0);
  83.                                          dprintf(xy1[i+1][0]+3,xy1[i+1][1],StrForMixed10,0);
  84.                                          dprintf(xy1[i+1][0]+4,xy1[i+1][1],StrForMixed10,0);
  85.                                          dprintf(xy1[i+1][0]+5,xy1[i+1][1],StrForMixed10,0);
  86.                                  }
  87.                                  else
  88.                                  {
  89.                                          dprintf(xy1[i+1][0],xy1[i+1][1],StrForMixed10,0);
  90.                                  }
  91.                                  x=xy1[i+1][0];y=xy1[i+1][1];
  92.                          }       
  93.                          else
  94.                          {
  95.                                  dprintf(xy1[i][0],xy1[i][1],StrForMixed10,0);
  96.                                  x=xy1[i][0];y=xy1[i][1];
  97.                          }
  98.                          break;
  99.                  }
  100.         }
  101. }

  102. /****向上调LCD上的参数****/
  103. void Uchange_P(uchar *Ptr,uint t)
  104. {
  105.         uchar xdata i,c1;
  106.         if(Ptr==Relay1.chud_num)
  107.         {
  108.                 for(i=0;i<13;i++) //13为触点类型种数
  109.                 {
  110.                         if(strcmp(Relay1.chud_num,Relay_CD_numbers[i])==0)
  111.                         {
  112.                                 if(i==12) {strncpy(Relay1.chud_num,Relay_CD_numbers[0],7);}
  113.                                 else {strncpy(Relay1.chud_num,Relay_CD_numbers[i+1],7);}
  114.                                 switch(strlen(Relay1.chud_num))
  115.                                 {
  116.                                         case 2:
  117.                                                       dddprintf(21,56,Relay1.chud_num,2,1);
  118.                                                 dprintf(23,56,StrForMixed58,1);
  119.                                                 dprintf(25,56,StrForMixed58,1);
  120.                                                 break;
  121.                                         case 4:
  122.                                                       dddprintf(21,56,Relay1.chud_num,4,1);
  123.                                                 dprintf(25,56,StrForMixed58,1);
  124.                                                 break;
  125.                                         case 6:
  126.                                                       dddprintf(21,56,Relay1.chud_num,7,1);
  127.                                                 break;
  128.                                 }
  129.                                 break;       
  130.                         }
  131.                 }
  132.         }
  133.         else if(Ptr==Relay1.delay_type)
  134.         {
  135.                 for(i=0;i<7;i++)
  136.                 {
  137.                         if(strcmp(Relay1.delay_type,Relay_YS_Type[i])==0)
  138.                         {
  139.                                 if(i==6) {strncpy(Relay1.delay_type,Relay_YS_Type[0],2);}
  140.                                 else {strncpy(Relay1.delay_type,Relay_YS_Type[i+1],2);}
  141.                                 dddprintf(21,82,Relay1.delay_type,2,1);
  142.                                 break;       
  143.                         }
  144.                 }
  145.         }
  146.         else
  147.         {
  148.                 c1=Ptr[t];
  149.           switch(c1)
  150.           {
  151.                   case 0x39:
  152.                                    if(Ptr==Relay1.number) {c1=0x2F;}                                                                                                   
  153.                                                            else {c1=0x2D;}                   
  154.                              break;
  155.                   case 0x2E:
  156.                              c1=0x2F;
  157.                                    break;
  158.                     default:
  159.                              break;
  160.           }
  161.           if(c1>=0x10)
  162.           {
  163.       WriteCommand(CspDirD);
  164.       Locatexy(x,y,1);
  165.                   WriteCommand(mWrite);
  166.       for(i=0;i<16;i++)
  167.                   WriteData(ASC_MSK[(c1-0x20+1)*16+i]);
  168.             Ptr[t]=c1+1;               
  169.     }
  170.         }       
  171. }

  172. /*****向下调LCD上的参数****/
  173. void Dchange_P(uchar *Ptr,uint t)
  174. {
  175.         uchar xdata i,c1;
  176.         if(Ptr==Relay1.chud_num)
  177.         {
  178.                 for(i=0;i<13;i++)
  179.                 {
  180.                         if(strcmp(Relay1.chud_num,Relay_CD_numbers[i])==0)
  181.                         {
  182.                                 if(i==0) {strncpy(Relay1.chud_num,Relay_CD_numbers[12],7);}
  183.                                 else {strncpy(Relay1.chud_num,Relay_CD_numbers[i-1],7);}
  184.                                 switch(strlen(Relay1.chud_num))
  185.                                 {
  186.                                         case 2:
  187.                                                       dddprintf(21,56,Relay1.chud_num,2,1);
  188.                                                 dprintf(23,56,StrForMixed58,1);
  189.                                                 dprintf(25,56,StrForMixed58,1);
  190.                                                 break;
  191.                                         case 4:
  192.                                                       dddprintf(21,56,Relay1.chud_num,4,1);
  193.                                                 dprintf(25,56,StrForMixed58,1);
  194.                                                 break;
  195.                                         case 6:
  196.                                                       dddprintf(21,56,Relay1.chud_num,7,1);
  197.                                                 break;
  198.                                 }
  199.                                 break;       
  200.                         }
  201.                 }
  202.         }
  203.         else if(Ptr==Relay1.delay_type)
  204.         {
  205.                 for(i=0;i<7;i++)
  206.                 {
  207.                         if(strcmp(Relay1.delay_type,Relay_YS_Type[i])==0)
  208.                         {
  209.                                 if(i==0) {strncpy(Relay1.delay_type,Relay_YS_Type[6],2);}
  210.                                 else {strncpy(Relay1.delay_type,Relay_YS_Type[i-1],2);}
  211.                                 dddprintf(21,82,Relay1.delay_type,2,1);
  212.                                 break;       
  213.                         }
  214.                 }
  215.         }
  216.         else
  217.         {
  218.                 c1=Ptr[t];
  219.                 switch(c1)
  220.           {
  221.                   case 0x30:
  222.                                    if(Ptr==Relay1.number) {c1=0x3A;}                                                                                                   
  223.                                                            else {c1=0x2F;}
  224.                              break;
  225.                   case 0x2E:
  226.                                    c1=0x3A;
  227.                              break;
  228.                   default:
  229.                                    break;
  230.           }
  231.           if(c1>=0x10)
  232.           {
  233.       uint xdata j;
  234.       WriteCommand(CspDirD);
  235.       Locatexy(x,y,1);
  236.                   WriteCommand(mWrite);
  237.       for(j=0;j<16;j++)
  238.                   WriteData(ASC_MSK[(c1-0x20-1)*16+j]);
  239.             Ptr[t]=c1-1;
  240.     }       
  241.         }       
  242. }

  243. /****移动光标,调大LCD上的参数****/
  244. void SheZP1()
  245. {
  246.         if(x==21&&y==30)  Uchange_P(Relay1.number,0);
  247.         if(x==22&&y==30)  Uchange_P(Relay1.number,1);
  248.         if(x==21&&y==56)  Uchange_P(Relay1.chud_num,0);
  249.         if(x==21&&y==82)  Uchange_P(Relay1.delay_type,0);
  250.        
  251.         if(x==21&&y==108) Uchange_P(Relay1.time1,0);
  252.         if(x==22&&y==108) Uchange_P(Relay1.time1,1);
  253.         if(x==23&&y==108) Uchange_P(Relay1.time1,2);
  254.         if(x==24&&y==108) Uchange_P(Relay1.time1,3);
  255.         if(x==25&&y==108) Uchange_P(Relay1.time1,4);
  256.        
  257.         if(x==21&&y==134) Uchange_P(Relay1.time2,0);
  258.         if(x==22&&y==134) Uchange_P(Relay1.time2,1);
  259.         if(x==23&&y==134) Uchange_P(Relay1.time2,2);
  260.         if(x==24&&y==134) Uchange_P(Relay1.time2,3);
  261.         if(x==25&&y==134) Uchange_P(Relay1.time2,4);
  262.        
  263.         if(x==14&&y==75)  Uchange_P(JL_Time,0);
  264.         if(x==15&&y==75)  Uchange_P(JL_Time,1);
  265.         if(x==16&&y==75)  Uchange_P(JL_Time,2);
  266.         if(x==17&&y==75)  Uchange_P(JL_Time,3);
  267.         if(x==18&&y==75)  Uchange_P(JL_Time,4);

  268. }

  269. /****移动光标,调小LCD上的参数****/
  270. void SheZP2()
  271. {
  272.         if(x==21&&y==30)  Dchange_P(Relay1.number,0);
  273.         if(x==22&&y==30)  Dchange_P(Relay1.number,1);
  274.         if(x==21&&y==56)  Dchange_P(Relay1.chud_num,0);
  275.         if(x==21&&y==82)  Dchange_P(Relay1.delay_type,0);
  276.        
  277.         if(x==21&&y==108) Dchange_P(Relay1.time1,0);
  278.         if(x==22&&y==108) Dchange_P(Relay1.time1,1);
  279.         if(x==23&&y==108) Dchange_P(Relay1.time1,2);
  280.         if(x==24&&y==108) Dchange_P(Relay1.time1,3);
  281.         if(x==25&&y==108) Dchange_P(Relay1.time1,4);
  282.        
  283.        
  284.         if(x==21&&y==134) Dchange_P(Relay1.time2,0);
  285.         if(x==22&&y==134) Dchange_P(Relay1.time2,1);
  286.         if(x==23&&y==134) Dchange_P(Relay1.time2,2);
  287.         if(x==24&&y==134) Dchange_P(Relay1.time2,3);
  288.         if(x==25&&y==134) Dchange_P(Relay1.time2,4);
  289.        
  290.         if(x==14&&y==75)  Dchange_P(JL_Time,0);
  291.         if(x==15&&y==75)  Dchange_P(JL_Time,1);
  292.         if(x==16&&y==75)  Dchange_P(JL_Time,2);
  293.         if(x==17&&y==75)  Dchange_P(JL_Time,3);
  294.         if(x==18&&y==75)  Dchange_P(JL_Time,4);
  295. }

  296. /****判断输入的延时形式是否为3,从而决定是否出现“延时时间T2“****/
  297. void Second_PD()
  298. {
  299.         if((Relay1.delay_type[0]-0x30)==3)
  300.         {
  301.                 switch(strlen(Relay1.chud_num))
  302.                 {
  303.                                         case 2:
  304.                                                       dddprintf(21,56,Relay1.chud_num,2,1);
  305.                                                 dprintf(23,56,StrForMixed58,1);
  306.                                                 dprintf(25,56,StrForMixed58,1);
  307.                                                 break;
  308.                                         case 4:
  309.                                                       dddprintf(21,56,Relay1.chud_num,4,1);
  310.                                                 dprintf(25,56,StrForMixed58,1);
  311.                                                 break;
  312.                                         case 6:
  313.                                                       dddprintf(21,56,Relay1.chud_num,7,1);
  314.                                                 break;
  315.                 }
  316.                
  317.                 //dddprintf(21,56,Relay1.chud_num,7,1);
  318.           dddprintf(21,82,Relay1.delay_type,2,1);
  319.           dddprintf(21,108,Relay1.time1,5,1);
  320.           dprintf(15,108,StrForMixed181,1);
  321.                 dprintf(7,134,StrForMixed18,1);
  322.                 dprintf(15,134,StrForMixed182,1);
  323.                 dddprintf(21,134,Relay1.time2,5,1);
  324.                 dprintf(26,134,StrForMixed20,1);
  325.         }
  326.         else
  327.         {
  328.                 switch(strlen(Relay1.chud_num))
  329.                 {
  330.                                         case 2:
  331.                                                       dddprintf(21,56,Relay1.chud_num,2,1);
  332.                                                 dprintf(23,56,StrForMixed58,1);
  333.                                                 dprintf(25,56,StrForMixed58,1);
  334.                                                 break;
  335.                                         case 4:
  336.                                                       dddprintf(21,56,Relay1.chud_num,4,1);
  337.                                                 dprintf(25,56,StrForMixed58,1);
  338.                                                 break;
  339.                                         case 6:
  340.                                                       dddprintf(21,56,Relay1.chud_num,7,1);
  341.                                                 break;
  342.                 }
  343.                 //dddprintf(21,56,Relay1.chud_num,7,1);
  344.           dddprintf(21,82,Relay1.delay_type,2,1);
  345.           dddprintf(21,108,Relay1.time1,5,1);
  346.         }
  347. }

  348. /****根据输入的产品编号,得到其在EEPROM中存储的位置,
  349. 并判断该位置上是否存有继电器参数,如果有更新相应的LCD显示****/
  350. void number_just()
  351. {
  352.         uchar xdata t,t1;
  353.         uchar xdata ADL,ADH;
  354.         uchar xdata BianH[2];
  355.         t=10*(Relay1.number[0]-0x30)+(Relay1.number[1]-0x30);
  356.         ADL=(t*32)%256;
  357.         ADH=(t*32)/256;
  358.   RW_EEPROM(0,ADH,ADL,BianH,2);
  359.         if(BianH[0]!=0x00&&BianH[1]!=0x00)
  360.         {
  361.                 t1=10*(BianH[0]-0x30)+(BianH[1]-0x30);
  362.                 if(t1==t)
  363.           {
  364.                   RW_EEPROM(0,ADH,ADL,Relay1.number,RelayBits);
  365.                         Second_PD();
  366.                         RW_EEPROM(1,0x1F,0xE0,Relay1.number,RelayBits);                       
  367.           }
  368.         }
  369. }
  370. ……………………

  371. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
Display.zip (2.7 KB, 下载次数: 9)
回复

使用道具 举报

ID:1 发表于 2018-12-28 01:51 | 显示全部楼层
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表