找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2283|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于51單片機(jī)的1602顯示源代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:240991 發(fā)表于 2017-10-19 16:58 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

  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;//液晶寫(xiě)數(shù)據(jù)控制
  8. sbit s1=P3^0;//控制矩陣鍵盤(pán)的S9
  9. sbit s2=P3^1;//控制矩陣鍵盤(pán)的S13
  10. sbit s3=P3^2;//控制矩陣鍵盤(pán)的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";//初始化顯示時(shí)間
  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)//寫(xiě)指令函數(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)//寫(xiě)指數(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;//通過(guò)1602的資料顯示lcden初始為低


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


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


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


  125.           }


  126.   
  127.     }//4
  128.    
  129.        if(s1num!=0)//確認(rèn)s1鍵被按下
  130.           {//3
  131.             if(s2==0)//檢測(cè)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)//確定讓時(shí)加一
  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)//檢測(cè)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)//確定讓時(shí)加一
  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[]中的秒位正好在第十個(gè)字符位后面
  235.          }
  236.     }
  237.      


  238. }




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


  244. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表