標題: 基于51單片機的1602顯示源代碼 [打印本頁]

作者: 小小學(xué)究    時間: 2017-10-19 16:58
標題: 基于51單片機的1602顯示源代碼

  1. #include<reg52.h>
  2. #define uchar unsigned char//宏定義
  3. #define uint unsigned int//宏定義
  4. sbit dula=P2^6;//控制數(shù)碼管
  5. sbit wela=P2^7;
  6. sbit rs=P3^5;//控制液晶數(shù)據(jù)名命令選擇
  7. sbit lcden=P3^4;//液晶寫數(shù)據(jù)控制
  8. sbit s1=P3^0;//控制矩陣鍵盤的S9
  9. sbit s2=P3^1;//控制矩陣鍵盤的S13
  10. sbit s3=P3^2;//控制矩陣鍵盤的S17
  11. sbit rd=P3^7;//申明RD的位
  12. uchar count,date,shi,fen,miao,s1num;
  13. uchar code table[]=" 2017-10-17 MON";//初始化顯示日期
  14. uchar code table1[]="    19:28:20";//初始化顯示時間
  15. void delay(uint z)
  16. {
  17.     uint x,y;
  18.      for(x=z;x>0;x--)
  19.           for(y=110;y>0;y--);
  20. }
  21. void write_com(uchar com)//寫指令函數(shù)
  22. {
  23.      rs=0;//數(shù)據(jù)置低
  24.      lcden=0;//lcden拉低
  25.      P0=com;
  26.      delay(5);
  27.      lcden=1;//拉高
  28.      delay(5);//穩(wěn)定五毫秒
  29.      lcden=0;//拉低
  30.          
  31. }
  32. void write_date(uchar date)//寫指數(shù)據(jù)函數(shù)
  33. {
  34.      rs=1;//數(shù)據(jù)置高
  35.      lcden=0;//lcden拉低
  36.      P0=date;
  37.      delay(5);
  38.      lcden=1;//拉高
  39.      delay(5);//穩(wěn)定五毫秒
  40.      lcden=0;//拉低
  41.          
  42. }


  43. void init()
  44. {
  45.      uchar num;
  46.      dula=0;//關(guān)閉數(shù)碼管
  47.      wela=0;
  48.      lcden=0;//通過1602的資料顯示lcden初始為低


  49. /*  一定注意這里的賦值與程序開頭的自定義賦值,當(dāng)二者賦值一致的時候才會正常走動,不也一樣時就會出現(xiàn)錯誤,原因未知*/
  50.      fen=28;
  51.      miao=20;
  52.      shi=19;
  53. /***************************************************/
  54.      write_com(0x38);//設(shè)置16X2顯示,5X7點陣,8位數(shù)據(jù)接口
  55.      delay(5);
  56.      write_com(0x0c);//00001100開顯示,不顯示光標
  57.      write_com(0x06);//00000110,讀入一個字符后指針和光標都加一,整屏不移動
  58.      write_com(0x01);//清零,不清零會顯示出錯
  59.      write_com(0x80);//指針賦值,寫入地址,表示從第一行開始寫
  60.     for(num=0;num<15;num++)//第一行共需要15個顯示位,顯示位數(shù)一定要一一對應(yīng)
  61.         {
  62.             write_date(table[num]);//寫數(shù)據(jù)進去
  63.             delay(5);
  64.         }
  65.     write_com(0x80+0x40);//寫入第二行的地址
  66.     for(num=0;num<12;num++)//第二行共需要11個顯示位,顯示位數(shù)一定要一一對應(yīng),
  67.         {
  68.             write_date(table1[num]);//寫數(shù)據(jù)進去
  69.             delay(5);
  70.         }
  71.      TMOD=0x01;//采用定時器0的方式1
  72.      TH0=(65536-50000)/256;//裝初值
  73.      TL0=(65536-50000)%256;
  74.      EA=1;//開總中斷
  75.      ET0=1;//打開T0中斷
  76.      TR0=1;//啟動定時器0
  77.    
  78.   
  79. }


  80. void write_sfm(uchar add,uchar date)//寫動態(tài)數(shù)據(jù)到時分秒表中
  81. {
  82.    uchar shi,ge;//時、分、秒、都由兩個數(shù)字表示,分離開
  83.    shi=date/10;//分離出數(shù)據(jù)的十位
  84.    ge=date%10;//分離個位
  85.    write_com(0x80+0x40+add); //寫動態(tài)到第二行中
  86.    write_date(0x30+shi);//通過1602的字符手冊,讓十位顯示0(0x30),送數(shù)據(jù)到第二行
  87.    write_date(0x30+ge);//通過1602的字符手冊,讓個位顯示0(0x30),送數(shù)據(jù)到第二行
  88.      


  89. }
  90. void keyscan()//編寫按鍵控制時鐘函數(shù)
  91. {//5
  92.    rd=0;//讓RD接地,要控制那一列就讓那一列接地,通過矩陣鍵盤原理圖判斷   
  93.    if(s1==0)//檢測s1是否按下
  94.     {//4
  95.         s1num++;//每按下一次s1就加一
  96.         delay(5);//延時消抖
  97.         if(s1==0)//判斷s1確實被按下
  98.           {
  99.             
  100.              while(!s1);//檢測是否松手
  101.              if(s1num==1)//按下第一次讓秒閃爍
  102.                    {
  103.                   TR0=0;//關(guān)閉定時器,禁止時鐘繼續(xù)走動
  104.                   write_com(0x80+0x40+11);//控制第二行的第幾位
  105.                   write_com(0x0f);//顯示光標,并讓光標閃爍,0x0f來源于1602的原理圖
  106.                    }
  107.              if(s1num==2)//按下第二次讓分閃爍
  108.                   {
  109.                   TR0=0;//關(guān)閉定時器,禁止時鐘繼續(xù)走動
  110.                   write_com(0x80+0x40+8);//控制第二行的第幾位
  111.                   write_com(0x0f);//顯示光標,并讓光標閃爍,0x0f來源于1602的原理圖
  112.                   }
  113.              if(s1num==3)//按下第三次讓時閃爍
  114.                   {
  115.                    TR0=0;//關(guān)閉定時器,禁止時鐘繼續(xù)走動
  116.                    write_com(0x80+0x40+5);//控制第二行的第幾位
  117.                    write_com(0x0f);//顯示光標,并讓光標閃爍,0x0f來源于1602的原理圖
  118.                   }
  119.              if(s1num==4)//第四次按下,清零,讓光標不閃爍
  120.                  {
  121.                   s1num=0;//清零
  122.                   write_com(0x0c);//光標停止閃爍
  123.                   TR0=1;//開啟定時器,時鐘重新開始走動
  124.                  }


  125.           }


  126.   
  127.     }//4
  128.    
  129.        if(s1num!=0)//確認s1鍵被按下
  130.           {//3
  131.             if(s2==0)//檢測s2被按下
  132.               {//2
  133.                   delay(5);
  134.                   if(s2==0)//確定s2被按下
  135.                     {//1
  136.                          while(!s2);
  137.                          if(s1num==1)//確定讓秒加一
  138.                            {
  139.                              miao++;
  140.                                 if(miao==60)
  141.                                      miao=0;
  142.                              write_sfm(10,miao);
  143.                              write_com(0x80+0x40+10);
  144.                              
  145.                            }   
  146.                          if(s1num==2)//確定讓分加一
  147.                            {
  148.                              fen++;
  149.                              if(fen==60)
  150.                                      fen=0;
  151.                              write_sfm(7,fen);
  152.                              write_com(0x80+0x40+7);
  153.                            
  154.                            }  
  155.                          if(s1num==3)//確定讓時加一
  156.                            {
  157.                              shi++;
  158.                               if(shi==24)
  159.                                   shi=0;
  160.                               write_sfm(4,shi);
  161.                              write_com(0x80+0x40+4);
  162.                              
  163.                            }  
  164.                     }//1
  165.       
  166.               }//2
  167.            if(s3==0)//檢測s3被按下
  168.               {//2
  169.                   delay(5);
  170.                   if(s3==0)//確定s2被按下
  171.                     {//1
  172.                          while(!s3);
  173.                          if(s1num==1)//確定讓秒加一
  174.                            {
  175.                              miao--;
  176.                                 if(miao==0)
  177.                                      miao=60;
  178.                              write_sfm(10,miao);
  179.                              write_com(0x80+0x40+10);
  180.                              
  181.                            }   
  182.                          if(s1num==2)//確定讓分加一
  183.                            {
  184.                              fen++;
  185.                              if(fen==0)
  186.                                      fen=60;
  187.                              write_sfm(7,fen);
  188.                              write_com(0x80+0x40+7);
  189.                            
  190.                            }  
  191.                          if(s1num==3)//確定讓時加一
  192.                            {
  193.                              shi++;
  194.                               if(shi==0)
  195.                                   shi=24;
  196.                               write_sfm(4,shi);
  197.                              write_com(0x80+0x40+4);
  198.                              
  199.                            }  
  200.                     }//1
  201.       
  202.               }//2  
  203.           } //3     
  204.             
  205. }//5


  206. void main()
  207. {
  208.      init();
  209.       
  210.      while(1)
  211.     {
  212.          keyscan();
  213.          if(count==20)//判斷是否到了1秒
  214.          {
  215.             count=0;
  216.             miao++;
  217.               if(miao==60)//判斷是否到了一分鐘
  218.                    {
  219.                    miao=0;
  220.                    fen++;
  221.                    if(fen==60)
  222.                       {
  223.                          fen=0;
  224.                          shi++;
  225.                          if(shi==24)
  226.                             {
  227.                                shi=0;
  228.                               
  229.                             }
  230.                          write_sfm(4,shi);
  231.                        }
  232.                     write_sfm(7,fen);
  233.                    }
  234.              write_sfm(10,miao);//10表示table1[]中的秒位正好在第十個字符位后面
  235.          }
  236.     }
  237.      


  238. }




  239. void timer0() interrupt 1//選擇中斷源
  240. {
  241.       TH0=(65536-50000)/256;//裝初值
  242.       TL0=(65536-50000)%256;
  243.      count++;


  244. }
復(fù)制代碼





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1