51单片机关于LCD1602A显示和按键控制 附单片机程序

[复制链接]
查看2 | 回复0 | 2021-7-11 23:39:49 | 显示全部楼层 |阅读模式
1.jpg 2.jpg 1.png 2.png 3.png
单片机源程序如下:

  1. /********************************************************************************
  2. 通过按键控制3个继电器开关,并在1602A液晶显示屏上显示        
  3. *******************************************************************************/
  4. #include<reg52.h>
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. sbit E=P3^4;  //1602使能引脚
  8. sbit RW=P3^6; //1602读写引脚        
  9. sbit RS=P3^5; //1602数据/命令选择引脚
  10. sbit key_s2 = P3^0;//独立按键S2
  11. sbit key_s3 = P3^1;//独立按键S3
  12. sbit key_s4 = P3^2;//独立按键S4
  13. sbit key_s5 = P3^3;//独立按键S5
  14. sbit M1= P1^0;
  15. sbit M2= P1^1;
  16. sbit M3= P1^2;
  17. sbit beep= P2^3;
  18. uchar j;
  19. uchar flag;//定义标志位
  20. uchar code tab1[]="welcome to you  ";  //要显示什么就在这儿改
  21. uchar code tab2[]="enter       exit";  //要显示什么就在这儿改
  22. uchar code tabhang1[]="motor: M1 M2 M3 "; //要显示什么就在这儿改
  23. uchar code tab00[]="enter 000   exit";  
  24. uchar code tab01[]="enter 001   exit";  
  25. uchar code tab02[]="enter 010   exit";  
  26. uchar code tab03[]="enter 011   exit";  
  27. uchar code tab04[]="enter 100   exit";  
  28. uchar code tab05[]="enter 101   exit";  
  29. uchar code tab06[]="enter 110   exit";  
  30. uchar code tab07[]="enter 111   exit";   
  31. void delay(uint del)   //延时1ms
  32. {
  33. uint i,j;
  34. for(i=0;i<del;i++)
  35.    for(j=0;j<=168;j++);
  36. }
  37. void writecmd(uchar com)  //写指令
  38. {
  39. E=0;
  40. RS=0;
  41. RW=0;
  42. P0=com;
  43. delay(2);
  44. E=1;  
  45. delay(2);
  46. E=0;
  47. }
  48. void writedata(uchar dat)//写数据
  49. {  
  50.   E=0;
  51.   RS=1;
  52.   RW=0;
  53.   P0=dat;
  54.   delay(2);
  55.   E=1;  
  56.   delay(2);
  57.   E=0;

  58. }
  59. void kaiji()                //开机主页
  60. {                                    

  61.                         writecmd(0x80);    //告诉液晶在哪个地方显示 (设置地址指针)//80H+00
  62.                                   for(j=0;j<16;j++)  //有16个字符,要循环16次
  63.                                   {
  64.                                            writedata(tab1[j]);
  65.                                              delay(2);
  66.                                    }
  67.                                    writecmd(0x80+0x40); //再设置第二行的起始位置80H+40H

  68.                                                                  for(j=0;j<16;j++)   //有16个字符,要循环16次
  69.                                                                  { writedata(tab2[j]);
  70.                                                                     delay(2);
  71.                                                                  }
  72. }
  73. void delay1(uint z)        //延时子函数
  74. {
  75.         uint x,y;
  76.         for(x = z; x > 0; x--)
  77.                 for(y = 114; y > 0 ; y--);                 
  78. }
  79. void init(void)               //初始化
  80. {
  81. delay(15);
  82. writecmd(0x38);
  83. delay(5);
  84. writecmd(0x38);
  85. delay(5);
  86. writecmd(0x38);
  87. writecmd(0x38);
  88. writecmd(0x08);
  89. writecmd(0x01);
  90. writecmd(0x06);
  91. writecmd(0x0c);
  92. M1=0;
  93. M2=0;
  94. M3=0;
  95. kaiji();
  96. }
  97. void moshi0()
  98. {
  99.         writecmd(0x80);    //告诉液晶在哪个地方显示 (设置地址指针)//80H+00
  100.          for(j=0;j<16;j++)  //有16个字符,要循环16次
  101.         {
  102.                    writedata(tabhang1[j]);
  103.                      delay(2);
  104.          }
  105.          writecmd(0x80+0x40); //再设置第二行的起始位置80H+40H
  106.          for(j=0;j<16;j++)   //有16个字符,要循环16次
  107.                  {
  108.                 writedata(tab00[j]);
  109.                                 delay(2);
  110.                   }
  111.         if(key_s2==0)
  112.         {        delay1(10);
  113.                 if(key_s2 == 0)
  114.                         {
  115.                                 M1=0;
  116.                                 M2=0;
  117.                                 M3=0;
  118.                                 while(!key_s2);//松手检测               
  119.                         }        
  120.         }
  121.                
  122.                                 
  123. }
  124. void moshi1()
  125. {                       
  126.         writecmd(0x80);    //告诉液晶在哪个地方显示 (设置地址指针)//80H+00
  127.           for(j=0;j<16;j++)  //有16个字符,要循环16次
  128.          {
  129.                    writedata(tabhang1[j]);
  130.                      delay(2);
  131.           }
  132.         writecmd(0x80+0x40); //再设置第二行的起始位置80H+40H
  133.          for(j=0;j<16;j++)   //有16个字符,要循环16次
  134.                   {
  135.                 writedata(tab01[j]);
  136.                                 delay(2);
  137.                    }
  138.         if(key_s2==0)
  139.         {        delay1(10);
  140.                 if(key_s2 == 0)
  141.                         {
  142.                                 M1=0;
  143.                                 M2=0;
  144.                                 M3=1;
  145.                                 while(!key_s2);//松手检测               
  146.                         }        
  147.         }
  148.                                 
  149. if(key_s5==0)
  150.         {        delay1(10);
  151.                 if(key_s5== 0)
  152.                         {
  153.                                 M1=0;
  154.                                 M2=0;
  155.                                 M3=0;
  156.                                 while(!key_s5);//松手检测               
  157.                         }        
  158.         }                                

  159. }
  160. void moshi2()
  161. {
  162.                                                                   writecmd(0x80);    //告诉液晶在哪个地方显示 (设置地址指针)//80H+00
  163.                                   for(j=0;j<16;j++)  //有16个字符,要循环16次
  164.                                   {
  165.                                            writedata(tabhang1[j]);
  166.                                              delay(2);
  167.                                    }
  168.                                    writecmd(0x80+0x40); //再设置第二行的起始位置80H+40H

  169.                                                                  for(j=0;j<16;j++)   //有16个字符,要循环16次
  170.                                                                  { writedata(tab02[j]);
  171.                                                                     delay(2);
  172.                                                                   }
  173. if(key_s2==0)
  174.         {        delay1(10);
  175.                 if(key_s2 == 0)
  176.                         {
  177.                                 M1=0;
  178.                                 M2=1;
  179.                                 M3=0;
  180.                                 while(!key_s2);//松手检测               
  181.                         }        
  182.         }
  183.                                 
  184. if(key_s5==0)
  185.         {        delay1(10);
  186.                 if(key_s5== 0)
  187.                         {
  188.                                 M1=0;
  189.                                 M2=0;
  190.                                 M3=0;
  191.                                 while(!key_s5);//松手检测               
  192.                         }        
  193.         }                                                               
  194. }
  195. void moshi3()
  196. {
  197.                  writecmd(0x80);    //告诉液晶在哪个地方显示 (设置地址指针)//80H+00
  198.           for(j=0;j<16;j++)  //有16个字符,要循环16次
  199.         {
  200.                    writedata(tabhang1[j]);
  201.                      delay(2);
  202.           }
  203.         writecmd(0x80+0x40); //再设置第二行的起始位置80H+40H
  204.          for(j=0;j<16;j++)   //有16个字符,要循环16次
  205.                   {
  206.                 writedata(tab03[j]);
  207.                                 delay(2);
  208.                   }
  209.         if(key_s2==0)
  210.         {        
  211.                 delay1(10);
  212.                 if(key_s2 == 0)
  213.                         {
  214.                                 M1=0;
  215.                                 M2=1;
  216.                                 M3=1;
  217.                                 while(!key_s2);//松手检测               
  218.                         }        
  219.         }
  220.                                 
  221.         if(key_s5==0)
  222.         {        delay1(10);
  223.                 if(key_s5== 0)
  224.                         {
  225.                                 M1=0;
  226.                                 M2=0;
  227.                                 M3=0;
  228.                                 while(!key_s5);//松手检测               
  229.                         }        
  230.         }                                                               
  231. }
  232. void moshi4()
  233. {
  234.                 writecmd(0x80);    //告诉液晶在哪个地方显示 (设置地址指针)//80H+00
  235.          for(j=0;j<16;j++)  //有16个字符,要循环16次
  236.          {
  237.                    writedata(tabhang1[j]);
  238.                      delay(2);
  239.          }
  240.         writecmd(0x80+0x40); //再设置第二行的起始位置80H+40H
  241.          for(j=0;j<16;j++)   //有16个字符,要循环16次
  242.                   {
  243.                 writedata(tab04[j]);
  244.                                 delay(2);

  245.         }
  246.         if(key_s2==0)
  247.         {        delay1(10);
  248.                 if(key_s2 == 0)
  249.                         {
  250.                                 M1=1;
  251.                                 M2=0;
  252.                                 M3=0;
  253.                                 while(!key_s2);//松手检测               
  254.                         }        
  255.         }
  256.                                 
  257.         if(key_s5==0)
  258.         {        delay1(10);
  259.                 if(key_s5== 0)
  260.                         {
  261.                                 M1=0;
  262.                                 M2=0;
  263.                                 M3=0;
  264.                                 while(!key_s5);//松手检测               
  265.                         }        
  266.         }                                                               
  267. }
  268. void moshi5()
  269. {
  270.      writecmd(0x80);    //告诉液晶在哪个地方显示 (设置地址指针)//80H+00
  271.           for(j=0;j<16;j++)  //有16个字符,要循环16次
  272.         {
  273.                    writedata(tabhang1[j]);
  274.                      delay(2);
  275.          }
  276.         writecmd(0x80+0x40); //再设置第二行的起始位置80H+40H
  277.         for(j=0;j<16;j++)   //有16个字符,要循环16次
  278.                  {
  279.                 writedata(tab05[j]);
  280.                                 delay(2);

  281.          }
  282.                                 
  283.         if(key_s2==0)
  284.         {        delay1(10);
  285.                 if(key_s2 == 0)
  286.                         {
  287.                                 M1=1;
  288.                                 M2=0;
  289.                                 M3=1;
  290.                                 while(!key_s2);//松手检测               
  291.                         }        
  292.         }
  293.         if(key_s5==0)
  294.         {        delay1(10);
  295.                 if(key_s5== 0)
  296.                         {
  297.                                 M1=0;
  298.                                 M2=0;
  299.                                 M3=0;
  300.                                 while(!key_s5);//松手检测               
  301.                         }        
  302.         }                                
  303. }
  304. void moshi6()
  305. {
  306.                 writecmd(0x80);    //告诉液晶在哪个地方显示 (设置地址指针)//80H+00
  307.          for(j=0;j<16;j++)  //有16个字符,要循环16次
  308.          {
  309.                    writedata(tabhang1[j]);
  310.                      delay(2);
  311.          }
  312.                 writecmd(0x80+0x40); //再设置第二行的起始位置80H+40H
  313.         for(j=0;j<16;j++)   //有16个字符,要循环16次
  314.                   {
  315.                 writedata(tab06[j]);
  316.                                 delay(2);
  317.                    }
  318.         if(key_s2==0)
  319.         {        
  320.                 delay1(10);
  321.                 if(key_s2 == 0)
  322.                         {
  323.                                 M1=1;
  324.                                 M2=1;
  325.                                 M3=0;
  326.                                 while(!key_s2);//松手检测               
  327.                         }        
  328.         }
  329.         if(key_s5==0)
  330.         {        delay1(10);
  331.                 if(key_s5== 0)
  332.                         {
  333.                                 M1=0;
  334.                                 M2=0;
  335.                                 M3=0;
  336.                                 while(!key_s5);//松手检测               
  337.                         }        
  338.         }                                                               
  339. }
  340. void moshi7()
  341. {
  342.                 writecmd(0x80);    //告诉液晶在哪个地方显示 (设置地址指针)//80H+00
  343.          for(j=0;j<16;j++)  //有16个字符,要循环16次
  344.          {
  345.                    writedata(tabhang1[j]);
  346.                      delay(2);
  347.           }
  348.          writecmd(0x80+0x40); //再设置第二行的起始位置80H+40H
  349.         for(j=0;j<16;j++)   //有16个字符,要循环16次
  350.                  {
  351.                 writedata(tab07[j]);
  352.                                 delay(2);
  353.                                                                   }
  354.         if(key_s2==0)
  355.         {        
  356.                 delay1(10);
  357.                 if(key_s2 == 0)
  358.                         {
  359.                                 M1=1;
  360.                                 M2=1;
  361.                                 M3=1;
  362.                                 while(!key_s2);//松手检测               
  363.                         }        
  364.         }
  365.                                 
  366.         if(key_s5==0)
  367.         {        delay1(10);
  368.                 if(key_s5== 0)
  369.                         {
  370.                                 M1=0;
  371.                                 M2=0;
  372.                                 M3=0;
  373.                                 while(!key_s5);//松手检测               
  374.                         }        
  375.         }                                                               
  376. }
  377. void keyscan()
  378. {
  379.         if(key_s2==0)
  380.         {        delay1(10);
  381.                 if(key_s2 == 0)
  382.                         {
  383.                                  moshi0();
  384.                                 while(!key_s2);//松手检测               
  385.                         }        
  386.         }
  387.         if(key_s4==0)
  388.         {        delay1(10);
  389.                 if(key_s4 == 0)
  390.                         {
  391.                                 flag++;
  392.                                 if(flag==9)
  393.                                 flag=1;
  394.                                 while(!key_s4);//松手检测               
  395.                         }        
  396.         }
  397.         if(key_s3==0)
  398.         {        delay1(10);
  399.                 if(key_s3 == 0)
  400.                         {
  401.                                 flag--;
  402.                                 if(flag==0)
  403.                                 flag=8;
  404.                                 while(!key_s3);//松手检测               
  405.                         }        
  406.         }
  407.         
  408. }
  409. void main()
  410. {  
  411.         init();
  412.         while(1)
  413.         {
  414.                
  415.                 keyscan();
  416.                 delay(20);
  417.                 switch(flag)
  418.                         {
  419.                                      case 1: moshi0(); break;
  420.                                      case 2: moshi1(); break;
  421.                                      case 3: moshi2(); break;
  422.                                      case 4: moshi3(); break;
  423.                                      case 5: moshi4(); break;
  424.                                     case 6: moshi5(); break;
  425.                                       case 7: moshi6(); break;
  426.                                case 8: moshi7(); break;
  427.                                       default:break;
  428.                 }
  429.         }        


  430. }
复制代码



回复

使用道具 举报

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

本版积分规则