久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

1602LCD+52單片機做的計時器(全程小白親自注釋)

查看數: 3886 | 評論數: 2 | 收藏 1
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2020-2-22 22:33

正文摘要:

“(分享文件)” 文章出自https://wenku.baidu.com/view/1e5616197375a417866f8f90.html 注釋是本人自己添加 按照初學小白的理解 通俗易懂 若有錯誤請各位指出以免誤人子 , 蜂鳴器  按鍵 沒有測試&n ...

回復

ID:639140 發表于 2022-5-3 17:33
溫故而知新 最近在家 又把注釋理解添加一遍 按照初學的水平做到注釋  很多人說注釋做到不規范,這個正常 因為我連規范是什么都不清楚 只當又做了一次筆記

單片機源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>  //intrins.h,函數,應用于程序設計,一般出現在C51單片機編程中,一般程序中需要使用到空指令_nop_();字符循環移位指令_crol_等時使用。
  3.                      //crol_ 字符循環左移
  4.                        //_cror_ 字符循環右移
  5.     //_irol_ 整數循環左移
  6.     //_iror_ 整數循環右移
  7.     //_lrol_ 長整數循環左移
  8.     //_lror_ 長整數循環右移
  9.     //_nop_ 空操作 (相當于8051 NOP 指令)
  10.     //_testbit_ 測試并清零位 (相當于8051 JBC 指令)


  11. #define uchar unsigned char

  12. #define uint unsigned int

  13. sbit RS=P2^6;

  14. sbit RW=P2^5;

  15. sbit EN=P2^7;  

  16. uchar code dis2[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};  //1-9

  17. uchar code p[]="-";//code 可以不加,加了之后就是固定了這個數組不能對其進行操作、、這個一定要注意。。。

  18. uchar j,k,kk,miao,miao1,fen,fen1,shi,shi1;

  19. void delay_ms(int x)//延時程序,延時1ms

  20.   {

  21.     uint i;

  22.     while(x--)

  23.     for(i=0;i<120;i++);
  24.    }  
  25.     uchar busy()//對LCD1602  判斷是否忙

  26.      {

  27.        uchar status; //聲明函數status

  28.        RS=0; //讀內部寄存器狀態算是讀指令選擇  RS=0指令選擇

  29.        RW=1; //讀操作

  30.        EN=1;//使能信號也就是開始工作的意思 ,讀操作一直高電平,寫操作只是高脈沖

  31.        delay_ms(1);

  32.        status=P0;  //status是子函數聲明的函數入口函數定義為P0,就是說p0是數據口 00-07 8個端子要是07是高電位就是1602忙碌 07是低電平就是閑,status是子函數聲明的函數入口

  33.        EN=0;       //讀操作完成 拉低使能信號,為下次工作做準備

  34.        return status; //return 返回函數 讀取完P0口數據返回主函數
  35.       }  
  36.       


  37.        void write_cmd(uchar cmd)//寫命令程序,首先對其進行判忙

  38.         {

  39.             while((busy()&0x80)==0x80);//對返回進行或運算判斷全1則1,如果為忙就進行等待


  40.             RS=0; //命令選擇

  41.             RW=0; //寫操作

  42.             EN=0;// 片選信號拉低準備工作

  43.             P0=cmd; //函數cmd的數據放到P0上

  44.             EN=1; //片選信號開始工作

  45.             delay_ms(1);

  46.             EN=0;//拉低片選為下次做準備
  47.          }  


  48. void write_data(uchar dat) //寫數據函數函數dat
  49.   {
  50.     while((busy()&0x80)==0x80); //忙判斷 或-全1則1

  51.     RS=1; //數據選擇

  52.     RW=0; //寫操作

  53.     EN=0; //片選信號

  54.     P0=dat; //P0讀取dat

  55.     EN=1; //開始傳送

  56.     delay_ms(1);

  57.     EN=0; //拉低片選信號
  58.   }  
  59. void canshu() //初始化1602函數  百度一大把
  60. {

  61. write_cmd(0x38); //寫命令函數 命令數據0X38=111000,初始化設置16*2顯示 5*7點陣,8為數據接口

  62. delay_ms(1);

  63. write_cmd(0x01);//清屏

  64. delay_ms(1);

  65. write_cmd(0x06);//指針自動加1

  66. delay_ms(1);

  67. write_cmd(0x0c);//開光標顯示 不顯示

  68. delay_ms(1);
  69. }  
  70. *****************************************************************************

  71.           這里沒有數據地址命令 因為數據地址再別的函數里面給定

  72. ********************************************************************************


  73. /*void xianshi(uchar x,uchar y,uchar *str) //*str是指針字符串的指針,xy可能是數據指針函數
  74. {

  75. uint i=0; //聲明函數i并且賦值0

  76. if(y==0) //當函數y=0時 為真  可能是寫在第一行的意思

  77. write_cmd(0x80|x); //執行命令x和0x80(1000 0000)相與 全1是1得出命令 執行

  78. if(y==1)  //當函數y=1時 為真  可能是寫在第二行的意思

  79. write_cmd(0xc0|x); //執行命令x和0xc0(1100 0000|x)相與 全1是1得出命令 執行 0xc0=0x80+0x40

  80. for(i=0;i<16;i++) //i值循環增加  不知所云

  81. {


  82. write_data(str[i]); //*str是指針字符串的指針,
  83.                     //str[i]的意思可能是把i變成字符串 當數據執行  出自百度介紹 不是很懂


  84. if(p=='\0') //字符串判斷結束標志  如果p的ascii碼為0  好像是把一個字符串賦值給數組:u8 str1[]={"0000.0000.000"};
  85.               //實際上數組str1在內存中的實際存放情況為:
  86.             // '\0'出自百度 介紹

  87.                //這后面的'\0'是由C編譯系統自動加上的。所以在用字符串賦初值時一般無須指定數組的長度, 而由系統自行處理。


  88. break;

  89. }
  90. } */  8*******************************************************

  91.      廢函數臥槽 剛發現源程序這個子函數開頭有斜杠 是個廢函數
  92.    

  93.      **************************************************************



  94. void aaa() interrupt 1 //定時器aaa函數中斷入口1
  95. {

  96.   TH0=(65535-50000)/256; //50ms一中斷

  97.    TL0=(65535-50000)%256;

  98.    if(++kk==40) //****************k先+在判斷是否=40 kk可能是中斷函數 先++在計算是為了從0開始計數 后++可能從1 開始   語法格式等同于   ++kk
  99.                  ********************kk是全局變量                                                                                  if(k=40)
  100.    {
  101.      miao++; //********************kk中斷40次時間秒自加1
  102.      
  103.      if(miao==10) //當個位=10
  104.        {
  105.           if(miao1++==5) //miao1 自加一次 直到5次以后秒數達到59 后條件導通程序往下一步走
  106.             {
  107.               if(fen++==10)
  108.                 {
  109.                   if(fen1++==5)
  110.                    {
  111.                      if(shi++==10)
  112.                       {
  113.               
  114.                        if(shi1++==1)
  115.                         {
  116.                           shi1=0;
  117.                            shi=0;
  118.                         }
  119.    
  120.                        shi=0;
  121.                       }
  122.                     fen1=0;
  123.                     }
  124.                      fen=0;
  125.                  }
  126.        miao1=0;
  127.        }
  128.       miao=0;
  129.       }
  130.       kk=0;
  131.      }
  132.     }
  133. void main()  
  134. {
  135. P1=0x00;//我自己加的  要不然 開機顯示小黑塊  前一個帖子 有介紹 理由參照6800開發板原理圖

  136. P2=0X06; //同上   

  137. canshu();// //初始化1602函數  百度一大把

  138. xianshi(0,0,p);//子函數 沒用  //

  139. xianshi(0,1,p+16);// 子函數 沒用
  140. EA=1;
  141.   
  142. ET0=1;

  143. TMOD=0x01;

  144. TH0=(65535-50000)/256;//如果不準可對其進行修改,比如4000可能更準確  TL0=(65535-50000)%256;

  145. TL0=(65535-50000)%256;  TR0=1;
  146.   while(1)
  147.    {
  148.      write_cmd(0x80|1); //*********************1000 0001  相與有1則一 這個是時的位置               光標起始位置加一是小時十位的位置
  149.    
  150.      write_data(dis2[shi]); //************* //dis2[]1-9數組名字 這個是時的顯示  
  151.                                 

  152.                                   write_data寫數據函數 數據內容是數組dis2(全局變量)
  153.                                 

  154.                                   shi也是全局變量 shi=1 顯示數組第一個字符1
  155.      
  156.      


  157. write_cmd(0x80|2);//10000010 也就是十六進制0x82代表時的個位顯示位置
  158.      
  159.      write_data(dis2[shi1]);//1-9數組選擇小時的個位
  160.      
  161.      write_cmd(0x80|3);//地址0x83 在這個地址上寫
  162.    
  163.      write_data(p[0]);//數據為第二個數組的0位 這個數組就一個-符號
  164.      write_cmd(0x80|4); //地址0x84  也就是分的十位
  165.      
  166.      write_data(dis2[fen1]); //寫數據函數 寫數組制定數據到分的十位
  167.      
  168.      write_cmd(0x80|5);//以下類同
  169.    
  170.      write_data(dis2[fen]);
  171.      
  172.      write_cmd(0x80|6);
  173.    
  174.      write_data(p[0]);
  175.      write_cmd(0x80|7);
  176.      
  177.      write_data(dis2[miao1]);

  178.      write_cmd(0x80|8);
  179.      write_data(dis2[miao]);
  180.     }
  181. }
復制代碼

ID:535242 發表于 2020-2-23 12:57
目前正在學習  加油

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人中文字幕av | 免费av手机在线观看 | 久久久久免费精品国产 | 日本一二区视频 | 黄色国产在线播放 | 欧美精品一区二区三区在线播放 | 毛片网站在线观看视频 | 国产一区二区高清在线 | 成人午夜影院 | 日韩在线视频一区二区三区 | 欧美国产精品一区二区三区 | 欧美1区| 中文字幕一区在线 | 欧美一区二区 | 国产综合久久久久久鬼色 | 91精品国产91久久综合桃花 | 亚洲成人播放器 | 天天躁日日躁狠狠的躁天龙影院 | 国产视频2021| 天天天操 | 麻豆视频在线看 | 天堂视频中文在线 | 亚洲精品av在线 | 色天天综合| 成人国产精品久久久 | 国产精品成人一区二区三区夜夜夜 | 99久久中文字幕三级久久日本 | 天天操天天干天天透 | 中文字幕一区二区三区四区五区 | 91精品国产综合久久香蕉922 | 国产成人精品高清久久 | 欧美一区二区三区在线看 | 欧美黄色一区 | 久久久久精 | 久久精品视频播放 | 久久天堂 | 国产高清在线观看 | 日本不卡高字幕在线2019 | 亚洲精品中文字幕 | 婷婷久久网 | 日日操日日干 |