找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)+LCD12864指針數(shù)字切換萬年歷程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
電路圖在附件

制作出來的實(shí)物圖如下:


單片機(jī)源程序如下:
  1. /*
  2. *******************************************************************************
  3. *                     “冬松電子工作室”        傾情奉獻(xiàn)
  4. *
  5. *                  配套 LCD12864電子萬年歷時(shí)鐘電路板
  6. *
  7. * 文 件 名:calendarMain.c
  8. * 描    述: LCD12864電子萬年歷時(shí)鐘工程主文件
  9. * 功    能:初始化定時(shí)器0,及中斷服務(wù)程序(用于鬧鐘),主函數(shù)調(diào)用
  10. * 咨詢電話:135-91697612
  11. *******************************************************************************
  12. */
  13. #include "clock.h"
  14. #include "calendar.h"
  15. #include "key.h"
  16. #include "lcd.h"
  17. #include "zhen.h"
  18. #include "sensor.h"
  19. uchar alarmStyle;   //定義蜂鳴器報(bào)警方式
  20. /****************************************************************************/
  21. sbit bell=P1^0;  //定義蜂鳴器端口
  22. /****************************************************************************
  23. * 名稱:void Timer0_Initial(void)
  24. * 功能:初始化timer0
  25. * 入口函數(shù):無
  26. * 出口函數(shù):無
  27. ****************************************************************************/
  28. void Timer0_Initial(void)
  29. {
  30.         TMOD=0x01;  //Timer0工作方式1定時(shí)
  31.         TH0 =0x4c;
  32.         TL0 =0x00;  //定時(shí)50 ms
  33.         ET0 =1;     //Timer0開中斷
  34.         TR0 =1;     //timer0啟動(dòng)
  35. }
  36. /*****************************************************************************
  37. * 名稱: Timer0_Overflow() inturrupt 1
  38. * 功能: 中斷服務(wù)程序 1.整點(diǎn)報(bào)時(shí) 三聲嘟嘟的聲音  2.鬧鐘報(bào)時(shí),持續(xù)一分鐘
  39. * 入口參數(shù):無
  40. * 出口參數(shù):無
  41. *****************************************************************************/
  42. void Timer0_Overflow() interrupt 1
  43. {
  44.         TH0 = 0x4c;
  45.         TL0 = 0x00; //延時(shí) 50 ms
  46.         bell=~bell;        //進(jìn)入中斷,蜂鳴器取反,達(dá)到蜂鳴器間歇工作目的
  47.         
  48. }
  49. /******************************************************************************
  50. * 函數(shù)名稱: main()
  51. * 功    能: 主函數(shù)
  52. * 入口參數(shù): 無
  53. * 出口參數(shù): 無
  54. ********************************************************************************/
  55. void main()
  56. {        
  57.     uchar clock_time[7] = {0x00,0x11,0x20,0x01,0x02,0x01,0x16};  //定義時(shí)間變量 秒 分 時(shí) 日 月 周 年
  58.     uchar alarm_time[3]; //鬧鐘設(shè)置 alarm_time[0]:分鐘  alarm_time[1]:小時(shí)
  59.         uchar temperature[2];//定義溫度變量temperature[0]為低8位,temperature[1]為高8位
  60.         uchar i, j;
  61.         uchar CALL[3]; //存儲(chǔ)三畫面狀態(tài)(開和閉)數(shù)組
  62. //        bell = 1;
  63. //        lcd = 1;
  64. //        psb = 1; //12864采用并口輸出方式
  65. //  cs2 = 0;
  66.         Timer0_Initial();        //初始化定時(shí)器0
  67.         v_Lcd12864Init_f(); //12864初始化
  68.         port = 0xFF;        //釋放P0端口
  69.         Lcd_Write_Command(0x36); //采用擴(kuò)充指令集,繪圖開,清除模擬指針畫面字符
  70.         delay_1ms(2);            //延時(shí)2ms
  71.         Lcd_Write_Command(0x36); //采用擴(kuò)充指令集,繪圖開,需設(shè)定兩次,先改DL,再改RE
  72.         delay_1ms(2);                          //延時(shí)2ms
  73.         cls();                   //清屏,為顯示做準(zhǔn)備
  74.         key_init();                             //初始化鍵盤掃描程序變量
  75. //  Set1302(clock_time);     //時(shí)鐘初試化
  76.         CALL1[0] = R1302(0xc7);        //讀取DS1302的RAM中 畫面一 狀態(tài)值
  77.         CALL1[1] = R1302(0xc9);        //讀取DS1302的RAM中 畫面二 狀態(tài)值
  78.         CALL1[2] = R1302(0xcb);        //讀取DS1302的RAM中 畫面三 狀態(tài)值
  79.         if(((CALL1[0]==1)||(CALL1[1]==1))&&(CALL1[2]==0)) //第一、二個(gè)畫面
  80.         {
  81.             frame_and_scale_f(); //繪制出邊框,和刻度
  82.         }                    
  83.         alarmStyle=0x00; //初始化報(bào)警方式,此時(shí)不報(bào)警
  84.         EA = 0;                         //關(guān)閉總中斷
  85.     while( 1 )
  86.         {                  
  87.                 CALL[0] = R1302(0xc1);        //讀取DS1302的RAM中 分 鬧鐘值
  88.                 CALL[1] = R1302(0xc3);        //讀取DS1302的RAM中 時(shí) 鬧鐘值
  89.                 CALL[2] = R1302(0xc5);        //讀取DS1302的RAM中 開和閉 狀態(tài)值
  90.                 CALL1[0] = R1302(0xc7);        //重新讀取DS1302的RAM中 畫面一 狀態(tài)值
  91.                 CALL1[1] = R1302(0xc9);        //重新讀取DS1302的RAM中 畫面二 狀態(tài)值
  92.                 CALL1[2] = R1302(0xcb);        //重新讀取DS1302的RAM中 畫面三 狀態(tài)值
  93.                 Get1302(clock_time);    //獲取 秒 分 時(shí) 日 月 周 年 的時(shí)鐘數(shù)據(jù)
  94.                 Lcd_Clock(clock_time);        //時(shí)鐘顯示
  95.                 Sensor_Fresh(temperature);    //溫度更新,讀取溫度
  96.                 Lcd_Temperature(temperature); //顯示溫度
  97.                 Conversion(0,clock_time[6],clock_time[4],clock_time[3]); //輸入BCD陽歷數(shù)據(jù),輸出BCD陰歷數(shù)據(jù)
  98.                 Conver_week(0,clock_time[6],clock_time[4],clock_time[3]);//輸入BCD陽歷數(shù)據(jù),輸出BCD星期數(shù)據(jù)
  99.                    if(KEY_FUNC==Key_Scan()) //如果按鍵作值KEY_FUNC(0x08)與按鍵掃描Key_Scan()數(shù)對(duì)比相等(也是0x08),
  100.                 {
  101.                         while(KEY_FUNC==Key_Scan()); //KEY_FUNC和Key_Scan()的值相等,就在這里等待,按鍵抬起就執(zhí)行下面語句,
  102.                         Key_Function(clock_time, alarm_time); //則進(jìn)入功能選擇菜單
  103.                 }
  104.                 if(KEY_UP == Key_Scan()) //如果按鍵作值KEY_UP(0x01)與按鍵掃描Key_Scan()數(shù)對(duì)比相等(也是0x01),
  105.                 {   
  106.                         lcd = 1; //打開液晶背光燈        
  107.                 }
  108.                 if(KEY_DOWN == Key_Scan()) //如果按鍵作值KEY_DOWN(0x02)與按鍵掃描Key_Scan()數(shù)對(duì)比相等(也是0x02),
  109.                 {
  110.                         lcd = 0; //關(guān)閉液晶背光燈        
  111.                 }
  112.                 if(((CALL1[0]==1)||(CALL1[1]==1))&&(CALL1[2]==0)) //第一、二個(gè)畫面
  113.                 {
  114.                     frame_and_scale_f(); //繪制出邊框,和刻度
  115.                         zhizhen();
  116.                 }                        
  117.                 if(((CALL1[0]==0)||(CALL1[1]==0))&&(CALL1[2]==1)) //第三個(gè)畫面
  118.                 {        
  119.                         Lcd_Write_Command(0x34); //采用擴(kuò)充指令集,繪圖關(guān)
  120.                         Lcd_Write_Command(0x30); //基本指令集                                
  121.                 }                 
  122.                 if((*clock_time==0x59)&&(*(clock_time+1)==0x59)) //比較秒和分?jǐn)?shù)據(jù)到59,整點(diǎn)報(bào)時(shí)
  123.                 {
  124.                         EA = 1;                //打開總中斷
  125.                         bell = 0;        //打開蜂鳴器
  126.                 }
  127.                 else
  128.                 {
  129.                         EA = 0;                //關(guān)閉總中斷
  130.                         bell = 1;        //關(guān)閉蜂鳴器
  131.                 }  
  132.                 //鬧鐘報(bào)警
  133.                 i = clock_time[1]; //分鐘數(shù)據(jù)傳遞給變量 i
  134.                 j = clock_time[2]; //小時(shí)數(shù)據(jù)傳遞給變量 j
  135.                 i = bcd_hex(i);    //分鐘數(shù)據(jù)轉(zhuǎn)換成十進(jìn)制數(shù)
  136.                 j =bcd_hex(j);     //小時(shí)數(shù)據(jù)轉(zhuǎn)換成十進(jìn)制數(shù)
  137.                 //不轉(zhuǎn)換鬧鐘調(diào)整數(shù)據(jù)和DS1302鬧鈴存儲(chǔ)的鬧鐘數(shù)據(jù)不同,鬧鐘不響
  138.                 if(CALL[2] == 0) //如果鬧鐘狀態(tài)是 “開”
  139.                 {                                                                                   
  140.                         if(( CALL[0] ==  i)&&( CALL[1]  == j)) //時(shí)鐘分鐘和小時(shí)與DS13202存儲(chǔ)的鬧鐘值相吻合,
  141.                         {         
  142.                                 EA = 1;                //打開總中斷
  143.                                 bell = 0;        //打開蜂鳴器
  144.                         }                    
  145.                 }
  146.                 else   //否則鬧鐘狀態(tài)是 “關(guān)”
  147.                 {
  148.                         EA = 0;                //關(guān)閉總中斷
  149.                         bell = 1;        //關(guān)閉蜂鳴器
  150.                 }                  
  151.         }        
  152. }
復(fù)制代碼

所有資料51hei提供下載:
指針數(shù)字切換萬年歷.rar (114.42 KB, 下載次數(shù): 216)


評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:688460 發(fā)表于 2020-5-2 11:07 | 只看該作者
感謝分享!最近正想學(xué)習(xí)一下LC方面的知識(shí)。謝謝了!
回復(fù)

使用道具 舉報(bào)

板凳
ID:722330 發(fā)表于 2020-10-26 21:37 | 只看該作者
感謝分享!最近正想學(xué)習(xí)一下LC方面的知識(shí)。謝謝了!
回復(fù)

使用道具 舉報(bào)

地板
ID:230742 發(fā)表于 2021-3-7 15:49 | 只看該作者
收藏一下。有空也學(xué)習(xí)學(xué)習(xí)指針鐘。
回復(fù)

使用道具 舉報(bào)

5#
ID:28992 發(fā)表于 2021-3-8 00:07 | 只看該作者
download for study, thank you so much.
回復(fù)

使用道具 舉報(bào)

6#
ID:938030 發(fā)表于 2021-6-15 16:29 | 只看該作者
附件里是只有電路圖嗎
回復(fù)

使用道具 舉報(bào)

7#
ID:230742 發(fā)表于 2021-6-18 00:53 | 只看該作者
1302的電源有一個(gè)穩(wěn)壓二極管是什么作用?
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表