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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

可上下左右滾動的可調(diào)式單片機16x64點鐘時鐘(源代碼+仿真)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:126738 發(fā)表于 2019-3-4 14:04 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
可調(diào)式點陣時鐘,帶溫度顯示,proteus仿真,并且可以上下左右滾動

64點陣仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. // A B C D 對應(yīng)P1.0; P1.1 ; P1.2; P1.3
  2. //--------------------------------
  3. #include "reg52.h"

  4. #define  uchar unsigned char
  5. #define  uint  unsigned int
  6. //========================
  7. //****滾屏事件定義****
  8. #define         MSG_MV_L         1         //左移
  9. #define         MSG_MV_R         2        //右移
  10. #define         MSG_MV_U    3        //上移
  11. #define         MSG_MV_D    4        //下移
  12. #define         MSG_NONE         0        //無
  13. uchar MSG_MV = 0;
  14. //========================
  15. //****顯示狀態(tài)定義****
  16. #define STA_gTIME        1        //滾動顯示時間
  17. #define        STA_gTEMP        2        //滾動顯示溫度
  18. #define        STA_gWORD        3        //滾動顯示文字
  19. #define        STA_sTIME        4        //靜態(tài)顯示時間
  20. #define        STA_sWEEK        5        //靜態(tài)顯示星期
  21. #define        STA_sDATE        6        //靜態(tài)顯示日期
  22. #define STA_sYEAR        7        //靜態(tài)顯示年份
  23. #define        STA_sTEMP        8        //靜態(tài)顯示溫度
  24. #define        STA_sWORD        9        //靜態(tài)顯示文字
  25. #define STA_CHG                10        //校時模式
  26. #define STA_SONG        11        //滾動顯示詩歌
  27. #define STA_COPYRIGHT        12        //開機顯示
  28. uchar STATE = 1;
  29. //=========================
  30. //****校時狀態(tài)定義****
  31. #define CHG_HOUR        1        //調(diào)整小時
  32. #define CHG_MIN                2        //調(diào)整分
  33. #define CHG_SEC                3        //調(diào)整秒
  34. #define CHG_MON                4        //調(diào)整月
  35. #define CHG_DAY                5        //調(diào)整日
  36. #define CHG_WEEK        6        //調(diào)整星期
  37. #define CHG_YEAR        7        //調(diào)整年
  38. uchar CHANGE = 1;
  39. uchar hide_times = 0;        //校時閃爍時間變量
  40. uchar HIDE = 0;                //隱藏顯示標(biāo)志位
  41. uchar TMP_TIME = 0;
  42. //=========================
  43. //****按鍵定義****
  44. sbit  key0 = P1^0;
  45. sbit  key1 = P1^1;
  46. sbit  key2 = P1^2;
  47. sbit  key3 = P1^3;

  48. #define KEY0        0x0e
  49. #define KEY1         0x0d
  50. #define KEY2         0x0b
  51. #define KEY3         0x07

  52. #define KEY0_S        0x0e        //KEY0短按下
  53. #define KEY1_S        0x0d        //KEY1短按下
  54. #define KEY2_S        0x0b        //KEY2短按下
  55. #define KEY3_S        0x07        //KEY3短按下
  56. #define KEY0_L        0x1e        //KEY0長按下
  57. #define KEY1_L        0x1d        //KEY1長按下
  58. #define KEY2_L        0x1b        //KEY2長按下
  59. #define KEY3_L        0x17        //KEY3長按下
  60. #define KEY_NONE        0        //無按鍵
  61. uchar MSG_KEY = KEY_NONE;
  62. uchar key_times = 0;        //持續(xù)時間
  63. uchar key_keep_times = 0;
  64. uchar cur_key_val = 0;
  65. uchar key_done = 0;        //按鍵事件有無做好
  66. uchar exit = 0;        //校時狀態(tài)下長時間無按鍵退出
  67. //=========================
  68. //uchar time_read_times = 0;        //讀時間
  69. //uchar tem_read_times = 0;        //讀溫度
  70. //=========================
  71. //****引腳定義****
  72. sbit  CLK =P2^5 ;                  //74HC595移時鐘
  73. sbit  STB =P2^4        ;          // 74HC595鎖存信號
  74. sbit  Red=P2^7        ;          //紅色數(shù)據(jù)輸出引腳低電平有效            
  75. sbit  Greed=P2^6;         //全屏控制使能0,低電平有效
  76. sbit  OE = P0^7;           //全屏使能
  77. //========================
  78. //****DS1302****
  79. sbit SCLK=P0^5;   //位定義1302芯片的接口,時鐘輸出端口定義在P2.4引腳
  80. sbit DATA=P0^6;   //位定義1302芯片的接口,數(shù)據(jù)輸出端定義在P2.5引腳
  81. sbit RST=P0^7;    //位定義1302芯片的接口,復(fù)位端口定義在P2.6引腳

  82. typedef struct __SYSTEMTIME__
  83. {
  84.         uchar Second;
  85.         uchar Minute;
  86.         uchar Hour;
  87.         uchar Day;
  88.         uchar Month;
  89.         uchar Week;
  90.         uchar  Year;
  91. }SYSTEMTIME;        //定義的時間類型
  92. SYSTEMTIME Time;


  93. //=========================================
  94. //****18B20****
  95. sbit DQ = P0^4
  96. ;  //定義DS18B20端口DQ  

  97. unsigned char data  temp_data[2] = {0x00,0x00} ;
  98. unsigned char data  temp_ram[5] =   {0x00,0x00,0x00,0x00,0x00} ;
  99. unsigned char code  ditab[16] =    {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
  100.                                     0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
  101. //==========================================
  102. bit presence  ;
  103. uchar SendData;                  //要發(fā)送的數(shù)據(jù)變量
  104. uchar hang;                        //行掃描變量  (半屏只有16行,所以hang=0到15)
  105. uchar move_times = 0;        //左右移動位數(shù)
  106. uchar start_word = 0;


  107. uchar data h_dispram[10];         //顯示緩存
  108. uchar code *disword[26];        //顯示文字指針


  109. void  Keyscan (void); //修改參數(shù)按鍵掃描子程序
  110. void  Sendping(); //發(fā)送半屏子程序
  111. void  Put_Wdispram(uchar first_word);//
  112. void  Put_Hdispram(); //把顯示文字放入顯示緩存
  113. void  Move_Left();        //左移
  114. void  Move_Right();        //右移
  115. void  RL_Move();
  116. void  UD_Move();
  117. void  Show_Line();
  118. void  Show_Move_Word(uchar code *WORDS[][8]);
  119. void  delay();
  120. void  SendByte(void);
  121. void  RowsCan(void);
  122. void  Disp_Temperature();
  123. void Put_gTEMP();
  124. void Change_obj();

  125. uchar ReadKey1();



  126. uchar code MY_WORDS[][16]=
  127.                                         {
  128. {0x21,0x11,0x11,0x02,0x97,0x52,0x52,0x12,0x2F,0x22,0xE2,0x22,0x23,0x20,0x20,0x20},


  129. **************詳見51hei附件****************
  130. {0x00,0x00,0x80,0x04,0xFC,0x00,0x04,0xF8,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00},/*"寧",1*/
  131. {0x00,0x06,0x14,0x24,0x3F,0x44,0x7F,0x04,0x24,0x3F,0x24,0x24,0x25,0x04,0x00,0x00},
  132. {0x00,0x02,0x02,0x92,0x12,0x12,0xD2,0x12,0x52,0xD2,0x52,0x42,0x82,0x0C,0x04,0x00},/*"制",2*/
  133. {0x00,0x0C,0x08,0x09,0x11,0x1A,0x34,0x54,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00},
  134. {0x00,0xC0,0x80,0x04,0xF8,0x40,0x40,0x7C,0x40,0x40,0x44,0x78,0x40,0x40,0x00,0x00},/*"作",3*/
  135. };

  136. void Put_Wdispram(uchar code *WORDS[][8]){        //,uchar first_word
  137.         uchar i;
  138.         disword[0] = &NO_WORDS[12][0];
  139.         for(i=1;i<25;i++){
  140.                 disword[i] = &WORDS[i-1][0];        //first_word+
  141.         }
  142. }        

  143. void  Put_Hdispram(){
  144.         uchar i;
  145.         for(i=0;i<10;i++){
  146.                 h_dispram[i] = *(disword[i+start_word]+hang);        //
  147.         }
  148. }

  149. void Move_Left(){
  150.         uchar i;
  151.         for(i=0;i<9;i++){
  152.                 h_dispram[i] = (h_dispram[i] << (move_times)) | (h_dispram[i+1] >> (8-move_times));
  153.         }
  154. }

  155. void Move_Right(){
  156.         uchar i;
  157.         for(i=9;i>0;i--){
  158.                 h_dispram[i] = (h_dispram[i] >> (move_times)) | (h_dispram[i-1] << (8-move_times));
  159.         }
  160. }

  161. void RL_Move(){
  162.         //
  163.         switch(MSG_MV){
  164.                 case MSG_MV_L:        //左移
  165.                         Move_Left();
  166.                         break;
  167.                 case MSG_MV_R:        //右移
  168.                         Move_Right();
  169.                         break;
  170.                 case MSG_NONE:
  171.                         break;
  172.                 default:
  173.                         break;
  174.                 }
  175. }

  176. void Move_Up(){
  177.         //
  178.         uchar i,j,m,n;
  179.         for(m=0;m<16;m++){
  180.                 for(n=0;n<8;n++){
  181.                         for(j=0;j<16-m;j++){
  182.                                 for(i=0;i<10;i++){
  183.                                         h_dispram[i] = *(disword[i]+m+j);                //
  184.                                 }
  185.                                 Show_Line();
  186.                         }
  187.                         for(j=16-m;j<16;j++){
  188.                                 for(i=0;i<10;i++){
  189.                                         h_dispram[i] = *(disword[i+8]+m+j-16);                //0x00
  190.                                 }
  191.                                 Show_Line();
  192.                         }
  193.                 }
  194.         }
  195. }

  196. void Move_Down(){
  197.         //
  198.         uchar i,j,m,n;
  199.         for(m=0;m<16;m++){
  200.                 for(n=0;n<8;n++){
  201.                         for(j=0;j<m;j++){
  202.                                 for(i=0;i<10;i++){
  203.                                         h_dispram[i] = *(disword[i+8]+15-m+j);                //
  204.                                 }
  205.                                 Show_Line();
  206.                         }
  207.                         for(j=m;j<16;j++){
  208.                                 for(i=0;i<10;i++){
  209.                                         h_dispram[i] = *(disword[i]-m+j);                //0x00
  210.                                 }
  211.                                 Show_Line();
  212.                         }
  213.                 }
  214.         }
  215. }

  216. void UD_Move(){
  217.         //
  218.         switch(MSG_MV){
  219.                 case MSG_MV_U:        //左移
  220.                 //        Move_Up();
  221.                         break;
  222.                 case MSG_MV_D:        //右移
  223.                 //        Move_Down();
  224.                         break;
  225.                 case MSG_NONE:
  226.                         break;
  227.                 default:
  228.                         break;
  229.                 }
  230. }

  231. void Show_Line(){
  232.         uchar m;
  233.         OE=1;
  234.         for(m =0;m<8;m++)  
  235.         {        
  236.                 SendData = h_dispram[m+1];
  237.                 SendByte();
  238.         }
  239.         STB = 0;
  240.         STB = 1;                 //上升沿數(shù)據(jù)鎖存
  241.         RowsCan();                //行掃描
  242.         OE = 0;
  243. //        delay();        //
  244. }

  245. void Show_sWord(){
  246.         int m,i;//
  247.         hang = 0;
  248.         for(m=0;m<14;m++){
  249.                 for(i=0;i<16;i++){
  250.                         Put_Hdispram();        //把第i行放入行緩沖
  251.                         Show_Line();
  252.                         //delay();        //看需要
  253.                 }
  254.                
  255.         }
  256. }
  257. void Show_Move_Word(uchar code *WORDS[][8]){
  258.         int m,i;
  259.         while(1){
  260.         for(m=0;m<6;m++){        //若要上下移動 m=16
  261.                 //hang = 0;
  262.                 for(i=0;i<16;i++){
  263.                         Put_Hdispram();        //把第i行放入行緩沖
  264.                         RL_Move();        //是否要左右移動
  265.                         Show_Line();
  266.                         //delay();        //看需要
  267.                 }
  268.         //UD_Move();        //是否要上下移動
  269.         }
  270.         //========================================
  271.         //測試左移右移        切換時有跳變!!
  272. //        if(MSG_MV){
  273.                 move_times++;
  274.                 if((move_times == 9) && (MSG_MV == MSG_MV_L)){
  275.                         move_times = 1;
  276.                         Put_Wdispram(WORDS);
  277.                         start_word++;
  278.                         switch(STATE){
  279.                                 case STA_gTEMP:
  280.                                         Read_Temperature();
  281.                                         Disp_Temperature();                                   //
  282.                                         Put_gTEMP();          //
  283.                                         if(start_word > (sizeof(TMP_WORDS)/16 - 8))
  284.                                                 MSG_MV = MSG_MV_R;
  285.                                         break;
  286.                                 case STA_gWORD:
  287.                                         if(start_word > (sizeof(MY_WORDS)/16 - 8))
  288.                                                 MSG_MV = MSG_MV_R;
  289.                                 default:
  290.                                         break;
  291.                         }
  292.                 if(start_word > (sizeof(TMP_WORDS)/16 - 4))
  293.                                 MSG_MV = MSG_MV_R;
  294.                 }
  295.                 else if((move_times == 9) && (MSG_MV == MSG_MV_R)){
  296.                         move_times = 1;
  297.                         Put_Wdispram(WORDS);  //
  298.                         start_word-- ;
  299.                         switch(STATE){
  300.                                 case STA_gTEMP:
  301.                                         Disp_Temperature();                                   //
  302.                                         Put_gTEMP();
  303.                                                 break;
  304.                                 default:
  305.                                         break;
  306.                         }
  307.                         if(start_word < 1){
  308.                                 MSG_MV = MSG_MV_L;
  309.                                 return;
  310.                         }
  311.                 }
  312. //        }
  313.                 }
  314. }
  315. void Show_All_Word(){
  316.         int m,i;
  317.         //MSG_MV = MSG_MV_L;
  318.         for(start_word = 0;start_word < 8;start_word++){
  319.                 for(move_times = 0; move_times < 8;move_times++){
  320.                         for(m=0;m<4;m++){        //若要上下移動 m=16
  321.                                 for(i=0;i<16;i++){
  322.                                         Put_Hdispram();        //把第i行放入行緩沖
  323.                                         RL_Move();        //是否要左右移動
  324.                                         Show_Line();
  325.                                 }
  326.                         }
  327.                 }
  328.         }
  329. }

  330. void delay()
  331. {
  332.         uint i;
  333.         for(i=0;i<40;i++);
  334. }                        
  335.         
  336. //------------------------------------
  337. //----------字發(fā)送子程序-----------
  338.         void SendByte(void)
  339.                 {
  340.                    uchar m;
  341.                    for(m=0;m<8;m++)
  342.                    {
  343.                                    CLK = 0;
  344.                                 Red = (SendData & 0x80);                  //紅屏顯示
  345.                     //        Greed =  (SendData & 0x80);                  //綠屏顯示
  346.                                   SendData =SendData<<1;                        
  347.                                 CLK = 1;          //移位時鐘上升沿
  348.                    }
  349.                 }
  350. //-----------------------------------
  351. //----------行掃描子程序-------------
  352.            void RowsCan(void)
  353.            {
  354.                         P2 = P2 & 0xf0;
  355.                         P2 = P2 | hang;
  356.                         hang++;
  357.                         if (hang>=16)
  358.                         {
  359.                                 hang =0x00;
  360.                         }
  361.                 }

  362.                 void initial(void)
  363.                    {
  364.                           OE = 1;
  365.                         Red = 1;
  366.                         Greed = 1;
  367.                         SendData = 0x00;
  368.                         hang = 0x00;
  369.                                                         
  370.                  }
  371. /*****************************************************
  372. 函數(shù)功能:延時若干微秒
  373. 入口參數(shù):n
  374. ***************************************************/
  375. void delaynus(unsigned char n)
  376. {
  377. unsigned char i;
  378. // for(i=0;i<n;i++)
  379.       ;
  380. }
  381. /*****************************************************
  382. 函數(shù)功能:向1302寫一個字節(jié)數(shù)據(jù)
  383. 入口參數(shù):x
  384. ***************************************************/
  385. void Write1302(unsigned char dat)
  386. {
  387.   unsigned char i;
  388.   SCLK=0;            //拉低SCLK,為脈沖上升沿寫入數(shù)據(jù)做好準(zhǔn)備
  389.   delaynus(2);       //稍微等待,使硬件做好準(zhǔn)備
  390.   for(i=0;i<8;i++)      //連續(xù)寫8個二進制位數(shù)據(jù)
  391.     {
  392.             DATA=dat&0x01;    //取出dat的第0位數(shù)據(jù)寫入1302
  393.                 delaynus(2);       //稍微等待,使硬件做好準(zhǔn)備
  394.                  SCLK=1;           //上升沿寫入數(shù)據(jù)
  395.                  delaynus(2);      //稍微等待,使硬件做好準(zhǔn)備
  396.                  SCLK=0;           //重新拉低SCLK,形成脈沖
  397.                  dat>>=1;          //將dat的各數(shù)據(jù)位右移1位,準(zhǔn)備寫入下一個數(shù)據(jù)位
  398.           }
  399.         
  400. }
  401. /*****************************************************
  402. 函數(shù)功能:根據(jù)命令字,向1302寫一個字節(jié)數(shù)據(jù)
  403. 入口參數(shù):Cmd,儲存命令字;dat,儲存待寫的數(shù)據(jù)
  404. ***************************************************/
  405. void WriteSet1302(unsigned char Cmd,unsigned char dat)
  406. {
  407.    RST=0;           //禁止數(shù)據(jù)傳遞
  408.    SCLK=0;          //確保寫數(shù)居前SCLK被拉低
  409.         RST=1;           //啟動數(shù)據(jù)傳輸
  410.         delaynus(2);     //稍微等待,使硬件做好準(zhǔn)備
  411.         Write1302(Cmd);  //寫入命令字
  412.         Write1302(dat);  //寫數(shù)據(jù)
  413.         SCLK=1;          //將時鐘電平置于已知狀態(tài)
  414.         RST=0;           //禁止數(shù)據(jù)傳遞
  415. }
  416. /*****************************************************
  417. 函數(shù)功能:從1302讀一個字節(jié)數(shù)據(jù)
  418. 入口參數(shù):x
  419. ***************************************************/
  420. unsigned char Read1302(void)
  421. {
  422.    unsigned char i,dat;
  423.         delaynus(2);       //稍微等待,使硬件做好準(zhǔn)備
  424.         for(i=0;i<8;i++)   //連續(xù)讀8個二進制位數(shù)據(jù)
  425.          {
  426.            dat>>=1;       //將dat的各數(shù)據(jù)位右移1位,因為先讀出的是字節(jié)的最低位
  427.                 if(DATA==1)    //如果讀出的數(shù)據(jù)是1
  428.                  dat|=0x80;    //將1取出,寫在dat的最高位
  429.                  SCLK=1;       //將SCLK置于高電平,為下降沿讀出
  430.                  delaynus(2);  //稍微等待
  431.                  SCLK=0;       //拉低SCLK,形成脈沖下降沿
  432.                  delaynus(2);  //稍微等待
  433.           }         
  434.   return dat;        //將讀出的數(shù)據(jù)返回
  435. }  
  436. /*****************************************************
  437. 函數(shù)功能:根據(jù)命令字,從1302讀取一個字節(jié)數(shù)據(jù)
  438. 入口參數(shù):Cmd
  439. ***************************************************/
  440. unsigned char  ReadSet1302(unsigned char Cmd)
  441. {
  442.   unsigned char dat;
  443.   RST=0;                 //拉低RST
  444.   SCLK=0;                //確保寫數(shù)居前SCLK被拉低
  445.   RST=1;                 //啟動數(shù)據(jù)傳輸
  446.   Write1302(Cmd);       //寫入命令字
  447.   dat=Read1302();       //讀出數(shù)據(jù)
  448.   SCLK=1;              //將時鐘電平置于已知狀態(tài)
  449.   RST=0;               //禁止數(shù)據(jù)傳遞
  450.   return dat;          //將讀出的數(shù)據(jù)返回
  451. }
  452. /*****************************************************
  453. 函數(shù)功能: 1302進行初始化設(shè)置
  454. ***************************************************/
  455. void Init_DS1302(void)
  456. {        
  457.   unsigned char flag;
  458.    
  459.     flag= ReadSet1302(0x81);
  460.         if(flag&0x80)        {      //判斷時鐘芯片是否關(guān)閉
  461.    WriteSet1302(0x8E,0x00);                 //根據(jù)寫狀態(tài)寄存器命令字,寫入不保護指令
  462.    WriteSet1302(0x80,((0/10)<<4|(0%10)));   //根據(jù)寫秒寄存器命令字,寫入秒的初始值
  463.         WriteSet1302(0x82,((18/10)<<4|(18%10)));   //根據(jù)寫分寄存器命令字,寫入分的初始值
  464.         WriteSet1302(0x84,((21/10)<<4|(21%10))); //根據(jù)寫小時寄存器命令字,寫入小時的初始值
  465.         WriteSet1302(0x86,((23/10)<<4|(23%10))); //根據(jù)寫日寄存器命令字,寫入日的初始值
  466.         WriteSet1302(0x88,((7/10)<<4|(7%10))); //根據(jù)寫月寄存器命令字,寫入月的初始值
  467.         //WriteSet1302(0x8A,2);
  468.         WriteSet1302(0x8c,((10/10)<<4|(10%10)));   //根據(jù)寫小時寄存器命令字,寫入小時的初始值
  469.                 WriteSet1302(0x90,0xa5);
  470.         WriteSet1302(0x8E,0x80);
  471.   }
  472.   //如果不想每次都初始化時間,也就是掉電后還想讓時鐘繼續(xù)走時的話 就用上面的語句


  473.   /*--------------------這是每次都初始化的語句-----------------*/
  474.     /* WriteSet1302(0x8E,0x00);                 //根據(jù)寫狀態(tài)寄存器命令字,寫入不保護指令
  475.    WriteSet1302(0x80,((0/10)<<4|(0%10)));   //根據(jù)寫秒寄存器命令字,寫入秒的初始值
  476.         WriteSet1302(0x82,((18/10)<<4|(18%10)));   //根據(jù)寫分寄存器命令字,寫入分的初始值
  477.         WriteSet1302(0x84,((21/10)<<4|(21%10))); //根據(jù)寫小時寄存器命令字,寫入小時的初始值
  478.         WriteSet1302(0x86,((23/10)<<4|(23%10))); //根據(jù)寫日寄存器命令字,寫入日的初始值
  479.         WriteSet1302(0x88,((7/10)<<4|(7%10))); //根據(jù)寫月寄存器命令字,寫入月的初始值
  480.         //WriteSet1302(0x8A,2);
  481.         WriteSet1302(0x8c,((10/10)<<4|(10%10)));   //根據(jù)寫小時寄存器命令字,寫入小時的初始值
  482.                 WriteSet1302(0x90,0xa5);
  483.         WriteSet1302(0x8E,0x80);
  484.         */



  485. }
  486. void write_time1302(){
  487.     WriteSet1302(0x8E,0x00);                 //根據(jù)寫狀態(tài)寄存器命令字,寫入不保護指令
  488.     WriteSet1302(0x80,Time.Second);   //根據(jù)寫秒寄存器命令字,寫入秒的初始值
  489.         WriteSet1302(0x82,Time.Minute);   //根據(jù)寫分寄存器命令字,寫入分的初始值
  490.         WriteSet1302(0x84,Time.Hour); //根據(jù)寫小時寄存器命令字,寫入小時的初始值
  491.         WriteSet1302(0x86,Time.Day); //根據(jù)寫日寄存器命令字,寫入日的初始值
  492.         WriteSet1302(0x88,Time.Month); //根據(jù)寫月寄存器命令字,寫入月的初始值
  493.         WriteSet1302(0x8A,Time.Week);
  494.         WriteSet1302(0x8c,Time.Year);   //根據(jù)寫小時寄存器命令字,寫入小時的初始值
  495.         //        WriteSet1302(0x90,0xa5);
  496.         //WriteSet1302(0x8E,0x80);        
  497. }

  498. //讀時間
  499. void Read_TIME(){

  500.         RST=0;                 //拉低RST
  501.           SCLK=0;                //確保寫數(shù)居前SCLK被拉低
  502.           RST=1;                 //啟動數(shù)據(jù)傳輸
  503.           Write1302(0xbf);       //寫入命令字
  504.         Time.Second = Read1302() & 0x7f;
  505.         Time.Minute = Read1302() & 0x7f;
  506.         Time.Hour = Read1302() & 0x7f;
  507.         Time.Day = Read1302() & 0x7f;
  508.         Time.Month = Read1302() & 0x7f;  
  509.          Time.Week= Read1302() & 0x7f;
  510.         Time.Year = Read1302() & 0x7f;
  511.         SCLK=1;          //將時鐘電平置于已知狀態(tài)
  512.         RST=0;           //禁止數(shù)據(jù)傳遞
  513.          
  514.         /*unsigned char ReadValue;   //儲存從1302讀取的數(shù)據(jù)
  515.         ReadValue = ReadSet1302(0x81);   //從秒寄存器讀數(shù)據(jù)
  516.         Time.Second =ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F);//將讀出數(shù)據(jù)轉(zhuǎn)化
  517.          ReadValue = ReadSet1302(0x83);  //從分寄存器讀
  518.      Time.Minute = ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //將讀出數(shù)據(jù)轉(zhuǎn)化
  519.      ReadValue = ReadSet1302(0x85);  //從時寄存器讀
  520.      Time.Hour = ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //將讀出數(shù)據(jù)轉(zhuǎn)化
  521.      ReadValue = ReadSet1302(0x87);  //從分寄存器讀
  522.      Time.Day = ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //將讀出數(shù)據(jù)轉(zhuǎn)化
  523.          ReadValue = ReadSet1302(0x89);  //從分寄存器讀
  524.      Time.Month = ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //將讀出數(shù)據(jù)轉(zhuǎn)化
  525.         ReadValue = ReadSet1302(0x8B);  //從時寄存器讀
  526.         Time.Week= ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //將讀出數(shù)據(jù)轉(zhuǎn)化
  527.          ReadValue = ReadSet1302(0x8d);  //從分寄存器讀                                                                           
  528.      Time.Year = ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //將讀出數(shù)據(jù)轉(zhuǎn)化  
  529.    
  530.    */ }

  531. void Put_Adispram(uchar a){
  532.         uchar i;
  533.         //第一屏"今天是:"
  534.         disword[a+1] = &NO_WORDS[12][0];        //空格
  535.         for(i=0;i<6;i++)
  536.                 disword[a+i+2] = &TIME_WORDS[i][0];
  537.         disword[a+8] = &NO_WORDS[11][0];        //":"
  538.         //第二屏
  539.         //disword[4] = &TIME_WORDS[];
  540.                
  541. }
  542.         
  543. //將年份放入到顯示緩存
  544. //需要參數(shù):緩沖區(qū)首地址下標(biāo)
  545. void Put_Ydispram(uchar i){
  546.         disword[i+1] = &NO_WORDS[12][0];
  547.         if(Time.Year < 30 && !HIDE){
  548.                 disword[i+2] = &NO_WORDS[2][0];
  549.                 disword[i+3] = &NO_WORDS[0][0];
  550.                 }
  551.         else if(!HIDE){
  552.                 disword[i+2] = &NO_WORDS[1][0];
  553.                 disword[i+3] = &NO_WORDS[9][0];
  554.                 }
  555.         disword[i+4] = &NO_WORDS[Time.Year>>4][0];
  556.         disword[i+5] = &NO_WORDS[Time.Year&0x0f][0];
  557.         disword[i+6] = &TIME_WORDS[6][0];
  558.         disword[i+7] = &TIME_WORDS[7][0];        //年
  559.         disword[i+8] = &NO_WORDS[12][0];
  560. }        
  561. //將星期放入到顯示緩存
  562. //參數(shù):緩沖區(qū)首地址下標(biāo)
  563. void Put_Kdispram(uchar i){
  564.         disword[i+1] = &NO_WORDS[12][0];                 
  565.         disword[i+2] = &TIME_WORDS[12][0];               
  566.         disword[i+3] = &TIME_WORDS[13][0];        //星期               
  567.         disword[i+4] = &TIME_WORDS[14][0];                 
  568.         disword[i+5] = &TIME_WORDS[15][0];
  569.         if(STATE== STA_CHG &&HIDE){
  570.                 disword[i+6] = &NO_WORDS[12][0];                //
  571.                 disword[i+7] = &NO_WORDS[12][0];                  //
  572.                 }
  573.         else{
  574.                 disword[i+6] = &WEEK_WORDS[Time.Week*2-2][0];                //
  575.                 disword[i+7] = &WEEK_WORDS[Time.Week*2-1][0];                  //
  576.                 }
  577.         disword[i+8] = &NO_WORDS[12][0];                 
  578. }

  579. //將日期放入到顯示緩存
  580. //參數(shù):緩沖區(qū)首地址下標(biāo)
  581. void Put_Ddispram(uchar i){
  582.         disword[i+1] = &NO_WORDS[Time.Month>>4][0];                 //小時高位
  583.         disword[i+2] = &NO_WORDS[ Time.Month&0x0f][0];                //小時地位
  584.         disword[i+3] = &TIME_WORDS[8][0];                //-
  585.         disword[i+4] = &TIME_WORDS[9][0];                 //分鐘高位
  586.         disword[i+5] = &NO_WORDS[ Time.Day>>4][0];                //分鐘地位
  587.         disword[i+6] = &NO_WORDS[Time.Day&0x0f][0];                //-
  588.         disword[i+7] = &TIME_WORDS[10][0];                  //秒高位
  589.         disword[i+8] = &TIME_WORDS[11][0];                 //秒地位
  590. }

  591. //將時間放入到顯示緩存
  592. //參數(shù):緩沖區(qū)首地址下標(biāo)
  593. void Put_Tdispram(uchar i){
  594.         disword[i+1] = &NO_WORDS[Time.Hour>>4][0];                 //小時高位
  595.         disword[i+2] = &NO_WORDS[ Time.Hour&0x0f][0];                //小時地位
  596.         disword[i+3] = &NO_WORDS[ 11 ];                //-
  597.         disword[i+4] = &NO_WORDS[Time.Minute>>4][0];                 //分鐘高位
  598.         disword[i+5] = &NO_WORDS[ Time.Minute&0x0f][0];                //分鐘地位
  599.         disword[i+6] = &NO_WORDS[ 11 ];                //-
  600.         disword[i+7] = &NO_WORDS[Time.Second>>4][0];                 //秒高位
  601.         disword[i+8] = &NO_WORDS[ Time.Second&0x0f][0];                //秒地位
  602. }
  603. //===================================
  604. //*****關(guān)于溫度檢測部分*****
  605. void Put_gTEMP(){
  606. //        uchar i;
  607. //        Put_Wdispram(TMP_WORDS,0);
  608.         disword[6] = &NO_WORDS[temp_ram[3]][0];                 //百位
  609.         disword[7] = &NO_WORDS[temp_ram[2]][0];                //十位
  610.         disword[8] = &NO_WORDS[temp_ram[1]][0];                //個位
  611.         disword[10] = &NO_WORDS[temp_ram[0]][0];                //小數(shù)
  612.         disword[12]        = &NO_WORDS[12];                //空格
  613.         disword[13]        = &NO_WORDS[12];                //空格
  614.          //
  615. }

  616. void Put_sTEMP(uchar i){
  617.         disword[i+1] = &NO_WORDS[12];                //空格
  618.         disword[i+2] = &NO_WORDS[12];//&NO_WORDS[temp_ram[3]][0];                 //百位
  619.         disword[i+3] = &NO_WORDS[temp_ram[2]][0];                //十位
  620.         disword[i+4] = &NO_WORDS[temp_ram[1]][0];                //個位
  621.         disword[i+5] = &TMP_WORDS[8][0];        //小數(shù)點
  622.         disword[i+6] = &NO_WORDS[temp_ram[0]][0];                //小數(shù)
  623.         disword[i+7] = &TMP_WORDS[10][0];
  624.         disword[i+8] = &NO_WORDS[12];                //空格
  625. }
  626. void Put_Cpyrt(uchar i){
  627.         uchar m;
  628.         for(m=0;m<8;m++)
  629.                 disword[i+1+m] = &CPYRT_WORDS[m];
  630. }
  631. void Show_Cpyrt(){
  632.         uchar i;
  633.         for(i=1;i<9;i++)
  634.                 disword[i] = &NO_WORDS[12];
  635.         Put_Cpyrt(8);
  636.         Move_Down();
  637.         Put_Cpyrt(0);
  638.         Put_Tdispram(8);
  639.         Move_Down();
  640. }
  641.         
  642. //========================
  643. //參數(shù)i:放入第幾屏緩存
  644. //參數(shù)j:詩歌第幾頁
  645. //========================
  646. void Put_Song(uchar i,uchar j){
  647.         uchar m;
  648.         for(m=0;m<8;m++)
  649.                 disword[i+1+m] = &SONG_WORDS[j+m];
  650. }
  651. //顯示詩歌
  652. void Show_Song(){
  653.         uchar i;
  654.         Put_Song(8,0);
  655.         Move_Up();
  656.         for(i=0;i<3;i++){
  657.                 Put_Song(0,i*8);
  658.                 Put_Song(8, (i+1)*8);
  659.                 Move_Up();
  660.                 }
  661.         Put_Song(0, 3*8);
  662.         Put_Tdispram(8);
  663.         Move_Up();
  664. }

  665.         
  666. //======================
  667. //*滾動顯示所有信息*
  668. //======================
  669. void Show_All_Info(){
  670.         Put_Adispram(8);
  671.         Move_Down();        //切換效果
  672.         
  673.         Put_Adispram(0);
  674.         Put_Ydispram(8);        //XXXX年
  675.         Show_All_Word();
  676.         
  677.         Put_Ydispram(0);        //XXXX年
  678.         Put_Ddispram(8);
  679.         Show_All_Word();

  680.         Put_Ddispram(0);
  681.         Put_Kdispram(8);
  682.         Show_All_Word();

  683.         
  684.         Read_Temperature();
  685.         Disp_Temperature();
  686.         Put_Kdispram(0);
  687.         Put_Tdispram(8);
  688.         Show_All_Word();

  689.         Read_Temperature();
  690.         Disp_Temperature();
  691.         Put_Tdispram(0);
  692.         Put_sTEMP(8);
  693.         Show_All_Word();

  694.         Read_TIME();
  695.         Put_sTEMP(0);
  696.         Put_Tdispram(8);
  697.         Move_Up();
  698.         
  699. }

  700.         
  701. /*us級延時函數(shù)                                        */
  702. /*******************************************************************/

  703. void Delay(unsigned int num)
  704. {
  705.   num = num*2;
  706.   while( --num ) ;
  707. }

  708. /*初始化ds1820                                      */
  709. /*******************************************************************/
  710. Init_DS18B20(void)
  711. {  
  712.      DQ = 1 ;      //DQ復(fù)位
  713.      Delay(8) ;    //稍做延時

  714.      DQ = 0 ;      //單片機將DQ拉低
  715.      Delay(90) ;   //精確延時 大于 480us

  716.      DQ = 1 ;       //拉高總線
  717.      Delay(8) ;

  718.      presence = DQ ;    //如果=0則初始化成功 =1則初始化失敗
  719.      Delay(100) ;
  720.      DQ = 1 ;
  721.      
  722.      return(presence) ; //返回信號,0=presence,1= no presence
  723. }


  724. /* 讀一個字節(jié)                     */
  725. /*******************************************************************/
  726. ReadOneChar(void)
  727. {
  728. unsigned char i = 0 ;
  729. unsigned char dat = 0 ;

  730. for (i = 8 ; i > 0 ; i--)
  731.   {
  732.     DQ = 0 ; // 給脈沖信號
  733.     dat >>= 1 ;
  734.     DQ = 1 ; // 給脈沖信號

  735.     if(DQ)
  736.      dat |= 0x80 ;
  737.     Delay(4) ;
  738.   }

  739.     return (dat) ;
  740. }

  741. /* 寫一個字節(jié)                                         */
  742. /*******************************************************************/
  743. WriteOneChar(unsigned char dat)
  744. {
  745.   unsigned char i = 0 ;
  746.   for (i = 8 ; i > 0 ; i--)
  747.   {
  748.     DQ = 0 ;
  749.     DQ = dat&0x01 ;
  750.     Delay(5) ;

  751.     DQ = 1 ;
  752.     dat>>=1 ;
  753.   }
  754. }

  755. /* 讀取溫度                            */
  756. /*******************************************************************/
  757. Read_Temperature(void)
  758. {
  759.      Init_DS18B20() ;
  760.   
  761.      WriteOneChar(0xCC) ;  // 跳過讀序號列號的操作
  762.      WriteOneChar(0x44) ;  // 啟動溫度轉(zhuǎn)換

  763.      Init_DS18B20() ;
  764.      WriteOneChar(0xCC) ;  //跳過讀序號列號的操作
  765.      WriteOneChar(0xBE) ;  //讀取溫度寄存器

  766.      temp_data[0] = ReadOneChar() ;   //溫度低8位
  767.      temp_data[1] = ReadOneChar() ;   //溫度高8位
  768. }

  769. /* 數(shù)據(jù)轉(zhuǎn)換與溫度顯示                                              */
  770. /*******************************************************************/
  771. void Disp_Temperature()
  772. {
  773.   temp_ram[4]=temp_data[0]&0x0f ;
  774.   temp_ram[0]=ditab[temp_ram[4]]+0x30 ;     //查表得小數(shù)位的值
  775.   
  776.   temp_ram[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
  777.   temp_ram[3]=temp_ram[4]/100+0x30 ;
  778.   temp_ram[1]=temp_ram[4]%100 ;
  779.   temp_ram[2]=temp_ram[1]/10+0x30 ;
  780.   temp_ram[1]=temp_ram[1]%10+0x30 ;

  781.     if(temp_ram[3]==0x30)        //高位為0,不顯示
  782.    {
  783.      temp_ram[3]=0x20 ;              
  784.      if(temp_ram[2]==0x30)      //次高位為0,不顯示
  785.      temp_ram[2]=0x20 ;
  786.    }

  787. }
  788. /*
  789. void start_time(){
  790.         Time.Year = 0x10;
  791.         Time.Month = 0x7;
  792.         Time.Day = 0x23;
  793.         Time.Hour = 0x21;
  794.         Time.Minute = 0x58;
  795.         Time.Second = 0x0;
  796.         Time.Week = 0x5;
  797. }*/

  798. //=================
  799. //****校時函數(shù)****
  800. //=================
  801. void Change_Time(){
  802.         //
  803.         MSG_MV = MSG_MV_L;
  804.         move_times = 0;
  805.         start_word=0;
  806.         TMP_TIME = Time.Hour;
  807.         TR1 = 1;                //開啟定時器1閃爍
  808.         do{
  809.                 switch(CHANGE){
  810.                                 case CHG_HOUR:
  811.                                 case CHG_MIN:
  812.                                 case CHG_SEC:
  813.                                         Put_Tdispram(0);
  814.                                         break;
  815.                                 case CHG_MON:
  816.                                 case CHG_DAY:
  817.                                         Put_Ddispram(0);
  818.                                         break;
  819.                                 case CHG_WEEK:
  820.                                         Put_Kdispram(0);
  821.                                         break;
  822.                                 case CHG_YEAR:
  823.                                         Put_Ydispram(0);
  824.                                         break;
  825.                                 default:
  826.                                         break;
  827.                                 }        
  828.                 Show_sWord();
  829.                 //if(!key_done)
  830.                 //        ReadKey1();
  831.                 }while(ReadKey1() != KEY3_S && exit < 10);                //MSG_KEY
  832.         Change_obj();        //保證退出校時無隱身
  833.         HIDE = 0;
  834.         key_done = 0;
  835.         //key_done = 1;        //按鍵事件處理完成
  836.         TR1 = 0;                //關(guān)閉定時器1閃爍                                       
  837.         
  838. }
  839. //==================
  840. //****對象切換****
  841. //==================
  842. void Change_obj(){
  843.         switch(CHANGE){
  844.                                 case CHG_HOUR:
  845.                                         if(Time.Hour == 0xcc)
  846.                                                 Time.Hour = TMP_TIME;
  847.                                         TMP_TIME = Time.Minute;
  848.                                         break;
  849.                                 case CHG_MIN:
  850.                                         if(Time.Minute == 0xcc)
  851.                                                 Time.Minute = TMP_TIME;
  852.                                         TMP_TIME = Time.Second;
  853.                                         break;
  854.                                 case CHG_SEC:
  855.                                         if(Time.Second == 0xcc)
  856.                                                 Time.Second = TMP_TIME;
  857.                                         TMP_TIME = Time.Month;
  858.                                         break;
  859.                                 case CHG_MON:
  860.                                         if(Time.Month == 0xcc)
  861.                                                 Time.Month = TMP_TIME;
  862.                                         TMP_TIME = Time.Day;
  863.                                         break;
  864.                                 case CHG_DAY:
  865.                                         if(Time.Day == 0xcc)
  866.                                                 Time.Day = TMP_TIME;
  867.                                         TMP_TIME = Time.Week;
  868.                                         break;
  869.                                 case CHG_WEEK:
  870.                                         if(Time.Week == 0xcc)
  871.                                                 Time.Week = TMP_TIME;
  872.                                         TMP_TIME = Time.Year;
  873.                                         break;
  874.                                 case CHG_YEAR:
  875.                                         if(Time.Year == 0xcc)
  876.                                                 Time.Year = TMP_TIME;
  877.                                         TMP_TIME = Time.Hour;
  878.                                         break;
  879.                                 default:
  880.                                         break;
  881.                                 }
  882. }
  883. //==================
  884. //****加加函數(shù)****
  885. //功能: 0x19 ++  =0x20
  886. //==================
  887. uchar Add_num(char *num){
  888.         ++(*num);
  889.         if(((*num) & 0x0f) == 0x0a){
  890.                 *num += 0x10;
  891.                 *num &= 0xf0;
  892.                 }
  893.         return *num;
  894. }
  895. //==================
  896. //****校時加加****
  897. //==================
  898. void Add_Time(){
  899.         switch(CHANGE){
  900.                                 case CHG_HOUR:
  901.                                         if(HIDE){
  902.                                                 if(Add_num(&TMP_TIME) == 0x24)
  903.                                                         TMP_TIME= 0;
  904.                                                 }
  905.                                         else{
  906.                                                 if(Add_num(&Time.Hour) == 0x24)
  907.                                                         Time.Hour = 0;
  908.                                                 }
  909.                                         break;
  910.                                 case CHG_MIN:
  911.                                         if(HIDE){
  912.                                                 if(Add_num(&TMP_TIME) == 0x60)
  913.                                                         TMP_TIME= 0;
  914.                                                 }
  915.                                         else{
  916.                                                 if(Add_num(&Time.Minute) == 0x60)
  917.                                                         Time.Minute= 0;
  918.                                                 }
  919.                                         break;
  920.                                 case CHG_SEC:
  921.                                         if(HIDE){
  922.                                                 if(Add_num(&TMP_TIME) == 0x60)
  923.                                                         TMP_TIME= 0;
  924.                                                 }
  925.                                         else{
  926.                                                 if(Add_num(&Time.Second) == 0x60)
  927.                                                         Time.Second = 0;
  928.                                                 }
  929.                                         break;
  930.                                 case CHG_MON:
  931.                                         if(HIDE){
  932.                                                 if(Add_num(&TMP_TIME) == 0x13)
  933.                                                         TMP_TIME= 0;
  934.                                                 }
  935.                                         else{
  936.                                                 if(Add_num(&Time.Month) == 0x13)
  937.                                                         Time.Month= 1;
  938.                                                 }
  939.                                         break;
  940.                                 case CHG_DAY:
  941.                                         if(HIDE){
  942.                                                 if(Add_num(&TMP_TIME) == 0x32)
  943.                                                         TMP_TIME= 0;
  944.                                                 }
  945.                                         else{
  946.                                                 if(Add_num(&Time.Day) == 0x32)
  947.                                                         Time.Day= 0;
  948.                                                 }
  949.                                         break;
  950.                                 case CHG_WEEK:
  951.                                         if(HIDE){
  952.                                                 if(Add_num(&TMP_TIME) == 0x08)
  953.                                                         TMP_TIME= 1;
  954.                                                 }
  955.                                         else{
  956.                                                 if(Add_num(&Time.Week) == 0x08)
  957.                                                         Time.Week= 1;
  958.                                                 }
  959.                                         break;
  960.                                 case CHG_YEAR:
  961.                                         if(HIDE){
  962.                                                 if(Add_num(&TMP_TIME) == 0xa0)
  963.                                                         TMP_TIME = 0;
  964.                                                 }
  965.                                         else{
  966.                                                 if(Add_num(&Time.Year) == 0xa0)
  967.                                                         Time.Year = 0;
  968.                                                 }
  969.                                         //if(Add_num(&Time.Year) == 0x24)
  970.                                         //        Time.Year= 0;
  971.                                         break;
  972.                                 default:
  973.                                         break;
  974.                                 }
  975. }
  976. //==================
  977. //****減減函數(shù)****
  978. //功能: 0x20 --  =0x19
  979. //==================
  980. uchar Cut_num(char *num){
  981.         --(*num);
  982.         if(((*num)&0x0f) == 0x0f){
  983.                 //*num -= 0x10;
  984.                 *num &= 0xf9;
  985.         }
  986.         //if((*num == 0xf9)
  987.                 //*num = 0x99;
  988.         return *num;
  989. }
  990. //==================
  991. //****校時減減****
  992. //==================
  993. void Cut_Time(){
  994.         switch(CHANGE){
  995.                                 case CHG_HOUR:
  996.                                         if(HIDE){
  997.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  998.                                                         TMP_TIME= 0x23;
  999.                                                 }
  1000.                                         else{
  1001.                                                 if(Cut_num(&Time.Hour) == 0xf9)
  1002.                                                         Time.Hour = 0x23;
  1003.                                                 }
  1004.                                         break;
  1005.                                 case CHG_MIN:
  1006.                                         if(HIDE){
  1007.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  1008.                                                         TMP_TIME= 0x59;
  1009.                                                 }
  1010.                                         else{
  1011.                                                 if(Cut_num(&Time.Minute) == 0xf9)
  1012.                                                         Time.Minute= 0x59;
  1013.                                                 }
  1014.                                         break;
  1015.                                 case CHG_SEC:
  1016.                                         if(HIDE){
  1017.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  1018.                                                         TMP_TIME= 0x59;
  1019.                                                 }
  1020.                                         else{
  1021.                                                 if(Cut_num(&Time.Second) == 0xf9)
  1022.                                                         Time.Second = 0x59;
  1023.                                                 }
  1024.                                         break;
  1025.                                 case CHG_MON:
  1026.                                         if(HIDE){
  1027.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  1028.                                                         TMP_TIME= 0x12;
  1029.                                                 }
  1030.                                         else{
  1031.                                                 if(Cut_num(&Time.Month) == 0xf9)
  1032.                                                         Time.Month= 0x12;
  1033.                                                 }
  1034.                                         break;
  1035.                                 case CHG_DAY:
  1036.                                         if(HIDE){
  1037.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  1038.                                                         TMP_TIME= 0x31;
  1039.                                                 }
  1040.                                         else{
  1041.                                                 if(Cut_num(&Time.Day) == 0xf9)
  1042.                                                         Time.Day= 0x31;
  1043.                                                 }
  1044.                                         break;
  1045.                                 case CHG_WEEK:
  1046.                                         if(HIDE){
  1047.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  1048.                                                         TMP_TIME= 0x7;
  1049.                                                 }
  1050.                                         else{
  1051.                                                 if(Cut_num(&Time.Week) == 0xf9)
  1052.                                                         Time.Week= 0x7;
  1053.                                                 }
  1054.                                         break;
  1055.                                 case CHG_YEAR:
  1056.                                         if(HIDE){
  1057.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  1058.                                                         TMP_TIME= 0x99;
  1059.                                                 }
  1060.                                         else{
  1061.                                                 if(Cut_num(&Time.Year) == 0xf9)
  1062.                                                         Time.Year = 0x99;
  1063.                                                 }
  1064.                                         //if(Cut_num(&Time.Year) == 0x99)
  1065.                                         //        Time.Year= 0;
  1066.                                         break;
  1067.                                 default:
  1068.                                         break;
  1069.                                 }
  1070. }

  1071. //======按鍵======
  1072. uchar ReadKey(){
  1073.         //
  1074.         if(!key_done){
  1075.         switch(MSG_KEY){
  1076.                 case KEY0_S:STATE = STA_sTIME;
  1077.                                         break;
  1078.                 case KEY1_S:STATE = STA_gWORD;        //STA_sWEEK
  1079.                                         break;
  1080.                 case KEY2_S:STATE = STA_gTEMP;
  1081.                                         break;
  1082.                 case KEY3_S:STATE = STA_gTIME;
  1083.                                         break;
  1084.                 case KEY0_L:STATE = STA_CHG;
  1085.                                         break;
  1086.                 case KEY1_L:STATE = STA_SONG;
  1087.                                         break;
  1088.                 case KEY2_L:STATE = STA_gTEMP;
  1089.                                         break;
  1090.                 case KEY3_L:STATE = STA_gWORD;        //STA_sTIME
  1091.                                         break;
  1092.                 default:        break;
  1093.                 }
  1094.                 }
  1095.         key_done = 1;        //按鍵事件處理完成
  1096.         return MSG_KEY;        
  1097. }
  1098. //=======================
  1099. //****校時按鍵處理****
  1100. //=======================
  1101. uchar ReadKey1(){
  1102.         //
  1103.         if(!key_done){
  1104.         switch(MSG_KEY){
  1105.                 case KEY0_S:                //切換校時對象
  1106.                 case KEY0_L:
  1107.                                         exit = 0;
  1108.                                         TR1 = 0;                //關(guān)閉定時器1閃爍
  1109.                                         Change_obj();
  1110.                                         if(CHANGE++ >= CHG_YEAR)
  1111.                                                 CHANGE = CHG_HOUR;
  1112.                                         TR1 = 1;                //開啟定時器1閃爍
  1113.                                         break;
  1114.                 case KEY1_S:                //加加
  1115.                 case KEY1_L:
  1116.                                         exit = 0;
  1117.                                         TR1 = 0;                //關(guān)閉定時器1閃爍
  1118.                                         Add_Time();
  1119.                                         TR1 = 1;                //開啟定時器1閃爍
  1120.                                         break;
  1121.                 case KEY2_S:                //減減
  1122.                 case KEY2_L:
  1123.                                         exit = 0;
  1124.                                         TR1 = 0;                //關(guān)閉定時器1閃爍
  1125.                                         Cut_Time();
  1126.                                         TR1 = 1;                //開啟定時器1閃爍
  1127.                                         break;
  1128.                 case KEY3_L:
  1129.                 case KEY3_S:
  1130.                                         return KEY3_S;
  1131.                 default:        break;
  1132.                 }
  1133.                 }
  1134.         key_done = 1;        //按鍵事件處理完成
  1135.         return 0;
  1136. }
  1137. //===========================
  1138. void Tinit(){
  1139.         TMOD = 0x11;
  1140.         TH0 = 0xD8;
  1141.         TL0 = 0xF0;
  1142.         TH1 = 0x42;
  1143.         TL1 = 0xCA;
  1144.         TR0 = 1;
  1145.         //TR1 = 1;
  1146.         ET0 = 1;
  1147.         ET1 = 1;
  1148.         EA = 1;
  1149. }

  1150. timer0() interrupt 1{
  1151.         TH0 = 0xb1;
  1152.         TL0 = 0xe0;

  1153.         if(P1 != 0xff) {//若有鍵按下
  1154.                 cur_key_val = P1&0x0f;        //記錄按鍵值
  1155.                 if(key_times < 150)
  1156.                         key_times++;  
  1157.                 else{
  1158.                         key_keep_times++;         //長按連擊
  1159.                         if(key_keep_times >= 10){  //10 1秒連擊10次
  1160.                                 key_keep_times = 0;
  1161.                                 MSG_KEY = 0x10 | cur_key_val;
  1162.                                 key_done = 0;        //按鍵事件復(fù)位
  1163.                                 }
  1164.                         }         
  1165.         }else{
  1166.                 if(key_times > 2 && key_times < 100 && key_done){        //短按鍵
  1167.                         MSG_KEY = cur_key_val;
  1168.                         key_done = 0;         //按鍵事件復(fù)位
  1169.                         }
  1170.                 else if(key_times >= 100 && key_done){        //長按鍵
  1171.                         MSG_KEY = 0x10 | cur_key_val;
  1172.                         key_done = 0;         //按鍵事件復(fù)位
  1173.                         }
  1174.                 key_times = 0;        
  1175.                 key_keep_times = 0;
  1176.                 }
  1177. }

  1178. timer1() interrupt 3{
  1179.         if(STATE == STA_CHG){
  1180.                 TH1 = 0x42;
  1181.                 TL1 = 0xCA;
  1182.                 if(hide_times++ == 8){
  1183.                         HIDE = 0;        //顯示
  1184.                         switch(CHANGE){
  1185.                                 case CHG_HOUR:
  1186.                                         Time.Hour =TMP_TIME;
  1187.                                         break;
  1188.                                 case CHG_MIN:
  1189.                                         Time.Minute = TMP_TIME;
  1190.                                         break;
  1191.                                 case CHG_SEC:
  1192.                                         Time.Second = TMP_TIME;
  1193.                                         break;
  1194.                                 case CHG_MON:
  1195.                                         Time.Month = TMP_TIME;
  1196.                                         break;
  1197.                                 case CHG_DAY:
  1198.                                         Time.Day = TMP_TIME;
  1199.                                         break;
  1200.                                 case CHG_WEEK:
  1201.                                         Time.Week = TMP_TIME;
  1202.                                         break;
  1203.                                 case CHG_YEAR:
  1204.                                         Time.Year = TMP_TIME;
  1205.                                         break;
  1206.                                 default:
  1207.                                         break;
  1208.                                 }
  1209.                  }
  1210.                  if(hide_times > 17){
  1211.                          hide_times = 0;
  1212.                         HIDE = 1;        //隱藏
  1213.                         exit++;
  1214.                         switch(CHANGE){
  1215.                                 case CHG_HOUR:
  1216.                                         TMP_TIME = Time.Hour;
  1217.                                         Time.Hour = 0xcc;
  1218.                                         break;
  1219.                                 case CHG_MIN:
  1220.                                         TMP_TIME = Time.Minute;
  1221.                                         Time.Minute = 0xcc;
  1222.                                         break;
  1223.                                 case CHG_SEC:
  1224.                                         TMP_TIME = Time.Second;
  1225.                                         Time.Second = 0xcc;
  1226.                                         break;
  1227.                                 case CHG_MON:
  1228.                                         TMP_TIME = Time.Month;
  1229.                                         Time.Month = 0xcc;
  1230.                                         break;
  1231.                                 case CHG_DAY:
  1232.                                         TMP_TIME = Time.Day;
  1233.                                         Time.Day = 0xcc;
  1234.                                         break;
  1235.                                 case CHG_WEEK:
  1236.                                         TMP_TIME = Time.Week;
  1237.                                         Time.Week = 0xcc;
  1238.                                         break;
  1239.                                 case CHG_YEAR:
  1240.                                         TMP_TIME = Time.Year;
  1241.                                         Time.Year = 0xcc;
  1242.                                         break;
  1243.                                 default:
  1244.                                         break;
  1245.                                 }
  1246.                 }
  1247.         }
  1248. }

  1249. void Compute_State(){
  1250.         switch(Time.Second){
  1251.                 case 0x1:
  1252.                         //STATE = STA_gTIME;
  1253.                         break;
  1254.                 case 0x2:
  1255.                         STATE = STA_sYEAR;
  1256.                         break;
  1257.                 case 0x15:
  1258.                         STATE = STA_sTEMP;
  1259.                         break;
  1260.                 case 0x31:
  1261.                         STATE = STA_sDATE;
  1262.                         break;
  1263.                 case 0x40:
  1264.                         STATE = STA_sWEEK;
  1265.                         break;
  1266.                 case 0x50:
  1267.                         STATE = STA_sTEMP;
  1268.                         break;
  1269.                 default:
  1270.                         break;
  1271.                 }
  1272.         if(Time.Minute%2 == 0 && Time.Second == 0)
  1273.                 STATE = STA_gTIME;
  1274.         if((Time.Minute&0x0f)%5 == 0 && Time.Second == 30)
  1275.                 STATE = STA_gTEMP;
  1276.         if((Time.Minute&0x0f) == 7 && Time.Second == 0)
  1277.                 STATE = STA_gWORD;
  1278.         if((Time.Minute&0x0f) == 3 && Time.Second == 0)
  1279.                 STATE = STA_SONG;
  1280. }
  1281. //;---------主程序循環(huán)--------------
  1282.                    void main()
  1283.                 {
  1284.                         int i;
  1285.                         initial();
  1286.                         Tinit();
  1287.                         Init_DS1302();
  1288.                         Read_TIME();        //讀取時間
  1289.                         Read_Temperature();
  1290.                         Show_Cpyrt();
  1291.                         //start_time();
  1292.                         //write_time1302();
  1293.                         MSG_MV = MSG_MV_L;
  1294.                         STATE        = STA_sTIME;
  1295.                         while(1)
  1296.                         {
  1297.                            ReadKey();
  1298.                                 switch(STATE){
  1299.                                         case STA_gTIME:
  1300.                                                 //添加代碼
  1301.                                                 MSG_MV = MSG_MV_L;
  1302.                                                 move_times = 0;
  1303.                                                 start_word=0;
  1304.                                                 Read_TIME();        //讀取時間
  1305.                                                 Show_All_Info();
  1306.                                                 MSG_KEY = KEY0_S;        //回到時間畫面
  1307.                                                 key_done = 0;
  1308.                                                 break;
  1309.                                         case STA_gTEMP:
  1310.                                                 Put_Wdispram(TMP_WORDS); //,start_word++
  1311.                                                 Read_Temperature();
  1312.                                                   Disp_Temperature();
  1313.                                                   Put_gTEMP();
  1314.                                                 //Move_Down();
  1315.                                                   Show_Move_Word(TMP_WORDS);
  1316.                                                 MSG_KEY = KEY0_S;        //回到時間畫面
  1317.                                                 key_done = 0;
  1318.                                                 break;
  1319.                                         case STA_gWORD:
  1320.                                                 //添加代碼
  1321.                                                 Put_Wdispram(MY_WORDS); //,start_word++         
  1322.                                                 //Move_Down();
  1323.                                                   Show_Move_Word(MY_WORDS);
  1324.                                                 MSG_KEY = KEY0_S;        //回到時間畫面
  1325.                                                 key_done = 0;
  1326.                                                 break;
  1327.                                         case STA_sTIME:
  1328.                                                 //添加代碼
  1329.                                                 MSG_MV = MSG_MV_L;
  1330.                                                 move_times = 0;
  1331.                                                 start_word=0;
  1332.                                                 Read_TIME();        //讀取時間
  1333.                                                 Put_Tdispram(0);        
  1334.                                                 Show_sWord();
  1335.                                                 Compute_State();
  1336.                                                 break;
  1337.                                         case STA_sDATE:
  1338.                                                 //添加代碼
  1339.                                                 MSG_MV = MSG_MV_L;
  1340.                                                 move_times = 0;
  1341.                                                 start_word=0;
  1342.                                                 Read_TIME();        //讀取時間
  1343.                                                 Put_Ddispram(8);
  1344.                                                 Move_Down();
  1345.                                                 Put_Ddispram(0);
  1346.                                                 for(i=0;i<8;i++)
  1347.                                                         Show_sWord();
  1348.                                                 Read_TIME();
  1349.                                                 Put_Tdispram(8);
  1350.                                                 Move_Up();
  1351.                                                 MSG_KEY = KEY0_S;        //回到時間畫面
  1352.                                                 key_done = 0;
  1353.                                                 break;
  1354.                                         case STA_sWEEK:
  1355.                                                 //添加代碼
  1356.                                                 MSG_MV = MSG_MV_L;
  1357.                                                 move_times = 0;
  1358.                                                 start_word=0;
  1359.                                                 Read_TIME();        //讀取時間
  1360.                                                 Put_Kdispram(8);
  1361.                                                 Move_Up();        //Move_Down();
  1362.                                                 for(i=0;i<8;i++){        
  1363.                                                         Read_TIME();        //讀取時間
  1364.                                                         Put_Kdispram(0);
  1365.                                                         Show_sWord();
  1366.                                                         }
  1367.                                                 Read_TIME();
  1368.                                                 Put_Tdispram(8);
  1369.                                                 Move_Down();        //Move_Up();
  1370.                                                 MSG_KEY = KEY0_S;        //回到時間畫面
  1371.                                                 key_done = 0;
  1372.                                                 break;
  1373.                                         case STA_sYEAR:
  1374.                                                 MSG_MV = MSG_MV_L;
  1375.                                                 move_times = 0;
  1376.                                                 start_word=0;
  1377.                                                 Read_TIME();        //讀取時間
  1378.                                                 Put_Ydispram(8);
  1379.                                                 Move_Down();
  1380.                                                 for(i=0;i<8;i++){        
  1381.                                                         Read_TIME();        //讀取時間
  1382.                                                         Put_Ydispram(0);
  1383.                                                         Show_sWord();
  1384.                                                         }
  1385.                                                 Read_TIME();
  1386.                                                 Put_Tdispram(8);
  1387.                                                 Move_Up();
  1388.                                                 MSG_KEY = KEY0_S;        //回到時間畫面
  1389.                                                 key_done = 0;
  1390.                                                 break;
  1391.                                         case STA_sTEMP:
  1392.                                                 //添加代碼
  1393.                                                 MSG_MV = MSG_MV_L;
  1394.                                                 move_times = 0;
  1395.                                                 start_word=0;
  1396.                                                 Read_Temperature();
  1397.                                                   Disp_Temperature();
  1398.                                                 Put_sTEMP(8);
  1399.                                                 Move_Up();        //Move_Down();
  1400.                                                 for(i=0;i<8;i++)        {
  1401.                                                         Read_Temperature();
  1402.                                                           Disp_Temperature();
  1403.                                                         Put_sTEMP(0);
  1404.                                                         Show_sWord();
  1405.                                                         }
  1406.                                                 Read_TIME();
  1407.                                                 Put_Tdispram(8);
  1408.                                                 Move_Down();        //Move_Up();
  1409.                                                 MSG_KEY = KEY0_S;        //回到時間畫面
  1410.                                                 key_done = 0;
  1411.                                                 break;
  1412.                                         case STA_sWORD:
  1413.                                                 //添加代碼
  1414.                                                 break;
  1415.                                         case STA_CHG:
  1416.                                                 //校時模式
  1417.                                                 Change_Time();
  1418.                                                 write_time1302();
  1419.                                                 Read_TIME();
  1420.                                                 Put_Tdispram(8);
  1421.                                                 Move_Up();
  1422.                                                 MSG_KEY = KEY0_S;
  1423.                                                 break;
  1424.                                         case STA_SONG:
  1425.                                                 MSG_MV = MSG_MV_L;
  1426.                                                 move_times = 0;
  1427.                                                 start_word=0;
  1428.                                                 Show_Song();
  1429.                                                 MSG_KEY = KEY0_S;
  1430.                                                 key_done = 0;
  1431.                                                 break;
  1432.                                         default:
  1433.                                                 break;
  1434.                                          }
  1435.                         }
  1436.                  }

復(fù)制代碼

所有資料51hei提供下載:
點陣時鐘proteus仿真.rar (209.37 KB, 下載次數(shù): 92)


評分

參與人數(shù) 1黑幣 +90 收起 理由
admin + 90 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2019-3-5 15:47 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久岛一牛影视 | 精品国产欧美在线 | 免费成人高清在线视频 | 亚洲福利| 亚洲一区二区精品视频 | 一区二区三区免费 | 毛片入口 | 不卡在线视频 | 三区四区在线观看 | 欧美日韩成人 | 日本h片在线观看 | 亚洲精品久久久久久久久久久久久 | 中文字幕一级 | 精品av | 久久99久久久久 | 成人精品国产免费网站 | 特黄毛片 | 亚洲高清在线观看 | 国产精品久久久久久久久久 | 日韩在线中文 | 国产一区二区影院 | 国产三级一区二区 | 日韩免费视频一区二区 | 欧美亚洲国产精品 | 鸳鸯谱在线观看高清 | 香蕉久久av | 在线免费观看日本视频 | 国产精品综合网 | 狠狠操你 | 午夜精品一区二区三区免费视频 | 国产精品99久 | 国产精品99久久久久久www | 一区二区三区日本 | 亚洲成人精品影院 | 免费观看色 | 久久噜噜噜精品国产亚洲综合 | 夜夜撸av| 亚洲欧美一区二区三区1000 | 91精品国产91久久久久久最新 | 激情五月婷婷丁香 | 亚洲视频欧美视频 |