找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3591|回复: 1
收起左侧

51单片机+LCD1602日历仿真小程序

[复制链接]
ID:383779 发表于 2018-8-7 13:28 | 显示全部楼层 |阅读模式
SM8952A  c51仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

单片机源程序如下:
  1. /*calendar.c文件的功能是通过定时器实现日历功能,具体描述如下:
  2. 1:实现通过按键调整时间;
  3. 2:可以实现24小时制和12小时制切换

  4. 程序创建人 党羽
  5. 创建时间   2017-3-17
  6. */
  7. #include <reg51.h>
  8. #include <intrins.h>
  9. #include <string.h>

  10. #define uchar unsigned char
  11. #define uint unsigned int
  12. #define DelayNOP() {_nop_();_nop_();_nop_();_nop_();}

  13. sbit K1 = P1^0;                 //设置年月日星期
  14. sbit K2 = P1^1;             //设置时分秒
  15. sbit K3 = P1^2;      //增加
  16. sbit K4 = P1^3;             //减少
  17. sbit K5 = P1^4;      //12小时制和24小时制
  18. sbit K6 = P1^5;      //确定
  19. sbit SPK = P3^0;         //蜂鸣器
  20. sbit LCD_RS = P2^0;
  21. sbit LCD_RW = P2^1;
  22. sbit LCD_EN = P2^2;

  23. bit LCD_Busy_Check();                  //LCD忙检测
  24. void LCD_Initialize();                 //初始化
  25. void LCD_Set_POS(uchar);               //设置位置
  26. void LCD_Write_Command(uchar);         //写命令
  27. void LCD_Write_Data(uchar);                   //写数据函数

  28. uchar *WEEK[] = {"SUN", "***", "MON", "TUS", "WEN", "THU", "FRI", "SAT"};
  29. uchar YMD_String[] = {"  00-00-00    "};         //待显示的年月日字符串
  30. uchar HMSam_String[] = "am  00:00:00";             //待显示的12小时制am时间字符串
  31. uchar HMSpm_String[] = "pm  00:00:00";             //待显示的12小时制pm时间字符串
  32. uchar HMS24_String[] = "    00:00:00   ";         //待显示的24小时制时间字符串
  33. /*0表示不修改1表示修改*/
  34. bit Settime = 0;                                                 //是否修改时间
  35. /*待显示的年月日时分秒的默认值*/
  36. uchar MilliSecond =0;
  37. uchar idata FlashLcd = 0;
  38. uchar Hour = 0;
  39. uchar Minute = 0;
  40. uchar Second = 0;
  41. uchar Year = 17;
  42. uchar Month = 1;
  43. uchar Day = 1;
  44. uint i =0;
  45. /*按键计数
  46.   K1按下1次即Change_Y_OR_MO_OR_D_OR_W =1 表示修改年
  47.   K1按下2次即Change_Y_OR_MO_OR_D_OR_W =2 表示修改月
  48.   K1按下3次即Change_Y_OR_MO_OR_D_OR_W =3 表示修改日
  49.   K1按下4次即Change_Y_OR_MO_OR_D_OR_W =4 表示修改星期
  50.   K2按下1次即Change_H_OR_M =1 表示修改时
  51.   K2按下2次即Change_H_OR_M =2 表示修改分
  52. */
  53. uint Change_Y_OR_MO_OR_D_OR_W =0,Change_H_OR_M = 0;


  54. //延时函数
  55. void DelayMS(uint x)
  56. {
  57.         uchar i;

  58.         while(x--)
  59.         {
  60.                 for(i = 0; i < 120; i++);
  61.         }
  62. }                                                               
  63. //LCD忙检测函数
  64. bit LCD_Busy_Check()
  65. {
  66.     bit LCD_Status;

  67.     LCD_RS = 0;
  68.     LCD_RW = 1;
  69.     LCD_EN = 1;

  70.     DelayMS(1);

  71.     LCD_Status = P0 ;
  72.     LCD_EN = 0;

  73.     DelayMS(1);

  74.     return LCD_Status;
  75. }
  76. //LCD忙等待函数
  77. void LCD_Busy_Wait()
  78. {
  79.          while((LCD_Busy_Check() & 0x80) == 0x80);
  80.         DelayMS(5);
  81. }
  82. //LCD写命令函数
  83. void LCD_Write_Command(uchar cmd)
  84. {
  85.         LCD_Busy_Wait();

  86.         LCD_RS = 0;
  87.         LCD_RW = 0;
  88.         LCD_EN = 0;
  89.         P0 = cmd;
  90.         LCD_EN = 1;

  91.         DelayMS(1);

  92.         LCD_EN = 0;
  93. }
  94. //LCD写数据函数
  95. void LCD_Write_Data(uchar str)
  96. {
  97.         LCD_Busy_Wait();  

  98.         LCD_RS = 1;
  99.         LCD_RW = 0;
  100.         LCD_EN = 0;
  101.         P0 = str;
  102.         LCD_EN = 1;

  103.         DelayMS(1);

  104.         LCD_EN = 0;
  105. }  
  106. //LCD初始化配置函数
  107. void LCD_Initialize()
  108. {
  109.     LCD_Write_Command(0x38);
  110.         DelayMS(1);
  111.         LCD_Write_Command(0x0c);
  112.         DelayMS(1);
  113.         LCD_Write_Command(0x06);
  114.         DelayMS(1);
  115.         LCD_Write_Command(0x01);
  116.         DelayMS(1);        
  117. }
  118. //LCD坐标设置函数
  119. void LCD_Set_POS(uchar Position)
  120. {
  121.         LCD_Write_Command(Position | 0x80);
  122. }
  123. //LCD显示数据函数
  124. void Display_String(uchar * str, uchar LineNo)
  125. {
  126.         uchar k;

  127.         LCD_Set_POS(LineNo);

  128.         for(k = 0; k < 16; k++)
  129.         {
  130.                 LCD_Write_Data(str[k]);

  131.                 DelayMS(1);
  132.         }
  133. }
  134. //蜂鸣器控制函数
  135. void Beep()
  136. {
  137.         uchar i,j = 70;

  138.           for(i = 0; i < 200; i++)
  139.         {
  140.                 while(--j);
  141.                 SPK = ~SPK;
  142.         }

  143.         DelayMS(300);
  144.         
  145.         SPK = 0;
  146. }
  147. void Format_DateTime(uchar d,uchar *a)
  148. {
  149.         a[0] = d/10 +'0';
  150.         a[1] = d%10 + '0';
  151. }
  152. //显示时分秒函数
  153. void Display_HMS(uchar h, m, s)
  154. {
  155.         if( K5 == 1 )
  156.         {
  157.                 if(Settime) HMS24_String[3] = '>';
  158.                 else HMS24_String[3] = ' ';

  159.                 HMS24_String[4] = h/10 + '0';
  160.                 HMS24_String[5] = h%10 + '0';
  161.                 HMS24_String[7] = m/10 + '0';
  162.                 HMS24_String[8] = m%10 + '0';
  163.                 HMS24_String[10] = s/10 + '0';
  164.                 HMS24_String[11] = s%10 + '0';

  165.                 Display_String(HMS24_String,0x40);
  166.         }
  167.         else
  168.         {
  169.                 if( h < 12 )
  170.                 {
  171.                         if(Settime) HMSam_String[3] = '>';
  172.                         else HMSam_String[3] = ' ';

  173.                         HMSam_String[4] = h/10 + '0';
  174.                         HMSam_String[5] = h%10 + '0';
  175.                         HMSam_String[7] = m/10 + '0';
  176.                         HMSam_String[8] = m%10 + '0';
  177.                         HMSam_String[10] = s/10 + '0';
  178.                         HMSam_String[11] = s%10 + '0';

  179.                         Display_String(HMSam_String,0x40);
  180.                 }
  181.                  else
  182.                 {   
  183.                         h = h - 12 ;
  184.                         if(Settime) HMSpm_String[3] = '>';
  185.                         else HMSpm_String[3] = ' ';

  186.                         HMSpm_String[4] = h/10 + '0';
  187.                         HMSpm_String[5] = h%10 + '0';
  188.                         HMSpm_String[7] = m/10 + '0';
  189.                         HMSpm_String[8] = m%10 + '0';
  190.                         HMSpm_String[10] = s/10 + '0';
  191.                         HMSpm_String[11] = s%10 + '0';

  192.                         Display_String(HMSpm_String,0x40);
  193.                         
  194.                 }        
  195.         }
  196. }
  197. //显示年月日星期函数
  198. void Display_YMDW(uchar y,m,d,i)
  199. {
  200.         if(Settime) YMD_String[0] = '>';
  201.         else YMD_String[0] = ' ';

  202.     Format_DateTime(y,YMD_String+2);
  203.         Format_DateTime(m,YMD_String+5);
  204.         Format_DateTime(d,YMD_String+8);

  205.         strcpy(YMD_String + 11,WEEK[i]);
  206.         Display_String(YMD_String,0x00);
  207. }
  208. //调整时间函数
  209. void Change_Time()
  210. {
  211.         Settime = 0;

  212.         if( K1 == 0 || K2 == 0 )
  213.         {
  214.                 TR0 = 0;
  215.                 Settime = 1;
  216.         }

  217.         while(Settime)
  218.         {
  219.                 while(K1 == 0)
  220.                 {
  221.                         Beep();                                                                  
  222.                         while(K1 == 0);
  223.                         Change_Y_OR_MO_OR_D_OR_W++;
  224.                         K1 = 1;
  225.                 }
  226.                 while(K2 == 0)
  227.                 {
  228.                         Beep();                                                                  
  229.                         while(K2 == 0);
  230.                         Change_H_OR_M++;
  231.                         K2 = 1;
  232.                 }
  233.         
  234.                 if(K3 == 0 )
  235.                 {
  236.                    Beep();
  237.                    while( K3 == 0);

  238.                    switch(Change_Y_OR_MO_OR_D_OR_W)
  239.                    {
  240.                                    case 1:
  241.                                                   ++Year;
  242.                                         break;
  243.                                 case 2:
  244.                                                 {if (++Month >= 13) Month = 1;}
  245.                                         break;
  246.                                 case 3:
  247.                                                 {if (++Day >= 31) Day = 1;}
  248.                                         break;
  249.                                 case 4:
  250.                                                 {if (++i >= 8) i = 0;}
  251.                                         break;
  252.                    }

  253.                    switch(Change_H_OR_M)
  254.                    {
  255.                                    case 1:
  256.                                                   {if (++Hour >= 24) Hour = 0;}
  257.                                         break;
  258.                                 case 2:
  259.                                                 {if (++Minute >= 59) Minute = 0;}
  260.                                         break;
  261.                    }
  262.                 }
  263.                 else if(K4 == 0)
  264.                 {
  265.                         Beep();
  266.                         while(K4 == 0);
  267.                         switch(Change_Y_OR_MO_OR_D_OR_W)
  268.                     {
  269.                                    case 1:
  270.                                                   --Year;
  271.                                         break;
  272.                                 case 2:
  273.                                                 {if (--Month == 0x00) Month = 12;}
  274.                                         break;
  275.                                 case 3:
  276.                                                 {if (--Day == 0x00) Day = 31;}
  277.                                         break;
  278.                                 case 4:
  279.                                                 {if (--i == 0xff) i = 0;}
  280.                                         break;
  281.                     }

  282.                    switch(Change_H_OR_M)
  283.                    {
  284.                                    case 1:
  285.                                                   {if (--Hour == 0xff) Hour = 23;}
  286.                                         break;
  287.                                 case 2:
  288.                                                 {if (--Minute == 0xff) Minute = 59;}
  289.                                         break;
  290.                    }
  291.                 }
  292.                 else if(K6 == 0)
  293.                 {
  294.                         Beep();
  295.                         while( K6 == 0);
  296.                         Settime = 0;
  297.                         TR0 = 1;
  298.                 }

  299.                 Display_HMS(Hour,Minute,Second);
  300.                 Display_YMDW(Year,Month,Day,i);
  301.         }
  302. }
  303. //定时器0中断
  304. void Time0() interrupt 1
  305. {
  306.         TH0 = (65536 - 50000) / 256;
  307.         TL0 = (65536 - 50000) % 256;

  308.         if( ++MilliSecond == 20)
  309.         {
  310.                 MilliSecond = 0;
  311.                 if( ++Second == 60)
  312.                 {
  313.                         Second = 0;
  314.                         if( ++Minute == 60)
  315. ……………………

  316. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png

所有资料51hei提供下载:
case 1.rar (55.49 KB, 下载次数: 50)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:300015 发表于 2018-11-8 09:04 | 显示全部楼层
真没劲,分享出来整一堆只读,无法修改编译有意思吗??不过还是感谢你分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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