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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

帶農歷的電子萬年歷 單片機軟件程序與proteus仿真

  [復制鏈接]
跳轉到指定樓層
樓主
電子萬年歷軟件程序。整個軟件程序分模塊編寫:

      1.包含主程序模塊main.c

      2.日歷時鐘程序模塊ds1302.c

      3.年歷轉換程序模塊lunarc.c

      4.鍵盤處理程序模塊keyinput.c

      5.液晶顯示程序模塊12864.h

      6.字模模塊model.h




單片機主程序:
  1. #include <reg52.h>
  2. #include "12864.h"
  3. #include "model.h"
  4. #include "ds1302.h"
  5. #include "lunar.h"
  6. #include "keyinput.h"

  7. #define uchar unsigned char
  8. #define uint unsigned int
  9. #define NoUpLine         1
  10. #define UpLine           0
  11. #define NoUnderLine 1
  12. #define UnderLine        0
  13. #define FALSE        0
  14. #define TRUE    1

  15. uchar dispBuf[7];
  16. uchar T0_Count=0,Tmp_Count=0;
  17. bit T0_Flag,Tmp_Flag,Flash_Flag;

  18. SYSTIME sys;                   //系統日期
  19. SPDATE SpDat;                   //農歷日期

  20. bit Hour_Flag=TRUE,Min_Flag=TRUE,Sec_Flag=TRUE;           //設置時間標志
  21. bit Year_Flag=TRUE,Mon_Flag=TRUE,Day_Flag=TRUE;

  22. uchar State_Set=0;     //設置時、分、秒、日、月、年等狀態

  23. bit State_Flag=FALSE,Inc_Flag=FALSE,Dec_Flag=FALSE;        //三個按鍵是否按下的標志

  24. uchar code Mon2[2][13]={0,31,28,31,30,31,30,31,31,30,31,30,31,
  25.                                   0,31,29,31,30,31,30,31,31,30,31,30,31};

  26. /*****************************LCD顯示函數******************************
  27. 入口參數:
  28.                 cDat:                要顯示的數
  29.                 X:                        行數 0~7
  30.                 Y:          列數 0~127
  31.                 show_flag:  是否反白顯示,0反白,1不反白
  32.                 upline:         上劃線, 0表示帶上劃線
  33.                 underline:  下劃線, 0表示帶下劃線
  34. ***********************************************************************/
  35. void LCD_ShowTime(char cDat,uchar X,uchar Y,bit show_flag,bit up,bit under){
  36.         uchar s[2];
  37.            s[0]=cDat/10+'0';
  38.         s[1]=cDat%10+'0';
  39.         en_disp(X,Y,2,Asc,s,show_flag,up,under);
  40. }
  41.                                                                                                                                   
  42. void Show_YMD(){          //年、月、日、星期、顯示函數
  43.         uchar uiTempDat;
  44.            uiTempDat=RDS1302(0x88|0x01);
  45.         sys.cMon=((uiTempDat&0x1f)>>4)*10+(uiTempDat&0x0f);       
  46.         LCD_ShowTime(sys.cMon,2,5,Mon_Flag,NoUpLine,NoUnderLine);       
  47.         hz_disp(4,5,1,uMod[1],1,NoUpLine,NoUnderLine);                                //月
  48.         Show16X32(2,27,ucNum3216[sys.cDay/10],Day_Flag);                        //日
  49.         Show16X32(2,43,ucNum3216[sys.cDay%10],Day_Flag);                         
  50.         hz_disp(6,8,2,ucLunar[13],1,UpLine,UnderLine);                                            
  51.         if(sys.cWeek==7)
  52.         hz_disp(6,40,1,uMod[2],1,UpLine,UnderLine);                                        //星期
  53.         else
  54.     hz_disp(6,40,1,ucLunar[sys.cWeek],1,UpLine,UnderLine);                //星期
  55.     LCD_ShowTime(20,0,9,1,UpLine,UnderLine);
  56.           LCD_ShowTime(sys.cYear,0,25,Year_Flag,UpLine,UnderLine);
  57.     hz_disp(0,41,1,uMod[0],1,UpLine,UnderLine);                                        //年

  58.         SpDat=GetSpringDay(sys.cYear,sys.cMon,sys.cDay);                        //獲得農歷
  59.     if(SpDat.cMon==1)                                                                                           //顯示農歷月
  60.           hz_disp(4,64,1,ucLunar[15],1,UpLine,NoUnderLine);                        //"正"
  61.         else if(SpDat.cMon==11)
  62.           hz_disp(4,64,1,ucLunar[16],1,UpLine,NoUnderLine);                        //"冬"
  63.         else if(SpDat.cMon==12)
  64.           hz_disp(4,64,1,ucLunar[17],1,UpLine,NoUnderLine);                        //"臘"
  65.         else
  66.           hz_disp(4,63,1,ucLunar[SpDat.cMon],1,UpLine,NoUnderLine); //"二"~"十"
  67.          if(SpDat.cDay/10==1 && SpDat.cDay%10>0)                                        //顯示"十" 例如"十四"而不是"一四"
  68.          hz_disp(4,95,1,ucLunar[10],1,UpLine,NoUnderLine);
  69.          else if(SpDat.cDay/10==2 && SpDat.cDay%10>0)               //顯示"廿" 例如"廿三"而不是"二四"
  70.          hz_disp(4,95,1,ucLunar[19],1,UpLine,NoUnderLine);
  71.          else
  72.          hz_disp(4,95,1,ucLunar[SpDat.cDay/10],1,UpLine,NoUnderLine);  //正常數字
  73.         if(!(SpDat.cDay%10))                                                                        //"十"
  74.          hz_disp(4,111,1,ucLunar[10],1,UpLine,NoUnderLine);
  75.         else                                                                                                                //正常數字
  76.          hz_disp(4,111,1,ucLunar[SpDat.cDay%10],1,UpLine,NoUnderLine);

  77.          hz_disp(0,104,1,SX[(uint)(2000+SpDat.cYear)%12],1,UpLine,UnderLine);   //生肖

  78.          hz_disp(2,95,1,TianGan[(uint)(2000+SpDat.cYear)%10],1,NoUpLine,NoUnderLine); //天干
  79.          hz_disp(2,111,1,DiZhi[(uint)(2000+SpDat.cYear)%12],1,NoUpLine,NoUnderLine);  //地支
  80. }

  81. void LCD_ShowWNL(){          //萬年歷顯示函數
  82.         LCD_ShowTime(sys.cSec,6,111,Sec_Flag,UpLine,UnderLine);                 //秒,每秒鐘刷新
  83.         if(!sys.cSec || State_Set)                                                                     //分,普通模式每分鐘刷新
  84.         LCD_ShowTime(sys.cMin,6,87,Min_Flag,UpLine,UnderLine);                 //    設置模式每次刷新
  85.          
  86.         if(!sys.cSec && !sys.cMin || State_Set)                                                 //時,普通模式每小時刷新
  87.     LCD_ShowTime(sys.cHour,6,63,Hour_Flag,UpLine,UnderLine);     //    設置模式每次刷新
  88.        
  89.         if(!sys.cSec && !sys.cMin && !sys.cHour || State_Set ){      //公歷農歷的年、月、日、星期
  90.                 Show_YMD();                                                                                                 //普通模式每天刷新
  91.                 if(State_Set==7) State_Set=0;                                                         //設置模式每次刷新
  92.         }       
  93. }

  94. void CAL_Init(){        //日期初始化函數
  95.         sys.cYear=0x13;        //BCD碼表示的日歷時間值
  96.         sys.cMon=0x06;
  97.         sys.cDay=0x030;
  98.         sys.cHour=0x23;
  99.         sys.cMin=0x59;
  100.         sys.cSec=0x55;
  101.         sys.cWeek=GetWeekDay(sys.cYear,sys.cMon,sys.cDay);
  102. }

  103. void SFR_Init(){                 //定時器1初始化函數
  104.         Flash_Flag=FALSE;
  105.         TMOD=0x11;
  106.         ET1=1;
  107.         TH1= (-10000)/256;
  108.         TL1= (-10000)%256;
  109.         EA=1;
  110. }

  111. void GUI_Init(){         //LCD圖形初始化函數
  112.          LCD12864_init();
  113.          ClearLCD();
  114.          Rect(0,0,127,63,1);   //描繪框架
  115.          Line(62,0,62,62,1);
  116.          Line(0,48,127,48,1);
  117.          Line(0,15,127,15,1);
  118.          Line(24,15,24,48,1);
  119.          Line(63,32,128,32,1);

  120.          SetTime(sys);                                   //設置時間
  121.          GetTime(&sys);                                   //獲得時間
  122.          
  123.          Show_YMD();
  124.          LCD_ShowTime(sys.cSec,6,111,Sec_Flag,UpLine,UnderLine);
  125.          en_disp(6,103,1,Asc,":",1,UpLine,UnderLine);
  126.          LCD_ShowTime(sys.cMin,6,87,Min_Flag,UpLine,UnderLine);
  127.          en_disp(6,79,1,Asc,":",1,UpLine,UnderLine);         
  128.      LCD_ShowTime(sys.cHour,6,63,Hour_Flag,UpLine,UnderLine);

  129.          hz_disp(2,64,1,ucLunar[11],1,NoUpLine,NoUnderLine);           //"農"
  130.          hz_disp(2,80,1,ucLunar[12],1,NoUpLine,NoUnderLine);           //"歷"
  131.          hz_disp(4,79,1,uMod[1],1,UpLine,NoUnderLine);                           //"月"
  132. }

  133. void DecToBCD(){   //二-十進制轉換函數
  134.         sys.cHour=(((sys.cHour)/10)<<4)+((sys.cHour)%10);
  135.         sys.cMin=(((sys.cMin)/10)<<4)+((sys.cMin)%10);
  136.         sys.cSec=((sys.cSec/10)<<4)+((sys.cSec)%10);
  137.           sys.cYear=((sys.cYear/10)<<4)+((sys.cYear)%10);
  138.         sys.cMon=((sys.cMon/10)<<4)+((sys.cMon)%10);
  139.         sys.cDay=((sys.cDay/10)<<4)+((sys.cDay)%10);
  140. }

  141. void Time_Set(){   //時間設置函數
  142.         if(State_Flag){                                        //設置鍵按下
  143.                 State_Flag=FALSE;
  144.                 State_Set++;
  145.                 if(State_Set==8) State_Set=0;
  146.         }

  147.         Hour_Flag=TRUE;Min_Flag=TRUE;Sec_Flag=TRUE;
  148.     Year_Flag=TRUE;Mon_Flag=TRUE;Day_Flag=TRUE;

  149.         switch(State_Set){              //設置類型
  150.                         case 0:                 //無設置
  151.                                 break;
  152.                         case 1:                                        //設置時
  153.                                 Hour_Flag=FALSE;
  154.                                 break;
  155.                         case 2:                                           //設置分
  156.                                 Min_Flag=FALSE;
  157.                                 break;
  158.                         case 3:                                         //設置秒
  159.                                 Sec_Flag=FALSE;
  160.                                 break;
  161.                         case 4:                                        //設置天
  162.                                  Day_Flag=FALSE;
  163.                                 break;
  164.                         case 5:
  165.                                  Mon_Flag=FALSE;     //設置月
  166.                                 break;
  167.                         case 6:
  168.                                  Year_Flag=FALSE;        //設置年
  169.                             break;
  170.                         case 7:                                        //無動作,設置此值為讓"年"的反白消失。
  171.                                 break;
  172.           }          
  173.           
  174.         if(Inc_Flag){                                        //加鍵被按下
  175.                 Inc_Flag=FALSE;
  176.                 switch(State_Set)                {
  177.                         case 0:
  178.                                 break;
  179.                         case 1:                                            //小時加
  180.                                 sys.cHour++;
  181.                                 (sys.cHour)%=24;
  182.                                 break;
  183.                         case 2:                                            //分加1
  184.                                 sys.cMin++;
  185.                                 sys.cMin%=60;
  186.                                 break;
  187.                         case 3:                                         //秒加1
  188.                             sys.cSec++;
  189.                                 sys.cSec%=60;
  190.                                 break;
  191.                         case 4:                                         //天加1
  192.                                 (sys.cDay)=(sys.cDay%Mon2[YearFlag(sys.cYear)][sys.cMon])+1;                  
  193.                                 break;
  194.                         case 5:                                         //月加1
  195.                                 sys.cMon=(sys.cMon%12)+1;
  196.                                 break;
  197.                         case 6:
  198.                                 sys.cYear++;                 //年加1
  199.                                 sys.cYear=sys.cYear%100;
  200.                         break;
  201.                   }       
  202.                 DecToBCD();                                        //轉為BCD數
  203.                 sys.cWeek=GetWeekDay(sys.cYear,sys.cMon,sys.cDay);    //算出星期
  204.                 SetTime(sys);                            //存入DS1302
  205.         }

  206.         if(Dec_Flag){                                         //減鍵按下
  207.                 Dec_Flag=FALSE;
  208.                 switch(State_Set){
  209.                         case 0:
  210.                                 break;
  211.                         case 1:          
  212.                                 sys.cHour=(sys.cHour+23)%24;  //時減1
  213.                                 break;
  214.                         case 2:                                                            //分減1
  215.                                 sys.cMin=(sys.cMin+59)%60;
  216.                                 break;
  217.                         case 3:                                                          //秒減1
  218.                                 sys.cSec=(sys.cSec+59)%60;
  219.                                 break;
  220.                         case 4:                                                          //天減1
  221.                                 sys.cDay=((sys.cDay+Mon2[YearFlag(sys.cYear)][sys.cMon]-1)%Mon2[YearFlag(sys.cYear)][sys.cMon]);                  
  222.                                 if(sys.cDay==0) sys.cDay=Mon2[YearFlag(sys.cYear)][sys.cMon];
  223.                                 break;
  224.                         case 5:                                                          //月減1
  225.                                 sys.cMon=(sys.cMon+11)%12;
  226.                                 if(sys.cMon==0) sys.cMon=12;
  227.                                 break;
  228.                         case 6:                                                          //年減1
  229.                                 sys.cYear=(sys.cYear+99)%100;
  230.                                 break;
  231.                   }       
  232.                 DecToBCD();
  233.                 sys.cWeek=GetWeekDay(sys.cYear,sys.cMon,sys.cDay);              
  234.                 SetTime(sys);       
  235.         }
  236. }

  237. void  main(){        //主函數
  238.          SFR_Init();
  239.          CAL_Init();
  240.          GUI_Init();
  241.          TR1=1;
  242.          while(1){
  243.                 GetTime(&sys);                //獲得時間
  244.                 LCD_ShowWNL();                //顯示萬年歷
  245.                 Time_Set();         //時間設置
  246.          }       
  247. }

  248. void timer1() interrupt  3 {  //定時器1中斷服務函數
  249.         TH1= (-10000)/256;
  250.         TL1= (-10000)%256;
  251.         keyinput();                                        //讀取按鍵
  252.         if (keyvalue&0x10){       
  253.                 State_Flag=TRUE;
  254.                 keyvalue &= 0xef;                //清鍵值,保證一直按下只執行一次按鍵動作。
  255.         }       
  256.         if (keyvalue&0x20 ){                //加
  257.                 Inc_Flag=TRUE;
  258.                 keyvalue &= 0xdf;                //清鍵值,保證一直按下只執行一次按鍵動作。
  259.         }       
  260.         if (keyvalue&0x40){                        //減
  261.                 Dec_Flag=TRUE;
  262.                 keyvalue &= 0xbf;                //清鍵值,保證一直按下只執行一次按鍵動作。
  263.         }
  264.        
  265. }
復制代碼



資料下載:
帶農歷的萬年歷.zip (146.45 KB, 下載次數: 401)

評分

參與人數 1黑幣 +1 收起 理由
wojiushiwo123 + 1 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:71282 發表于 2017-2-5 18:42 | 只看該作者
謝謝分享,高手啊,有點小問題,12864怎么是黑的呢
回復

使用道具 舉報

板凳
ID:71282 發表于 2017-2-5 18:51 | 只看該作者
12864引腳沒有修改好,
應該是
sbit  LCD12864_EN         =P2^4;
sbit  LCD12864_RW         =P2^3;       //0:write ; 1:read
sbit  LCD12864_RS         =P2^2;           //0:the command .1:the data
sbit  LCD12864_CS_L       =P2^0;       //select the left of the lcd when 1
sbit  LCD12864_CS_R       =P2^1;  
sbit  LCD12864_RST                      =P2^5;
程序還有些問題的
回復

使用道具 舉報

地板
ID:71282 發表于 2017-2-5 18:54 | 只看該作者
運行效果如圖
回復

使用道具 舉報

5#
ID:76133 發表于 2017-11-17 11:43 | 只看該作者

謝謝分享,高手啊
回復

使用道具 舉報

6#
ID:252496 發表于 2017-11-26 22:34 | 只看該作者
講真,要是急用就別下載了,浪費黑幣,要修改的
回復

使用道具 舉報

7#
ID:329035 發表于 2018-5-13 18:33 | 只看該作者
學習學習
回復

使用道具 舉報

8#
ID:329308 發表于 2018-5-14 09:06 | 只看該作者
好東西
回復

使用道具 舉報

9#
ID:44037 發表于 2018-5-14 10:32 | 只看該作者
好東西  學習一下






回復

使用道具 舉報

10#
ID:350298 發表于 2018-6-12 15:34 | 只看該作者
謝謝大神呀,請問一下陽歷農歷日期是會一起變化的嘛,還是要手調呀
回復

使用道具 舉報

11#
ID:368502 發表于 2018-7-11 09:03 | 只看該作者
youqq 發表于 2017-2-5 18:51
12864引腳沒有修改好,
應該是
sbit  LCD12864_EN         =P2^4;

你好,問一下 這段代碼往哪加啊
回復

使用道具 舉報

12#
ID:368600 發表于 2018-7-12 10:52 | 只看該作者
哇,正好我在做這個,非常感謝
回復

使用道具 舉報

13#
ID:370060 發表于 2018-7-12 11:14 | 只看該作者
謝謝幫助,絕世神貼
回復

使用道具 舉報

14#
ID:360050 發表于 2018-7-25 22:12 | 只看該作者
有總程序嘛
回復

使用道具 舉報

15#
ID:360050 發表于 2018-7-25 22:58 | 只看該作者
樓主有總程序嘛
回復

使用道具 舉報

16#
ID:394197 發表于 2018-9-10 10:05 | 只看該作者
看不大懂LCD顯示的東西
回復

使用道具 舉報

17#
ID:136393 發表于 2019-1-15 19:30 | 只看該作者
仿真顯示屏不顯示
回復

使用道具 舉報

18#
ID:454000 發表于 2019-1-16 00:48 | 只看該作者
不錯不錯,好例子!

評分

參與人數 3黑幣 +65 收起 理由
鉆牛尖滴劉尖尖 + 15
sheng7533967 + 15
Sawardeakar + 35

查看全部評分

回復

使用道具 舉報

19#
ID:494672 發表于 2019-5-12 15:30 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

20#
ID:494672 發表于 2019-5-12 16:51 | 只看該作者
男人 發表于 2019-1-15 19:30
仿真顯示屏不顯示

把lcd的引腳改了 8 7 6這幾個
回復

使用道具 舉報

21#
ID:316703 發表于 2019-5-13 13:13 | 只看該作者
改完引腳,編譯完有顯示了,可是內容布局等不對!
回復

使用道具 舉報

22#
ID:316703 發表于 2019-5-13 14:00 | 只看該作者
by64214 發表于 2018-5-14 10:32
好東西  學習一下

求高手賜教正確程序,謝謝了
回復

使用道具 舉報

23#
ID:316703 發表于 2019-5-13 14:46 | 只看該作者
這個程序需要改兩個模塊的腳定義,
一、顯示模塊:
1、按電路圖改程序:
sbit  LCD12864_EN         =P2^4;
sbit  LCD12864_RW        =P2^3;      
sbit  LCD12864_RS         =P2^2;          
sbit  LCD12864_CS_L      =P2^1;     
sbit  LCD12864_CS_R      =P2^0;  
sbit  LCD12864_RST            =P2^5;

2.按程序修改電路圖:
sbit  LCD12864_EN          =P1^2;
sbit  LCD12864_RW         =P1^1;      
sbit  LCD12864_RS          =P1^0;          
sbit  LCD12864_CS_L       =P2^0;      
sbit  LCD12864_CS_R       =P2^1;  
sbit  LCD12864_RST             =P2^5;

二、時鐘模塊;
1、按電路圖改程序:
sbit DS1302_RST=P1^5;        
sbit DS1302_SCLK=P1^6;        

2.按程序修改電路圖;
sbit DS1302_RST=P1^6;        
sbit DS1302_SCLK=P1^5;        
回復

使用道具 舉報

24#
ID:560874 發表于 2019-6-12 16:36 | 只看該作者
feiniao00o 發表于 2019-5-13 14:46
這個程序需要改兩個模塊的腳定義,
一、顯示模塊:
1、按電路圖改程序:

請問有改完的版本嗎?
回復

使用道具 舉報

25#
ID:435316 發表于 2019-6-25 22:12 | 只看該作者
抄襲的  
回復

使用道具 舉報

26#
ID:465318 發表于 2019-6-26 09:24 | 只看該作者
by64214 發表于 2018-5-14 10:32
好東西  學習一下

為什么調不動鴨
回復

使用道具 舉報

27#
ID:686729 發表于 2020-1-17 15:23 | 只看該作者
請問這書上是有的嗎,請問書名是什么
回復

使用道具 舉報

28#
ID:165276 發表于 2020-2-1 21:09 | 只看該作者
casojie 發表于 2020-1-17 15:23
請問這書上是有的嗎,請問書名是什么

書名《STC15增強型...》,具體忘了,是基于STC15F2K60S2寫的
回復

使用道具 舉報

29#
ID:239620 發表于 2020-5-26 15:54 | 只看該作者
下載下來學習學習
回復

使用道具 舉報

30#
ID:1082181 發表于 2023-6-5 16:21 | 只看該作者
如何獲得農歷日期
回復

使用道具 舉報

31#
ID:1106219 發表于 2023-12-26 08:31 | 只看該作者
by64214 發表于 2018-5-14 10:32
好東西  學習一下

大神,該如何修改代碼呢
回復

使用道具 舉報

32#
ID:34149 發表于 2023-12-27 12:04 | 只看該作者
12864要有串行方式的程序就更好了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 啪啪免费网 | 国产精品美女久久久久久免费 | 国产在线精品一区二区 | 日韩欧美在 | 成年人在线观看 | 日韩中文字幕区 | 国产精品美女 | 国产偷录视频叫床高潮对白 | 午夜一区二区三区在线观看 | 99tv | 国产精品国产亚洲精品看不卡15 | 一级黄色绿像片 | 国产男女猛烈无遮掩视频免费网站 | 亚洲精品丝袜日韩 | 久久精品国产亚洲一区二区三区 | 国产一区二区在线免费 | 亚洲av毛片 | аⅴ资源新版在线天堂 | 久久伊人青青草 | 国产欧美日韩视频 | 亚洲国产成人精品女人久久久 | 免费看91| 精品国产黄色片 | 婷婷色国产偷v国产偷v小说 | 国产一区二区三区视频免费观看 | 欧美在线a| 香蕉一区| 久久91精品| 国产四虎| 天天综合久久 | 久久精品中文字幕 | 很黄很污的网站 | 999免费网站 | 亚洲精品1 | 在线欧美小视频 | 国产精品一级在线观看 | 国产伦一区二区三区久久 | 欧美激情一区二区三区 | 国产伦精品一区二区三区在线 | 精品一二三区视频 | 免费播放一级片 |