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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4667|回復: 4
打印 上一主題 下一主題
收起左側

使用DS1302的時鐘單片機程序 Lcd1602液晶顯示

[復制鏈接]
跳轉到指定樓層
樓主
附件和圖發:


51單片機源程序:
  1. #include<reg52.h>

  2. struct sTime{  //日期時間結構體申明
  3.         unsigned int year;
  4.         unsigned char mon;
  5.         unsigned char day;
  6.         unsigned char hour;
  7.         unsigned char min;
  8.         unsigned char sec;
  9.         unsigned char week;
  10. };

  11. bit flag200ms = 1;         //200ms 定時標志
  12. struct sTime bufTime; //日期時間緩沖區
  13. unsigned char setIndex = 0;        //時間設置索引 0 0 就表示正常運行,
  14. unsigned char T0RH, T0RL;

  15. void RefreshTimeShow();
  16. void ConfigTimer0(unsigned int ms);
  17. extern void KeyScan();
  18. extern void KeyDriver();
  19. extern void InitLcd1602();
  20. extern void LcdOpenCursor();
  21. extern void LcdCloseCursor();
  22. extern void LcdSetCursor(unsigned char x, unsigned char y);
  23. extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
  24. extern void InitDS1302();
  25. extern void SetRealTime(struct sTime *time);
  26. extern void GetRealTime(struct sTime *time);

  27. void main()
  28. {
  29.         unsigned char psec = 0xaa;        //秒備份,初值 AA 確保首次讀取時間后刷新顯示

  30.         EA = 1;
  31.         ConfigTimer0(1);
  32.         InitLcd1602();
  33.         InitDS1302();
  34.         LcdShowStr(0, 0, "20  -  -   Week "); //初始化屏幕上固定不變的內容
  35.         LcdShowStr(4, 1, "  :  :  ");

  36.         while(1)
  37.         {
  38.                 KeyDriver();         //調用按鍵驅動
  39.                 if(flag200ms && (setIndex == 0))
  40.                 {                                                                 
  41.                         flag200ms = 0;                                 //每隔200ms且未處于設置狀態時,
  42.                         GetRealTime(&bufTime);             //獲取當前時間
  43.                         if(psec != bufTime.sec)                 //檢測到時間有變化時刷新顯示
  44.                         {
  45.                                 RefreshTimeShow();
  46.                                 psec = bufTime.sec;                //用當前值更新上次秒數
  47.                         }        
  48.                 }
  49.         }
  50. }
  51. /* 將一個BCD碼字節顯示到屏幕上,(x,y)-屏幕起始坐標,bcd-待顯示BCD碼 */
  52. void ShowBCDByte(unsigned char x, unsigned char y, unsigned char bcd)
  53. {
  54.         unsigned char str[4];

  55.         str[0] = (bcd >> 4) + '0';
  56.         str[1] = (bcd & 0x0f) + '0';
  57.         str[2] = '\0';
  58.         LcdShowStr(x, y, str);
  59. }

  60. void ShowBCDWeek(unsigned char x, unsigned char y, unsigned char bcd)
  61. {
  62.         unsigned char str[3];

  63.         str[0] = (bcd & 0x0f) + '0';
  64.         str[1] = '\0';
  65.         LcdShowStr(x, y, str);
  66. }
  67. /* 刷新日期時間的顯示         */
  68. void RefreshTimeShow()
  69. {
  70.         ShowBCDByte(2, 0, bufTime.year);
  71.         ShowBCDByte(5, 0, bufTime.mon);
  72.         ShowBCDByte(8, 0, bufTime.day);
  73.         ShowBCDByte(4, 1, bufTime.hour);
  74.         ShowBCDByte(7, 1, bufTime.min);
  75.         ShowBCDByte(10, 1, bufTime.sec);
  76.         ShowBCDWeek(15, 0, bufTime.week);               
  77. }
  78. /* 刷新當前設置位的光標指示    */
  79. void RefreshSetCursorShow()
  80. {
  81.         switch(setIndex)
  82.         {
  83.                 case 1: LcdSetCursor(2, 0); break;
  84.                 case 2: LcdSetCursor(3, 0); break;
  85.                 case 3: LcdSetCursor(5, 0); break;
  86.                 case 4: LcdSetCursor(6, 0); break;
  87.                 case 5: LcdSetCursor(8, 0); break;
  88.                 case 6: LcdSetCursor(9, 0); break;
  89.                 case 7: LcdSetCursor(4, 1); break;
  90.                 case 8: LcdSetCursor(5, 1); break;
  91.                 case 9: LcdSetCursor(7, 1); break;
  92.                 case 10: LcdSetCursor(8, 1); break;
  93.                 case 11: LcdSetCursor(15, 0); break;
  94.                 default: break;
  95.         }
  96. }        

  97. unsigned char DecrBCDHight(unsigned char bcd)
  98. {


  99.         if((bcd & 0xf0) > 0x00)
  100.         {
  101.                 bcd -= 0x10;
  102.         }
  103.         else
  104.         {
  105.                 if(setIndex == 1)
  106.                         bcd        |= 0x90;
  107.                 else if(setIndex == 3)
  108.                         bcd |= 0x10;
  109.                 else if(setIndex == 5)
  110.                         bcd |= 0x30;
  111.                 else if(setIndex == 7)
  112.                         bcd |= 0x20;
  113.                 else if((setIndex == 9))
  114.                         bcd |= 0x60;
  115.         }
  116.         
  117.         return bcd;
  118. }

  119. unsigned char DecrBCDLow(unsigned char bcd)
  120. {


  121.         if((bcd & 0x0f) > 0x00)
  122.         {
  123.                 bcd -= 0x01;
  124.         }
  125.         else if(setIndex == 11)
  126.         {
  127.                 bcd |= 0x07;
  128.         }
  129.         else
  130.         {
  131.                 bcd        |= 0x09;
  132.         }
  133.         
  134.         return bcd;
  135. }

  136. unsigned char IncrBCDHight(unsigned char bcd)
  137. {
  138.         if((setIndex == 1)&&((bcd & 0xf0)< 0x90))
  139.         {
  140.                         bcd += 0x10;
  141.         }
  142.         else if((setIndex == 3)&&(bcd < 0x10))
  143.         {
  144.                         bcd +=0x10;
  145.         }
  146.         else if((setIndex == 5)&&(bcd < 0x30))
  147.         {
  148.                         bcd += 0x10;
  149.         }
  150.         else if((setIndex == 7)&&(bcd < 0x20))
  151.         {
  152.                         bcd += 0x10;
  153.         }
  154.         else if(setIndex == 9)
  155.         {
  156.                         bcd += 0x10;
  157.         }                                   
  158.         else if(setIndex == 11)
  159.         {
  160.                 if(bcd < 0x07)
  161.                 {
  162.                         bcd++;
  163.                 }
  164.                 else
  165.                 {
  166.                         bcd = 0x01;
  167.                 }
  168.         }
  169.         else
  170.         {
  171.                 bcd        &= 0x0f;
  172.         }
  173.         
  174.         return bcd;
  175. }

  176. unsigned char IncrBCDLow(unsigned char bcd)
  177. {
  178.     if(setIndex != 11)
  179.         {
  180.                 if ((bcd&0x0F) < 0x09)
  181.                 bcd += 0x01;
  182.             else
  183.                 bcd &= 0xF0;
  184.         }
  185.         else
  186.         {
  187.                 if ((bcd&0x0F) < 0x07)
  188.                 bcd += 0x01;
  189.             else
  190.                 bcd &= 0x01;
  191.         }
  192.    
  193.     return bcd;
  194. }
  195. /* 遞增當前設置位的值          */
  196. void IncrSetTime()
  197. {
  198.         switch(setIndex)
  199.         {
  200.                 case 1: bufTime.year = IncrBCDHight(bufTime.year); break;
  201.                 case 2: bufTime.year = IncrBCDLow(bufTime.year); break;
  202.                 case 3:        bufTime.mon = IncrBCDHight(bufTime.mon); break;
  203.                 case 4:        bufTime.mon = IncrBCDLow(bufTime.mon); break;
  204.                 case 5: bufTime.day = IncrBCDHight(bufTime.day); break;
  205.                 case 6:        bufTime.day = IncrBCDLow(bufTime.day); break;
  206.                 case 7: bufTime.hour = IncrBCDHight(bufTime.hour); break;
  207.                 case 8:        bufTime.hour = IncrBCDLow(bufTime.hour); break;
  208.                 case 9: bufTime.min = IncrBCDHight(bufTime.min); break;
  209.                 case 10: bufTime.min = IncrBCDLow(bufTime.min); break;
  210.                 case 11: bufTime.week = IncrBCDLow(bufTime.week); break;
  211.                 default: break;
  212.         }
  213.         RefreshTimeShow();
  214.         RefreshSetCursorShow();
  215. }
  216. /* 遞減當前設置位的值           */
  217. void DecrSetTime()
  218. {
  219.         switch(setIndex)
  220.         {
  221.                 case 1: bufTime.year = DecrBCDHight(bufTime.year); break;
  222.                 case 2: bufTime.year = DecrBCDLow(bufTime.year); break;
  223.                 case 3:        bufTime.mon = DecrBCDHight(bufTime.mon); break;
  224.                 case 4:        bufTime.mon = DecrBCDLow(bufTime.mon); break;
  225.                 case 5: bufTime.day = DecrBCDHight(bufTime.day); break;
  226.                 case 6:        bufTime.day = DecrBCDLow(bufTime.day); break;
  227.                 case 7: bufTime.hour = DecrBCDHight(bufTime.hour); break;
  228.                 case 8:        bufTime.hour = DecrBCDLow(bufTime.hour); break;
  229.                 case 9: bufTime.min = DecrBCDHight(bufTime.min); break;
  230.                 case 10: bufTime.min = DecrBCDLow(bufTime.min); break;
  231.                 case 11: bufTime.week = DecrBCDLow(bufTime.week); break;
  232.                 default: break;
  233.         }
  234.         RefreshTimeShow();
  235.         RefreshSetCursorShow();
  236. }
  237. /* 左移設置位         */
  238. void LeftShiftTimeSet()
  239. {
  240.         if(setIndex != 0)
  241.         {
  242.                 if(setIndex > 1)
  243.                         setIndex--;
  244.                 else
  245.                         setIndex = 11;
  246.                 RefreshSetCursorShow();
  247.         }
  248. }
  249. /* 右移設置位           */
  250. void RightShifTimeSet()
  251. {
  252.         if(setIndex != 0)
  253.         {
  254.                 if(setIndex < 11)
  255.                         setIndex++;
  256.                 else
  257.                         setIndex = 1;
  258.                 RefreshSetCursorShow();        
  259.         }
  260. }
  261. /* 進入設置狀態         */
  262. void EnterTimeSet()
  263. {
  264.         setIndex = 2;          //把設置索引設置為2,即可進入設置狀態
  265.         LeftShiftTimeSet(); //再利用現成的左移操作移到位置1并完成顯示刷新
  266.         LcdOpenCursor();   //打開光標閃爍效果
  267. }
  268. /* 退出設置狀態,save-是否保存當前設置的時間值         */
  269. void ExitTimeSet(bit save) //save = 1 保存,save = 0 不保存
  270. {
  271.         setIndex = 0;           //把設置索引設置為0,即可退出設置狀態
  272.         if(save)                   //需保存時即把當前設置時間寫入DS1302
  273.                 SetRealTime(&bufTime);
  274.         LcdCloseCursor();        //關閉光標顯示
  275. }
  276. /* 按鍵動作函數,根據鍵碼執行相應的操作,keycode-按鍵鍵碼 */
  277. void KeyAction(unsigned char keycode)
  278. {
  279.         if((keycode >= '0')&&(keycode <= '9'))//不響應字符鍵
  280.         {}
  281.         else if((keycode == 0x26)) //向上鍵,遞增當前設置位的值
  282.         {
  283.                 IncrSetTime();
  284.         }
  285.         else if(keycode == 0x28)          //向下鍵,遞減當前設置位的值
  286.         {
  287.                 DecrSetTime();
  288.         }
  289.         else if(keycode == 0x25)        //向左鍵,向左切換設置位
  290.         {
  291.                 LeftShiftTimeSet();
  292.         }
  293.         else if(keycode == 0x27)   //向右鍵,向右切換設置位
  294.         {
  295.                 RightShifTimeSet();
  296.         }
  297.         else if(keycode == 0x0d)  //回車鍵,進入設置模式/啟用當前設置值
  298.         {
  299.                 if(setIndex == 0)         //不處于設置狀態時,進入設置狀態
  300.                 {
  301.                         EnterTimeSet();
  302.                 }
  303.                 else                        //已處于設置狀態時,保存時間并退出設置狀態
  304.                 {
  305.                         ExitTimeSet(1);
  306.                 }
  307.         }
  308.         else if(keycode == 0x1b) //Esc鍵,取消當前設置
  309.         {
  310.                 ExitTimeSet(0);
  311.         }
  312. }                           

  313. void ConfigTimer0(unsigned int ms)
  314. {
  315.         unsigned long tmp;

  316.         tmp = 11059200 / 12;
  317.         tmp = tmp * ms / 1000;
  318.         tmp = 65536 - tmp;
  319.         tmp = tmp + 28;
  320.         T0RH = (unsigned char)(tmp >> 8);
  321.         T0RL = (unsigned char)tmp;
  322.         TMOD = (TMOD & 0xf0)|0x01;
  323.         TH0 = T0RH;
  324.         TL0 = T0RL;
  325.         ET0 = 1;
  326.         TR0 = 1;
  327. }

  328. void IntTimer0() interrupt 1
  329. {
  330.         static unsigned char tmr200ms = 0;

  331.         TH0 = T0RH;
  332.         TL0 = T0RL;

  333.         KeyScan();
  334.         tmr200ms++;
  335.         if(tmr200ms >= 200)
  336.         {
  337.                 tmr200ms = 0;
  338.                 flag200ms = 1;
  339.         }
  340. }


復制代碼


下載:
時鐘.rar (4.99 KB, 下載次數: 37)



評分

參與人數 2黑幣 +115 收起 理由
JACKLI + 15 共享資料的黑幣獎勵!
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:308395 發表于 2018-4-26 16:37 | 只看該作者
沒有仿真,不知程序怎樣,沒看
回復

使用道具 舉報

板凳
ID:223788 發表于 2018-5-8 20:42 | 只看該作者
試了一下,效果還不錯,不過調日期的時候有一個小 bug ,但不影響使用。
回復

使用道具 舉報

地板
ID:359743 發表于 2018-6-26 21:51 | 只看該作者
這個有仿真圖嗎?我不知道怎么連線。
求樓主聯系qq 1575817894
可以給點好處
回復

使用道具 舉報

5#
ID:359743 發表于 2018-6-26 21:52 | 只看該作者
JACKLI 發表于 2018-5-8 20:42
試了一下,效果還不錯,不過調日期的時候有一個小 bug ,但不影響使用。

大神,這個仿真電路圖怎么弄啊?
1575817894 我的qq
求聯系
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品成人一区二区三区 | 国产良家自拍 | 国产日韩欧美 | 国产福利91精品 | 精品视频一区二区三区 | 免费观看一级黄色录像 | 99精品视频免费观看 | 国产成人免费网站 | 日韩一区二区在线播放 | 亚洲午夜精品一区二区三区他趣 | 国产男人的天堂 | 日韩一区二区三区四区五区六区 | 久久久久99 | 99久久久久 | 性xxxxx | 久久综合久久综合久久 | 玖玖综合网 | 久久久精品影院 | 紧缚调教一区二区三区视频 | 久久精品国产久精国产 | 精彩视频一区二区三区 | 羞羞视频一区二区 | 欧美13videosex性极品 | 久久精品亚洲精品 | 日韩电影一区二区三区 | 中文字幕亚洲视频 | 亚洲精品久久久久久久久久久 | 国产乱码精品一区二区三区五月婷 | 久久精品com| 一区二区三区国产好的精 | 人人精品 | 欧美日韩在线免费 | 欧美日韩精品在线一区 | 国产亚洲精品一区二区三区 | 中文字幕一区二区三区四区五区 | 日本黄色影片在线观看 | 亚洲欧美在线观看视频 | www四虎com| 亚洲成人日韩 | 午夜视频一区 | 亚洲精品一区二区在线观看 |