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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2526|回復: 0
收起左側

基于51單片機的1602刷屏顯示

[復制鏈接]
ID:349225 發表于 2018-6-11 14:43 | 顯示全部樓層 |閱讀模式
  1. /*描述:                                                           *
  2. *                                                                  *
  3. *   上電后液晶屏先顯示信息,接著按下S2,定時開始,再次按下       *
  4. *                                                                  *
  5. *   S2暫停,第3次按下顯示累積計時,第4次按下暫停計時,任何時候按下S3*
  6. *                                                                  *
  7. *   計數清零。                                                   *
  8. *                                         *
  9. *                                                                  *
  10. ************************************************************************/
  11. #include <reg51.h>
  12. #include <intrins.h>
  13. #define uchar unsigned char
  14. #define uint  unsigned int
  15. uchar KeyCount=0;
  16. sbit  S2 = P3^0;
  17. sbit  S3 = P3^1;
  18. sbit BEEP = P2^3;          //蜂鳴器
  19. uchar code  cdis1[ ] = {"  STOPWATCH  0  "};
  20. uchar code  cdis2[ ] = {"    QX-MCS51    "};
  21. uchar code  cdis3[ ] = {"TIME            "};
  22. uchar code  cdis4[ ] = {" BEGIN COUNT  1 "};
  23. uchar code  cdis5[ ] = {" PAUSE COUNT  2 "};
  24. uchar code  cdis6[ ] = {" BEGIN COUNT  3 "};
  25. uchar code  cdis7[ ] = {" PAUSE COUNT  4 "};
  26. uchar code  cdis8[ ] = {"                "};
  27. sbit LCD_RS = P3^5;            
  28. sbit LCD_RW = P3^6;
  29. sbit LCD_EN = P3^4;
  30. sbit dula=P2^6;
  31. sbit wela=P2^7;
  32. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  33. uchar display[] =  {0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  34. uchar display2[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  35. /*********************************************************
  36. 延時函數
  37. *********************************************************/
  38. void Delay(uint num)//延時函數
  39. {
  40.   while( --num );
  41. }
  42. /*********************************************************
  43. 蜂鳴器響一聲                                          
  44. **********************************************************/
  45. void beep()
  46. {
  47.     unsigned char y;
  48.     for (y=0;y<180;y++)
  49.     {
  50.       BEEP=!BEEP;                //BEEP取反
  51.    Delay(70);
  52.     }
  53.     BEEP=1;                      //關閉蜂鳴器
  54. }
  55. /*********************************************************
  56. 延時函數1
  57. *********************************************************/
  58. void delay1(int ms)
  59. {
  60.    unsigned char n;
  61.    while(ms--)
  62.    {
  63.      for(n = 0; n<250; n++)
  64.     {
  65.       _nop_();
  66.       _nop_();
  67.       _nop_();
  68.       _nop_();
  69.     }
  70.    }
  71. }
  72. /**********************************************************
  73. *                                                         *
  74. *寫指令數據到LCD                                          *
  75. *RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                     *
  76. *                                                         *
  77. **********************************************************/
  78. void lcd_wcmd(uchar cmd)
  79. {                          
  80. //   while(lcd_busy());
  81.     LCD_RS = 0;
  82. //    LCD_RW = 0;
  83.     LCD_EN = 0;
  84.     _nop_();
  85.     _nop_();
  86.     P0 = cmd;
  87.     delayNOP();
  88.     LCD_EN = 1;
  89.     delayNOP();
  90.     LCD_EN = 0;
  91.     Delay(10);
  92. }
  93. /**********************************************************
  94. *                                                         *
  95. *寫顯示數據到LCD                                          *
  96. *RS=H,RW=L,E=高脈沖,D0-D7=數據。                       *
  97. *                                                         *
  98. **********************************************************/
  99. void lcd_wdat(uchar dat)
  100. {                          
  101. //   while(lcd_busy());
  102.     LCD_RS = 1;
  103. //    LCD_RW = 0;
  104.     LCD_EN = 0;
  105.     P0 = dat;
  106.     delayNOP();
  107.     LCD_EN = 1;
  108.     delayNOP();
  109.     LCD_EN = 0;
  110.     Delay(10);
  111. }
  112. /**********************************************************
  113. *                                                         *
  114. *  LCD初始化設定                                          *
  115. *                                                         *
  116. **********************************************************/
  117. void lcd_init()
  118. {   
  119.    
  120.     LCD_RW = 0;
  121. dula=0;
  122.      wela=0;
  123.     delay1(15);   
  124.     lcd_wcmd(0x01);      //清除LCD的顯示內容            
  125.     lcd_wcmd(0x38);      //16*2顯示,5*7點陣,8位數據
  126.     delay1(5);
  127.     lcd_wcmd(0x38);         
  128.     delay1(5);
  129.     lcd_wcmd(0x38);         
  130.     delay1(5);
  131.     lcd_wcmd(0x0c);      //開顯示,不顯示光標  
  132.     delay1(5);
  133.     lcd_wcmd(0x01);      //清除LCD的顯示內容
  134.     delay1(5);
  135. }
  136. /**********************************************************
  137. *                                                         *
  138. *  設定顯示位置                                           *
  139. *                                                         *
  140. **********************************************************/
  141. void lcd_pos(uchar pos)
  142. {                          
  143.   lcd_wcmd(pos | 0x80);  //數據指針=80+地址變量
  144. }
  145. /********************************************************
  146. 顯示函數
  147. *********************************************************/
  148. void play()
  149. {
  150.    uchar  i;
  151.    for(i=0;i<6;i++)
  152.    {
  153.     display2[i]=display[i]+0x30;  
  154.    }
  155.    display2[7]=display[6]/10+0x30;   //時單位數據處理
  156.    display2[6]=display[6]%10+0x30;
  157.    
  158.    lcd_pos(0x45);
  159.    lcd_wdat(display2[7]);   //顯示時
  160.    lcd_wdat(display2[6]);
  161.    lcd_wdat(0x3a);          //顯示':'
  162.   
  163.    lcd_wdat(display2[5]);   //顯示分
  164.    lcd_wdat(display2[4]);
  165.    lcd_wdat(0x3a);          //顯示':'
  166.    lcd_wdat(display2[3]);   //顯示秒
  167.    lcd_wdat(display2[2]);
  168.    lcd_wdat(0x3a);          //顯示':'
  169.    lcd_wdat(display2[1]);   //顯示毫秒
  170.    lcd_wdat(display2[0]);  
  171. }
  172. /********************************************************
  173. 主函數
  174. *********************************************************/
  175. main()
  176. {
  177.    uchar m;
  178.   
  179.    TMOD=0x01;
  180.    TH0=0xdc; TL0=0x00;      //50ms定時   
  181.    EA=1; ET0=1;
  182.    lcd_init();
  183.    
  184.    lcd_pos(0x00);             //設置顯示位置為第一行
  185.    for(m=0;m<16;m++)
  186.    lcd_wdat(cdis1[m]);        //顯示字符
  187.    lcd_pos(0x40);             //設置顯示位置為第二行
  188.    for(m=0;m<16;m++)
  189.    {
  190.     lcd_wdat(cdis2[m]);        //顯示字符
  191.     delay1(60);
  192.    }
  193.    delay1(100);
  194.    lcd_pos(0x40);             //設置顯示位置為第二行
  195.    for(m=0;m<16;m++)
  196.    lcd_wdat(cdis3[m]);
  197.    while(1)
  198.    {   
  199.      if(S2==0)
  200.      {
  201.     KeyCount++;          //計數
  202.        beep();
  203.     delay1(100);   
  204.      
  205.        switch (KeyCount)
  206.        {
  207.         case 1:
  208.         TR0=1;              //啟動中斷
  209.         lcd_pos(0x00);
  210.      for(m=0;m<16;m++)
  211.         lcd_wdat(cdis4[m]);     
  212.         break;
  213.   
  214.         case 2:
  215.         TR0=0;              //停止中斷
  216.         lcd_pos(0x00);
  217.      for(m=0;m<16;m++)
  218.         lcd_wdat(cdis5[m]);     
  219.         break;
  220.       
  221.   case 3:
  222.         TR0=1;              //啟動中斷
  223.         lcd_pos(0x00);
  224.      for(m=0;m<16;m++)
  225.         lcd_wdat(cdis6[m]);     
  226.         break;
  227.         case 4:
  228.         TR0=0;              //停止中斷
  229.         lcd_pos(0x00);
  230.      for(m=0;m<16;m++)
  231.         lcd_wdat(cdis7[m]);     
  232.         break;
  233.      
  234.         default:  
  235.         TR0=0;                   //停止中斷
  236.         break;
  237.        }
  238.      }
  239.      if(S3==0)
  240.      {
  241.     TR0=0;                     //停止中斷
  242.        KeyCount=0;
  243.     for(m=0;m<8;m++)
  244.        display[m]=0x00;           //計時單元清零
  245.        lcd_pos(0x00);             //設置顯示位置為第一行
  246.        for(m=0;m<16;m++)
  247.        lcd_wdat(cdis1[m]);
  248.        beep();
  249.        delay1(100);              
  250.      }
  251.      play();
  252.    }
  253. }
  254. /*********************************************************
  255. *                                                        *
  256. * Time0中斷函數                                          *
  257. *                                                        *
  258. **********************************************************/
  259. void Time0(void) interrupt 1 using 0
  260. {
  261.    TH0=0xdc;               //10ms定時
  262.    TL0=0x00;
  263.    display[0]++;         //0.01S  
  264.    if(display[0]==10)
  265.    {
  266.     display[0]=0;
  267. display[1]++;         //0.1S
  268.    }
  269.    if(display[1]==10)
  270.    {
  271.     display[1]=0;
  272.     display[2]++;         //秒個位
  273.    }
  274.    if(display[2]==10)
  275.    {
  276.     display[2]=0;
  277.     display[3]++;         //秒十位
  278.    }
  279.    if(display[3]==6)
  280.    {
  281.     display[3]=0;
  282.     display[4]++;         //分個位
  283.    }
  284.    if(display[4]==10)
  285.    {
  286.     display[4]=0;
  287.     display[5]++;         //分十位
  288.    }
  289.    if(display[5]==6)
  290.    {
  291.     display[5]=0;
  292.     display[6]++;        //時
  293.    }
  294.    if(display[6]==24)
  295.    {
  296.      display[6]=0;
  297.    }
  298. }
  299. /*********************************************************/
復制代碼
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品一区二区三区中文在线 | 黄页网址在线观看 | 亚洲一区不卡 | 羞羞视频网站 | 福利二区 | 男女深夜网站 | 伊人久久免费视频 | 精品精品 | 成年人黄色免费视频 | 国产一区二区观看 | 久久99精品国产自在现线小黄鸭 | 欧美精品中文字幕久久二区 | 欧美国产日韩一区二区三区 | 一区二区久久 | 国家aaa的一级看片 h片在线看 | 国产91在线 | 欧美 | 麻豆一区二区三区精品视频 | 岛国毛片 | 欧美激情久久久 | 日韩成人免费视频 | 亚洲欧美一区二区三区在线 | 日韩精品一区二区三区视频播放 | 日韩在线中文字幕 | 欧美日韩在线一区二区 | 91精品在线播放 | 久久久精品视 | 久久精品视频在线播放 | 九色国产 | 免费观看一区二区三区毛片 | 夜夜爽99久久国产综合精品女不卡 | 91精品国产综合久久婷婷香蕉 | 午夜精品视频 | 亚洲高清一区二区三区 | 美女一级a毛片免费观看97 | 久久天堂网| 欧美精品一区二区三区在线 | 欧美精品导航 | 亚洲午夜精品 | 国产一区亚洲二区三区 | 欧美一区二区在线观看 | 精品二三区 |