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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4318|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

51單片機+LCD1602日歷仿真小程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:383779 發(fā)表于 2018-8-7 13:28 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
SM8952A  c51仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. /*calendar.c文件的功能是通過定時器實現(xiàn)日歷功能,具體描述如下:
  2. 1:實現(xiàn)通過按鍵調(diào)整時間;
  3. 2:可以實現(xiàn)24小時制和12小時制切換

  4. 程序創(chuàng)建人 黨羽
  5. 創(chuàng)建時間   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;                 //設(shè)置年月日星期
  14. sbit K2 = P1^1;             //設(shè)置時分秒
  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);               //設(shè)置位置
  26. void LCD_Write_Command(uchar);         //寫命令
  27. void LCD_Write_Data(uchar);                   //寫數(shù)據(jù)函數(shù)

  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. /*待顯示的年月日時分秒的默認(rèn)值*/
  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. /*按鍵計數(shù)
  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. //延時函數(shù)
  55. void DelayMS(uint x)
  56. {
  57.         uchar i;

  58.         while(x--)
  59.         {
  60.                 for(i = 0; i < 120; i++);
  61.         }
  62. }                                                               
  63. //LCD忙檢測函數(shù)
  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忙等待函數(shù)
  77. void LCD_Busy_Wait()
  78. {
  79.          while((LCD_Busy_Check() & 0x80) == 0x80);
  80.         DelayMS(5);
  81. }
  82. //LCD寫命令函數(shù)
  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寫數(shù)據(jù)函數(shù)
  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初始化配置函數(shù)
  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坐標(biāo)設(shè)置函數(shù)
  119. void LCD_Set_POS(uchar Position)
  120. {
  121.         LCD_Write_Command(Position | 0x80);
  122. }
  123. //LCD顯示數(shù)據(jù)函數(shù)
  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. //蜂鳴器控制函數(shù)
  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. //顯示時分秒函數(shù)
  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. //顯示年月日星期函數(shù)
  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. //調(diào)整時間函數(shù)
  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黑下載附件…………
復(fù)制代碼


所有資料51hei提供下載:
case 1.rar (55.49 KB, 下載次數(shù): 50)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:300015 發(fā)表于 2018-11-8 09:04 | 只看該作者
真沒勁,分享出來整一堆只讀,無法修改編譯有意思嗎??不過還是感謝你分享
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久久国产一区二区三区四区 | 91久久精品 | 亚洲国产成人久久久 | 午夜日韩 | 99一级毛片| 欧美中文字幕 | 成人免费小视频 | 亚洲欧洲中文日韩 | 色中文在线 | 国产精品美女久久久久久免费 | 日韩欧美视频 | 男人亚洲天堂 | 国产综合久久 | 国产一级在线 | 99热视| 亚洲iv一区二区三区 | 天堂一区二区三区 | 国产特一级黄色片 | 欧美精品久久久久久久久久 | 日韩中文字幕在线播放 | 91影院 | 精品国产乱码久久久久久闺蜜 | 韩日一区二区三区 | 国产免费拔擦拔擦8x高清 | 国产成人艳妇aa视频在线 | 精品中文字幕一区 | 久久夜视频| 精品久久不卡 | 啪啪免费网站 | 玖玖国产 | 亚洲国产欧美日韩 | 久久久久久久国产精品 | 精品中文字幕在线 | 99精品在线免费观看 | 国产在线一级片 | 成人h视频 | 国产精品一区二区三区四区 | www,黄色,com| 国产91久久久久久 | 国产精品一区二区久久精品爱微奶 | 午夜影视免费片在线观看 |