找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2601|回复: 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. /*********************************************************/
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表