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

標題: 帶農歷的電子萬年歷 單片機軟件程序與proteus仿真 [打印本頁]

作者: 18723691256    時間: 2017-1-16 11:35
標題: 帶農歷的電子萬年歷 單片機軟件程序與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)


作者: youqq    時間: 2017-2-5 18:42
謝謝分享,高手啊,有點小問題,12864怎么是黑的呢
作者: youqq    時間: 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;
程序還有些問題的
作者: youqq    時間: 2017-2-5 18:54
運行效果如圖

作者: 841812960    時間: 2017-11-17 11:43

謝謝分享,高手啊
作者: 123456QJN    時間: 2017-11-26 22:34
講真,要是急用就別下載了,浪費黑幣,要修改的

作者: luckc    時間: 2018-5-13 18:33
學習學習
作者: 鼓陽科技    時間: 2018-5-14 09:06
好東西
作者: by64214    時間: 2018-5-14 10:32
好東西  學習一下







作者: 噗呲與不加糖    時間: 2018-6-12 15:34
謝謝大神呀,請問一下陽歷農歷日期是會一起變化的嘛,還是要手調呀
作者: qingyeniubi    時間: 2018-7-11 09:03
youqq 發表于 2017-2-5 18:51
12864引腳沒有修改好,
應該是
sbit  LCD12864_EN         =P2^4;

你好,問一下 這段代碼往哪加啊
作者: mahui3477    時間: 2018-7-12 10:52
哇,正好我在做這個,非常感謝
作者: dadadad160    時間: 2018-7-12 11:14
謝謝幫助,絕世神貼
作者: lx5204441    時間: 2018-7-25 22:12
有總程序嘛
作者: lx5204441    時間: 2018-7-25 22:58
樓主有總程序嘛
作者: apple101101    時間: 2018-9-10 10:05
看不大懂LCD顯示的東西
作者: 男人    時間: 2019-1-15 19:30
仿真顯示屏不顯示
作者: shuisheng    時間: 2019-1-16 00:48
不錯不錯,好例子!
作者: LYZ5555    時間: 2019-5-12 15:30
感謝樓主分享
作者: LYZ5555    時間: 2019-5-12 16:51
男人 發表于 2019-1-15 19:30
仿真顯示屏不顯示

把lcd的引腳改了 8 7 6這幾個
作者: feiniao00o    時間: 2019-5-13 13:13
改完引腳,編譯完有顯示了,可是內容布局等不對!
作者: feiniao00o    時間: 2019-5-13 14:00
by64214 發表于 2018-5-14 10:32
好東西  學習一下

求高手賜教正確程序,謝謝了
作者: feiniao00o    時間: 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;        

作者: lch19    時間: 2019-6-12 16:36
feiniao00o 發表于 2019-5-13 14:46
這個程序需要改兩個模塊的腳定義,
一、顯示模塊:
1、按電路圖改程序:

請問有改完的版本嗎?
作者: 王志冰    時間: 2019-6-25 22:12
抄襲的  
作者: 電信班陳同學    時間: 2019-6-26 09:24
by64214 發表于 2018-5-14 10:32
好東西  學習一下

為什么調不動鴨
作者: casojie    時間: 2020-1-17 15:23
請問這書上是有的嗎,請問書名是什么
作者: 1965501205    時間: 2020-2-1 21:09
casojie 發表于 2020-1-17 15:23
請問這書上是有的嗎,請問書名是什么

書名《STC15增強型...》,具體忘了,是基于STC15F2K60S2寫的
作者: ujsme    時間: 2020-5-26 15:54
下載下來學習學習
作者: kygs722    時間: 2023-6-5 16:21
如何獲得農歷日期
作者: 單片機必過    時間: 2023-12-26 08:31
by64214 發表于 2018-5-14 10:32
好東西  學習一下

大神,該如何修改代碼呢
作者: dyx811    時間: 2023-12-27 12:04
12864要有串行方式的程序就更好了




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 成人午夜视频在线观看 | 午夜精品视频一区 | 国产精品7777777| 国产视频在线观看一区二区三区 | 一级黄色片日本 | 国产精品久久一区 | 亚洲免费在线观看视频 | 亚洲成年人免费网站 | 日韩中文字幕一区二区 | 亚洲 中文 欧美 日韩 在线观看 | 五月天综合影院 | 91精品国产91久久久久久丝袜 | 久久99视频精品 | 国产综合久久久 | 国产精品成人久久久久 | 亚洲精品成人 | av网站在线播放 | 在线免费观看黄色 | 亚洲自拍偷拍免费视频 | 成人黄色电影在线观看 | 亚洲欧洲在线看 | 国产三级一区二区三区 | 久久出精品 | 中文字幕日韩欧美 | 亚洲 欧美 另类 综合 偷拍 | 亚洲激情专区 | 久久精品二区 | 国产日韩欧美在线观看 | 伊人伊人伊人 | 99精品热视频 | 国产成人99久久亚洲综合精品 | 精品久久香蕉国产线看观看亚洲 | 精品九九久久 | 国产精品视频一区二区三区不卡 | 久久午夜国产精品www忘忧草 | 国产精品一区一区 | 尤物在线精品视频 | 精品国产乱码一区二区三区a | 福利片在线看 | 国产综合久久 | 国产精品久久久久久久久久久久久久 |