微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 1602LCD设计的可调式电子钟无法显示时间

1602LCD设计的可调式电子钟无法显示时间

时间:10-02 整理:3721RD 点击:

  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define DelayNOP(){_nop_();_nop_();_nop_();_nop_();}
  6. sbit K1 =P1^0;
  7. sbit K2 =P1^1;
  8. sbit K3 =P1^2;
  9. sbit K4 =P1^3;
  10. sbit SPK =P3^0;
  11. sbit LCD_RS =P2^0;
  12. sbit LCD_RW =P2^1;
  13. sbit LCD_EN =P2^2;
  14. bit LCD_Busy_Check();
  15. void LCD_Initialize();
  16. void LCD_Set_POS(uchar);
  17. void LCD_Write_Command(uchar);
  18. void LCD_Write_Data(uchar);
  19. void Display_String(uchar *,uchar);
  20. uchar code Str1[]="  Current Time  ";
  21. uchar code Str2[]="Set New Time...";
  22. uchar HMS_String[]="  12:30:00  ";
  23. bit Settime=0;
  24. bit Change_H_or_M=1;
  25. uchar MilliSecond, Hour=12, Minute=30, Second=0;
  26. void DelayX(uint x)
  27. {
  28. uchar i;
  29. while(x--) for(i=0;i<120;i++);
  30. }
  31. void Display_HMS(uchar h,m,s)
  32. {
  33. if (Settime) HMS_String[3]='>';
  34. else   
  35. HMS_String[3]=' ';
  36. HMS_String[4]=h/10+'0';
  37. HMS_String[5]=h%10+'0';
  38. HMS_String[7]=m/10+'0';
  39. HMS_String[8]=m%10+'0';
  40. HMS_String[10]=s/10+'0';
  41. HMS_String[11]=s%10+'0';
  42. Display_String(HMS_String,0x40);
  43. }
  44. void Change_Time()
  45. {
  46. Settime=0;
  47. if(K1==0||K2==0||K3==0)
  48. {TR0=0;
  49. Display_String(Str2,0x00);
  50. Settime=1;
  51. }
  52. while(Settime)
  53. {
  54. if(K1==0)
  55. {
  56. while(K1==0);
  57. Change_H_or_M =!Change_H_or_M;
  58. }
  59. else if(K2==0)
  60. {
  61. while(K2==0);
  62. if(Change_H_or_M==1)
  63. { if(++Hour==24)Hour=0;}
  64. else
  65. {if(++Minute==60)Minute=0;}
  66. }
  67. else if (K3==0)
  68. {
  69. while(K3==0);
  70. if(Change_H_or_M==1)
  71. { if(--Hour==0xff)Hour=23;}
  72. else
  73. {if(--Minute==0xff)Minute=59;}
  74. }
  75. else if(K4==0)
  76. {
  77. while(K4==0);
  78. Display_String(Str1,0x00);
  79. Settime=0;
  80. TR0=1;
  81. }
  82. Display_HMS(Hour,Minute,Second);
  83. }
  84. }
  85. void Time0() interrupt 1
  86. {
  87. TH0=(65536-50000)/256;
  88. TL0=(65536-50000)%256;
  89. if(++MilliSecond==20)
  90. {
  91.    MilliSecond=0;
  92.    if(++Second==60)
  93.    {
  94.    Second=0;
  95.         if(++Minute==60)
  96.         {
  97.         Minute=0;
  98.         if(++Hour==24)
  99.         {
  100.         Hour=0;Minute=0;Second=0;
  101.         }
  102.         }
  103.         }
  104.         }
  105.         }
  106.    void main()
  107.    {
  108.    TMOD=0x01;
  109.    TH0=(65536-50000)/256;
  110.    TL0=(65536-50000)%256;
  111.    IE=0x82;
  112.    SPK=0;
  113.    LCD_Initialize();
  114.    Display_String(Str1,0x00);
  115.    TR0=1;
  116.    P1=0xFF;
  117.    while(1);
  118.    {
  119.    Display_HMS(Hour,Minute,Second);
  120.    DelayX(500);
  121.    Change_Time();
  122.    }
  123.    }

复制代码

  1. //    1602LCD显示驱动函数
  2. #include<reg51.h>
  3. #include<intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define DelayNOP( ){_nop_( ); _nop_( ); _nop_( ); _nop_( );}
  7. sbit LCD_RS = P2^0;
  8. sbit LCD_RW = P2^1;
  9. sbit LCD_EN = P2^2;
  10. bit LCD_Busy_Check( );
  11. void LCD_Initialize( );
  12. void LCD_Set_POS(uchar);
  13. void LCD_Write_Command(uchar);
  14. void LCD_Write_Date(uchar);
  15. // 延时
  16. void DelayMS(uint ms)
  17. {
  18.   uchar t;
  19.   while(ms--) for (t =0;t < 120;t++);
  20. }
  21. // LCD忙检查
  22. bit LCD_Busy_Check( )
  23. {
  24.         bit Result;
  25.         LCD_RS = 0; LCD_RW = 1; LCD_EN = 1;DelayNOP( );
  26.         Result = (bit)(P0 & 0x80);
  27.         LCD_EN = 0;
  28.         return Result;
  29. }
  30. // 向LCD写指令
  31. void LCD_Write_Command(uchar cmd)
  32. {
  33.         while(LCD_Busy_Check() );
  34.         LCD_RS = 0; LCD_RW = 0; LCD_EN = 0;
  35.         _nop_( ); _nop_( );
  36.         P0 = cmd;  DelayNOP( );
  37.         LCD_EN = 1;DelayNOP( );
  38.         LCD_EN = 0;
  39. }
  40. // 向LCD写数据
  41. void LCD_Write_Date(uchar str)
  42. {
  43.         while(LCD_Busy_Check() );
  44.         LCD_RS = 1; LCD_RW = 0; LCD_EN = 0;P0 = str; DelayNOP( );
  45.         LCD_EN = 1; DelayNOP( );LCD_EN = 0;
  46. }
  47. // 初始化LCD
  48. void LCD_Initialize( )
  49. {
  50.         DelayMS(5); LCD_Write_Command(0x38);
  51.         DelayMS(5); LCD_Write_Command(0x0c);
  52.         DelayMS(5); LCD_Write_Command(0x06);
  53.         DelayMS(5); LCD_Write_Command(0x01);
  54.         DelayMS(5);
  55. }
  56. // 设置显示位置
  57. void LCD_Set_POS(uchar Position)
  58. {
  59.         LCD_Write_Command(Position | 0x80);
  60. }
  61. //显示函数,在LCD指定行上显示字符串
  62. void Display_String(uchar *str,uchar LineNO)
  63. {
  64.   uchar k;
  65.   LCD_Set_POS(LineNO);
  66.   for (k = 0;k < 16;k++) LCD_Write_Date(str[k]);
  67. }

复制代码



试试自己设定一个时间来显示,看看是显示函数的问题,还是数据格式转换的问题

上一篇:stm32+华为3g模块mu509
下一篇:开箱试用!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top