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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

51單片機(jī)+LCD1602日歷仿真小程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
SM8952A  c51仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


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

  4. 程序創(chuàng)建人 黨羽
  5. 創(chuàng)建時(shí)間   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è)置時(shí)分秒
  15. sbit K3 = P1^2;      //增加
  16. sbit K4 = P1^3;             //減少
  17. sbit K5 = P1^4;      //12小時(shí)制和24小時(shí)制
  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忙檢測(cè)
  24. void LCD_Initialize();                 //初始化
  25. void LCD_Set_POS(uchar);               //設(shè)置位置
  26. void LCD_Write_Command(uchar);         //寫(xiě)命令
  27. void LCD_Write_Data(uchar);                   //寫(xiě)數(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小時(shí)制am時(shí)間字符串
  31. uchar HMSpm_String[] = "pm  00:00:00";             //待顯示的12小時(shí)制pm時(shí)間字符串
  32. uchar HMS24_String[] = "    00:00:00   ";         //待顯示的24小時(shí)制時(shí)間字符串
  33. /*0表示不修改1表示修改*/
  34. bit Settime = 0;                                                 //是否修改時(shí)間
  35. /*待顯示的年月日時(shí)分秒的默認(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. /*按鍵計(jì)數(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 表示修改時(shí)
  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í)函數(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忙檢測(cè)函數(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寫(xiě)命令函數(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寫(xiě)數(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í)分秒函數(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í)間函數(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. //定時(shí)器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. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼


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


評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩亚洲国产综合 | 亚洲国产一区二区三区 | 91xxx在线观看 | 日韩中文字幕在线观看视频 | 久久日本 | 一区二区三区小视频 | 日韩一级免费观看 | 亚洲欧洲日韩 | 在线观看亚洲精品 | 日韩在线观看一区 | 欧美性一区二区三区 | 99tv | 国产在线aa | 国产精品久久久久久久久大全 | 精品毛片在线观看 | 亚洲一区高清 | 亚洲成人av在线播放 | 羞羞的视频免费在线观看 | www国产亚洲精品久久网站 | 午夜私人影院在线观看 | 久久福利| 久久婷婷色 | 成人精品鲁一区一区二区 | 欧美激情精品久久久久 | 日日干日日操 | 欧美日韩在线观看一区 | 99久久久国产精品免费消防器 | 日韩精品免费 | www中文字幕 | 青青久草 | 精品亚洲一区二区 | 人妖av| 亚洲一区二区三区免费在线观看 | 一区日韩 | 国产精品a久久久久 | 亚洲精品久久嫩草网站秘色 | 亚洲视频中文字幕 | 欧美成人免费电影 | 男人的天堂视频网站 | 中文字幕一区二区三区不卡 | 国产精品精品3d动漫 |