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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求學霸幫忙,液晶顯示器有顯示時間、但是時間不正確

[復制鏈接]
跳轉到指定樓層
樓主


  1.   /************************************************
  2. 下面是一個多功能的電子萬年歷的程序。
  3. 主要功能:
  4.                 1、顯示當前的日期及標準北京時間
  5.                 2、實時檢測當前溫度并通過1602顯示出來
  6.                 3、具有可調的鬧鐘功能,通過按鍵調整鬧鐘的起
  7.                    鬧時間
  8.                 4、通過按鍵實現畫面的切換
  9. ************************************************/
  10. #include<reg51.h>
  11. #include<intrins.h>
  12. #define uchar unsigned char
  13. #define uint unsigned int
  14. uchar code digit[]={"0123456789"};     //定義字符數組顯示數字
  15. uchar code Error[]="Error!Check!";     //說明沒有檢測到DS18B20
  16. uchar code table[]="Alarm Clock";
  17. uchar code table1[]="0123456789";
  18. uchar code table2[]="WEEK";
  19. uchar code table3[]="Today is fine!";
  20. uchar code table4[]="HELLO!";
  21. uchar code table5[]="Made by lanxiaoling";
  22. uchar code table6[]="Happy new year!";//1.1
  23. uchar code table7[]="Valentine's Day"; //2.14
  24. /*uchar code table8[]="Qing Ming jie!";//4.5
  25. uchar code table9[]="Happy Labor Day!";//5.1
  26. uchar code table10[]="Duan Wu jie!";//6.15
  27. uchar code table11[]="Army day!";//8.1
  28. uchar code table12[]="Teacher's Day!";//9.10
  29. uchar code table13[]="National Day!";//10.1        
  30. /*******************************************************************************
  31. 以下是對液晶模塊的操作程序
  32. *******************************************************************************/
  33. sbit RS=P2^0;           //寄存器選擇位,將RS位定義為P2.0引腳
  34. sbit RW=P2^1;           //讀寫選擇位,將RW位定義為P2.1引腳
  35. sbit E=P2^2;            //使能信號位,將E位定義為P2.2引腳
  36. sbit BF=P0^7;           //忙碌標志位,,將BF位定義為P0.7引腳
  37. sbit DQ=P2^6;
  38. sbit T_RST=P1^5;
  39. sbit T_CLK=P1^3;               
  40. sbit T_IO=P1^4;

  41. sbit beep=P2^4;
  42. sbit key1=P3^0;          //調鬧鐘的小時即x
  43. sbit key2=P3^1;          //調鬧鐘的分鐘即y
  44. sbit key3=P3^2;          //顯示切換
  45. sbit key4=P3^3;
  46. sbit ACC0=ACC^0;
  47. sbit ACC7=ACC^7;
  48. uchar time;   //設置全局變量,專門用于嚴格延時
  49. static uchar x=0x08,y=30;
  50. uchar t_sec,sec1,sec2;
  51. uchar t_min,min1,min2;
  52. uchar t_hour,hour1,hour2;
  53. uchar t_mon,mon1,mon2;
  54. uchar t_day,day1,day2;
  55. uchar t_year,year1,year2;
  56. uchar week,week1;
  57. uchar com,inf;
  58. void tixing(unsigned char mm,unsigned dd);
  59. void show();
  60. void delay1(uchar t)
  61. {
  62.         uchar a,b;
  63.         for(a=t;a>0;a--)
  64.         for(b=110;b>0;b--);
  65. }
  66. /*****************************************************
  67. 函數功能:延時1ms
  68. (3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒
  69. ***************************************************/
  70. void delay1ms()
  71. {
  72.         uchar i,j;        
  73.         for(i=0;i<10;i++)
  74.          for(j=0;j<33;j++)
  75.            ;                 
  76. }
  77. /*****************************************************
  78. 函數功能:延時若干毫秒
  79. 入口參數:n
  80. ***************************************************/
  81. void delaynms(uchar n)
  82. {
  83.    uchar i;
  84.         for(i=0;i<n;i++)
  85.            delay1ms();
  86. }
  87. /*****************************************************
  88. 函數功能:判斷液晶模塊的忙碌狀態
  89. 返回值:result。result=1,忙碌;result=0,不忙
  90. ***************************************************/
  91. bit BusyTest(void)
  92.   {
  93.     bit result;
  94.         RS=0;       //根據規定,RS為低電平,RW為高電平時,可以讀狀態
  95.     RW=1;
  96.     E=1;        //E=1,才允許讀寫
  97.     _nop_();   //空操作
  98.     _nop_();
  99.     _nop_();
  100.     _nop_();   //空操作四個機器周期,給硬件反應時間        
  101.     result=BF;  //將忙碌標志電平賦給result
  102.    E=0;         //將E恢復低電平
  103.    return result;
  104.   }
  105.   /*****************************************************
  106. 函數功能:將模式設置指令或顯示地址寫入液晶模塊
  107. 入口參數:dictate
  108. ***************************************************/
  109. void WriteInstruction (uchar dictate)
  110. {   
  111.     while(BusyTest()==1);   //如果忙就等待
  112.          RS=0;                  //根據規定,RS和R/W同時為低電平時,可以寫入指令
  113.          RW=0;   
  114.          E=0;                   //E置低電平(根據表8-6,寫指令時,E為高脈沖,
  115.                            // 就是讓E從0到1發生正跳變,所以應先置"0"
  116.          _nop_();
  117.          _nop_();               //空操作兩個機器周期,給硬件反應時間
  118.          P0=dictate;            //將數據送入P0口,即寫入指令或地址
  119.          _nop_();
  120.          _nop_();
  121.          _nop_();
  122.          _nop_();               //空操作四個機器周期,給硬件反應時間
  123.          E=1;                   //E置高電平
  124.          _nop_();
  125.          _nop_();
  126.          _nop_();
  127.          _nop_();               //空操作四個機器周期,給硬件反應時間
  128.           E=0;                  //當E由高電平跳變成低電平時,液晶模塊開始執行命令
  129. }
  130. /*****************************************************
  131. 函數功能:指定字符顯示的實際地址
  132. 入口參數:x
  133. ***************************************************/
  134. void WriteAddress(unsigned char x)
  135. {
  136.      WriteInstruction(x|0x80); //顯示位置的確定方法規定為"80H+地址碼x"
  137. }
  138. /*****************************************************
  139. 函數功能:將數據(字符的標準ASCII碼)寫入液晶模塊
  140. 入口參數:y(為字符常量)
  141. ***************************************************/
  142. void WriteData(uchar y)
  143. {
  144.     while(BusyTest()==1);  
  145.           RS=1;           //RS為高電平,RW為低電平時,可以寫入數據
  146.           RW=0;
  147.           E=0;            //E置低電平(根據表8-6,寫指令時,E為高脈沖,
  148.                      // 就是讓E從0到1發生正跳變,所以應先置"0"
  149.           P0=y;           //將數據送入P0口,即將數據寫入液晶模塊
  150.           _nop_();
  151.           _nop_();
  152.            _nop_();
  153.      _nop_();       //空操作四個機器周期,給硬件反應時間
  154.           E=1;           //E置高電平
  155.           _nop_();
  156.           _nop_();
  157.           _nop_();
  158.          _nop_();        //空操作四個機器周期,給硬件反應時間
  159.          E=0;            //當E由高電平跳變成低電平時,液晶模塊開始執行命令
  160. }
  161. /*****************************************************
  162. 函數功能:對LCD的顯示模式進行初始化設置
  163. ***************************************************/
  164. void LcdInitiate(void)
  165. {
  166.     delaynms(15);               //延時15ms,首次寫指令時應給LCD一段較長的反應時間
  167.     WriteInstruction(0x38);     //顯示模式設置:16×2顯示,5×7點陣,8位數據接口
  168.         delaynms(5);                //延時5ms ,給硬件一點反應時間
  169.     WriteInstruction(0x38);
  170.         delaynms(5);               //延時5ms ,給硬件一點反應時間
  171.         WriteInstruction(0x38);     //連續三次,確保初始化成功
  172.         delaynms(5);               //延時5ms ,給硬件一點反應時間
  173.         WriteInstruction(0x0c);     //顯示模式設置:顯示開,無光標,光標不閃爍
  174.         delaynms(5);               //延時5ms ,給硬件一點反應時間
  175.         WriteInstruction(0x06);     //顯示模式設置:光標右移,字符不移
  176.         delaynms(5);                //延時5ms ,給硬件一點反應時間
  177.         WriteInstruction(0x01);     //清屏幕指令,將以前的顯示內容清除
  178.         delaynms(5);             //延時5ms ,給硬件一點反應時間
  179. }
  180. void write_com(uchar com)//向1602寫指令
  181. {
  182.          RS=0;
  183.          RW=0;
  184.          P0=com;
  185.          delaynms(10);
  186.          E=1;
  187.          delaynms(10);
  188.          E=0;
  189. }
  190. /*****************************************************
  191. 函數功能:將DS18B20傳感器初始化,讀取應答信號
  192. 出口參數:flag
  193. ***************************************************/
  194. bit Init_DS18B20(void)        
  195. {
  196.          bit flag;         //儲存DS18B20是否存在的標志,flag=0,表示存在;flag=1,表示不存在
  197.          DQ = 1;           //先將數據線拉高
  198.          for(time=0;time<2;time++) //略微延時約6微秒
  199.              ;
  200.          DQ = 0;           //再將數據線從高拉低,要求保持480~960us
  201.          for(time=0;time<200;time++)  //略微延時約600微秒
  202.              ;         //以向DS18B20發出一持續480~960us的低電平復位脈沖
  203.          DQ = 1;           //釋放數據線(將數據線拉高)
  204.          for(time=0;time<10;time++)
  205.              ;  //延時約30us(釋放總線后需等待15~60us讓DS18B20輸出存在脈沖)
  206.          flag=DQ;          //讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在)      
  207.          for(time=0;time<200;time++)  //延時足夠長時間,等待存在脈沖輸出完畢
  208.               ;
  209.          return (flag);    //返回檢測成功標志
  210. }
  211. /*****************************************************
  212. 函數功能:從DS18B20讀取一個字節數據
  213. 出口參數:dat
  214. ***************************************************/
  215. uchar ReadOneChar(void)
  216. {
  217.         uchar i=0;        
  218.         uchar dat;  //儲存讀出的一個字節數據
  219.         for (i=0;i<8;i++)
  220.          {
  221.            
  222.            DQ =1;       // 先將數據線拉高
  223.            _nop_();            //等待一個機器周期         
  224.            DQ = 0;      //單片機從DS18B20讀書據時,將數據線從高拉低即啟動讀時序
  225.                 dat>>=1;
  226.            _nop_();     //等待一個機器周期                  
  227.            DQ = 1;     //將數據線"人為"拉高,為單片機檢測DS18B20的輸出電平作準備
  228.            for(time=0;time<2;time++)
  229.          ;      //延時約6us,使主機在15us內采樣
  230.            if(DQ==1)
  231.                         dat|=0x80;  //如果讀到的數據是1,則將1存入dat
  232.                 else
  233.                         dat|=0x00;//如果讀到的數據是0,則將0存入dat
  234.              //將單片機檢測到的電平信號DQ存入r[i]        
  235.            for(time=0;time<8;time++)
  236.                       ;              //延時3us,兩個讀時序之間必須有大于1us的恢復期        
  237.     }                           
  238. return(dat);    //返回讀出的十進制數據
  239. }
  240. /*****************************************************
  241. 函數功能:向DS18B20寫入一個字節數據
  242. 入口參數:dat
  243. ***************************************************/  
  244. void WriteOneChar(uchar dat)
  245. {
  246.         uchar i=0;
  247.         for (i=0; i<8; i++)
  248.         {
  249.           DQ =1;         // 先將數據線拉高
  250.           _nop_();             //等待一個機器周期         
  251.           DQ=0;          //將數據線從高拉低時即啟動寫時序      
  252.           DQ=dat&0x01;   //利用與運算取出要寫的某位二進制數據,
  253.                        //并將其送到數據線上等待DS18B20采樣        
  254.           for(time=0;time<10;time++)        
  255.              ;//延時約30us,DS18B20在拉低后的約15~60us期間從數據線上采樣
  256.           DQ=1;          //釋放數據線                    
  257.           for(time=0;time<1;time++)
  258.                   ;//延時3us,兩個寫時序間至少需要1us的恢復期
  259.           dat>>=1;       //將dat中的各二進制位數據右移1位
  260.         }
  261.                   for(time=0;time<4;time++)
  262.                               ; //稍作延時,給硬件一點反應時間
  263. }
  264. /*****************************************************
  265. 函數功能:顯示沒有檢測到DS18B20
  266. ***************************************************/   
  267. void display_error(void)
  268. {
  269.         uchar i;
  270.     WriteAddress(0x00);    //寫顯示地址,將在第1行第1列開始顯示
  271.         i = 0;                //從第一個字符開始顯示
  272.         while(Error[i] != '\0')  //只要沒有寫到結束標志,就繼續寫
  273.         {                                                
  274.                 WriteData(Error[i]);   //將字符常量寫入LCD
  275.                 i++;                 //指向下一個字符
  276.                 delaynms(100);        //延時100ms較長時間,以看清關于顯示的說明
  277.         }        
  278.         while(1)              //進入死循環,等待查明原因
  279.                   ;
  280. }
  281. /*****************************************************
  282. 函數功能:顯示溫度的小數點
  283. ***************************************************/   
  284. void display_dot(void)
  285. {         
  286.          WriteAddress(0x80+0x40+0x03);          //寫顯示地址,將在第2行第10列開始顯示                  
  287.          WriteData('.');      //將小數點的字符常量寫入LCD
  288.          delaynms(50);         //延時1ms給硬件一點反應時間               
  289. }
  290. /*****************************************************
  291. 函數功能:顯示溫度的單位(Cent)
  292. ***************************************************/   
  293. void display_cent(void)
  294. {  
  295.     WriteAddress(0x80+0x40+0x05);        //寫顯示地址,將在第2行第13列開始顯示        
  296.         WriteData(0xdf);
  297.         WriteAddress(0x80+0x40+0x06);
  298.         WriteData('C');        
  299. }
  300. /*****************************************************
  301. 函數功能:顯示溫度的整數部分
  302. 入口參數:x
  303. ***************************************************/
  304. void display_temp1(unsigned char x)
  305. {
  306.         uchar j,k,l;     //j,k,l分別儲存溫度的百位、十位和個位
  307.         j=x/100;              //取百位
  308.         k=(x%100)/10;    //取十位
  309.         l=x%10;             //取個位  
  310.         WriteAddress(0x80+0x40);    //寫顯示地址,將在第2行第7列開始顯示
  311.         WriteData(digit[j]);    //將百位數字的字符常量寫入LCD
  312.         WriteData(digit[k]);    //將十位數字的字符常量寫入LCD
  313.         WriteData(digit[l]);    //將個位數字的字符常量寫入LCD
  314.         delaynms(50);         //延時1ms給硬件一點反應時間     
  315. }
  316. /*****************************************************
  317. 函數功能:顯示溫度的小數數部分
  318. 入口參數:x
  319. ***************************************************/
  320. void display_temp2(uchar x)
  321. {
  322.          WriteAddress(0x80+0x40+0x04);      //寫顯示地址,將在第2行第11列開始顯示
  323.         WriteData(digit[x]);     //將小數部分的第一位數字字符常量寫入LCD
  324.         delaynms(50);          //延時1ms給硬件一點反應時間
  325. }
  326. /*****************************************************
  327. 函數功能:做好讀溫度的準備
  328. ***************************************************/
  329. void ReadyReadTemp(void)
  330. {
  331.         Init_DS18B20();     //將DS18B20初始化
  332.         WriteOneChar(0xCC); // 跳過讀序號列號的操作
  333.         WriteOneChar(0x44); // 啟動溫度轉換         
  334.     for(time=0;time<100;time++)
  335.             ;         //溫度轉換需要一點時間
  336.         Init_DS18B20();     //將DS18B20初始化
  337.         WriteOneChar(0xCC); //跳過讀序號列號的操作
  338.         WriteOneChar(0xBE); //讀取溫度寄存器,前兩個分別是溫度的低位和高位        
  339. }
  340. /*******************************************
  341. 向1302寫一個字節
  342. *******************************************/
  343. void input_BYTE(uchar dat)
  344. {
  345.         uchar i;
  346.         ACC=dat;
  347.         for(i=8;i>0;i--)
  348.         {
  349.                
  350.                 T_IO=ACC0;
  351.                 T_CLK=1;
  352.                 T_CLK=0;
  353.                 ACC=(ACC>>1);
  354.         }
  355. }
  356. /*******************************************
  357. 1302讀出一個字節
  358. *******************************************/
  359. uchar output_BYTE()
  360. {
  361.         uchar i;
  362.         for(i=8;i>0;i--)
  363.         {
  364.            ACC=(ACC>>1);
  365.            ACC7=T_IO;
  366.            T_CLK=1;
  367.            T_CLK=0;
  368.         }
  369.         return (ACC);
  370. }
  371. /*******************************************
  372. 寫數據
  373. *******************************************/
  374. void write_1302(uchar add,uchar dat)
  375. {
  376.         T_RST=0;
  377.         T_CLK=0;
  378.         T_RST=1;
  379.         input_BYTE(add);
  380.         input_BYTE(dat);
  381.         T_CLK=1;
  382.         T_RST=0;
  383. }
  384. /*******************************************
  385. 讀數據
  386. *******************************************/
  387. uchar read_1302(uchar add)
  388. {
  389.         uchar inf;        
  390.         T_RST=0;
  391.     T_CLK=0;
  392.         T_RST=1;
  393.         input_BYTE(add);
  394.         inf=output_BYTE();
  395.         T_CLK=1;
  396.         T_RST=0;
  397.         return (inf);
  398. }
  399. void init_1302()
  400. {
  401.         write_1302(0x8e,0x00);//關閉寫保護;
  402. //        write_1302(0x90,0xaa);//設置充電方式;
  403.         write_1302(0x80,0x00);//秒寄存器初始化;
  404.         write_1302(0x82,0x29);//分.......
  405.         write_1302(0x84,0x08);//時.......
  406.         write_1302(0x86,0x03);//日........
  407.         write_1302(0x88,0x06);//月.......
  408.         write_1302(0x8a,0x05);//星期...
  409.         write_1302(0x8c,0x11);//年......                 
  410.         write_1302(0x8e,0x80);//打開寫保護;               
  411. }
  412. /**********************************
  413. 鬧鐘顯示子程序
  414. **********************************/
  415. void show_naozhong(uchar x,uchar y)
  416. {
  417.         uchar i,x1,x2,y1,y2;
  418.         x1=x/10; //十位
  419.         x2=x%10;//個位        
  420.         WriteAddress(0x80+0x0b);   //顯示鬧鐘的小時部分
  421.         WriteData(table1[x1]);
  422.         WriteAddress(0x80+0x0c);
  423.         WriteData(table1[x2]);
  424.         
  425.         y1=y/10; //十位
  426.         y2=y%10;//個位        
  427.         WriteAddress(0x80+0x0e);   //顯示鬧鐘的分鐘部分
  428.         WriteData(table1[y1]);
  429.         WriteAddress(0x80+0x0f);
  430.         WriteData(table1[y2]);
  431.         
  432.         WriteAddress(0x80+0x0d);   //顯示小時與分鐘之間的那個冒號
  433.         WriteData(':');

  434.         WriteAddress(0x80);                   //顯示字符串:Alarm Clock
  435.         for(i=0;i<11;i++)
  436.         {
  437.                 WriteData(table[i]);        
  438.         }
  439.         WriteAddress(0x80+0x40);   //顯示字符串:Today is fine!
  440.         for(i=0;i<14;i++)
  441.         {
  442.                 WriteData(table3[i]);        
  443.         }                        
  444. }
  445. void main(void)
  446. {         
  447.     uchar i;
  448.         uchar TL;     //儲存暫存器的溫度低位
  449.         uchar TH;    //儲存暫存器的溫度高位
  450.         uchar TN;      //儲存溫度的整數部分
  451.         uchar TD;       //儲存溫度的小數部分
  452.         LcdInitiate();         //將液晶初始化
  453.     init_1302();
  454.     delaynms(5);        //延時5ms給硬件一點反應時間        
  455. //        if(Init_DS18B20()==1)
  456. //   display_error();
  457.         EA=1;//開總中斷
  458.         EX1=1;//開外部中斷1
  459.         IT1=0;//下降沿觸發

  460.         WriteAddress(0x80+0x10);
  461.         for(i=0;i<6;i++)
  462.         {
  463.                 WriteData(table4[i]);               
  464.         }
  465.         WriteAddress(0x80+0x50);
  466.         for(i=0;i<16;i++)
  467.         {
  468.                 WriteData(table5[i]);        
  469.         }
  470.         for(i=0;i<16;i++)
  471.         {
  472.                 write_com(0x18);
  473.                 delaynms(250);        
  474.         }
  475.         delaynms(250);
  476.         delaynms(250);
  477.         delaynms(250);
  478.         write_com(0x01);
  479.         while(1)
  480.         {
  481.                 t_sec=read_1302(0x81);//讀秒 ;
  482.                 sec1=t_sec&0x0f;
  483.                 sec2=(t_sec>>4);
  484.         
  485.                 t_min=read_1302(0x83);//讀分 ;
  486.                 min1=t_min&0x0f;
  487.                 min2=(t_min>>4);
  488.         
  489.                 t_hour=read_1302(0x85);//讀小時 ;
  490.                 hour1=t_hour&0x0f;
  491.                 hour2=(t_hour>>4);

  492. //                WriteAddress(0x80+0x40+0x08); //顯示小時
  493. //                WriteData(table1[hour2]);                 
  494. //                WriteAddress(0x80+0x40+0x09);
  495. //                WriteData(table1[hour1]);
  496.         
  497.                 t_day=read_1302(0x87);//讀日;
  498.                 day1=t_day&0x0f;
  499.                 day2=(t_day>>4);
  500.         
  501.                 t_mon=read_1302(0x89);//讀月 ;
  502.                 mon1=t_mon&0x0f;
  503.                 mon2=(t_mon>>4);
  504.         
  505.                 week=read_1302(0x8b);//讀星期 ;
  506.                 week1=week&0x0f;
  507.         
  508.                 t_year=read_1302(0x8d);//讀年 ;
  509.                 year1=t_year&0x0f;
  510.                 year2=(t_year>>4);
  511.         
  512.                 WriteAddress(0x80+0x06);         
  513.                 WriteData('2');
  514.                 WriteAddress(0x80+0x07);         
  515.                 WriteData('0');        
  516.                
  517.                
  518.                 WriteAddress(0x80);          //顯示星期(0x80~0x80+0x05)
  519.                 for(i=0;i<4;i++)
  520.                 {
  521.                         WriteData(table2[i]);        
  522.                 }
  523.                 WriteAddress(0x80+0x04);
  524.                 WriteData(table1[week1]);
  525.                         
  526.                 WriteAddress(0x80+0x08);//顯示年         
  527.                 WriteData(table1[year2]);
  528.                 WriteAddress(0x80+0x09);         
  529.                 WriteData(table1[year1]);
  530.                         
  531.                 WriteAddress(0x80+0x0a);        //顯示‘/’
  532.                 WriteData('/');
  533.         
  534.                 WriteAddress(0x80+0x0b);//顯示月
  535.                 WriteData(table1[mon2]);                 
  536.                 WriteAddress(0x80+0x0c);
  537.                 WriteData(table1[mon1]);
  538.                 WriteAddress(0x80+0x0d);        //顯示‘/’
  539.                 WriteData('/');
  540.         
  541.                 WriteAddress(0x80+0x0e);//顯示日
  542.                 WriteData(table1[day2]);                 
  543.                 WriteAddress(0x80+0x0f);
  544.                 WriteData(table1[day1]);
  545.                 /*第一行在此顯示完畢*/                 
  546.             display_dot();       //顯示溫度的小數點
  547.             display_cent();      //顯示溫度的單位
  548.         
  549.                 WriteAddress(0x80+0x40+0x08); //顯示小時
  550.                 WriteData(table1[hour2]);                 
  551.                 WriteAddress(0x80+0x40+0x09);
  552.                 WriteData(table1[hour1]);               
  553.         
  554.                 WriteAddress(0x80+0x40+0x0a);  //顯示':'
  555.                 WriteData(':');                                 
  556.         
  557.                 WriteAddress(0x80+0x40+0x0b);  //顯示分鐘
  558.                 WriteData(table1[min2]);                          
  559.                 WriteAddress(0x80+0x40+0x0c);
  560.                 WriteData(table1[min1]);                 
  561.         
  562.                 WriteAddress(0x80+0x40+0x0d); //顯示':'
  563.                 WriteData(':');                                
  564.         
  565.                 WriteAddress(0x80+0x40+0x0e); //顯示秒
  566.                 WriteData(table1[sec2]);                        
  567.                 WriteAddress(0x80+0x40+0x0f);
  568.                 WriteData(table1[sec1]);
  569.                 /*第二行在此顯示完畢*/
  570.                 ReadyReadTemp();     //讀溫度準備
  571.             TL=ReadOneChar();    //先讀的是溫度值低位
  572.                 TH=ReadOneChar();    //接著讀的是溫度值高位
  573.                 TN=TH*16+TL/16;      //實際溫度值=(TH*256+TL)/16,即:TH*16+TL/16
  574.                                           //這樣得出的是溫度的整數部分,小數部分被丟棄了
  575.             TD=(TL%16)*10/16;    //計算溫度的小數部分,將余數乘以10再除以16取整,
  576.                                           //這樣得到的是溫度小數部分的第一位數字(保留1位小數)
  577.             display_temp1(TN);    //顯示溫度的整數部分
  578.             display_temp2(TD);    //顯示溫度的小數部分
  579.                 //以下部分是鬧鐘鍵盤檢測程序
  580.                 if((x==hour2*10+hour1)&&(y==min2*10+min1))//若時間到了,則開啟鬧鐘
  581.                 {
  582.                         beep=0;        
  583.                 }
  584.                 else                 //否則,關閉鬧鐘
  585.                 {
  586.                         beep=1;
  587.                 }        
  588.             delaynms(10);
  589.                 tixing(t_mon,t_day);                                
  590.         }                                          
  591. }
  592. void exter1()interrupt 2
  593. {        
  594.         uint k;
  595.         write_com(0x01);
  596.         for(k=0;k<2000;k++)
  597.         {
  598.                 while(key1==0)                   //鍵盤掃描.當key1按下時,
  599.                 {                                           //鬧鐘的小時部分加一
  600.                         delaynms(10);
  601.                         if(key1==0)                   //消抖
  602.                         {
  603.                                 delaynms(10);
  604.                                 while(key1==0);        //松手檢測
  605.                                 x++;
  606.                                 if(x==24)           //小時部分加到24后自動清零
  607.                                 x=0;
  608.                         }        
  609.                 }
  610.                 while(key2==0)                //鍵盤檢測。當key2按下時,
  611.                 {
  612.                         delaynms(10);        //鬧鐘的分鐘部分加一
  613.                         if(key2==0)                //消抖
  614.                         {
  615.                                 delaynms(10);
  616.                                 while(key2==0);//松手檢測
  617.                                 y++;
  618.                                 if(y==60)          //若分鐘部分加到60,則自動清零
  619.                                 y=0;
  620.                         }        
  621.                 }                        
  622.                 show_naozhong(x,y);          //調用鬧鐘顯示程序
  623.         }
  624.         write_com(0x01);
  625. }
  626. void tixing(unsigned char mm,unsigned dd)
  627. {
  628.         uchar i;
  629.         if(mm==0x01&&dd==0x01)
  630.         {
  631.                 while(1)
  632.                 {
  633.                         WriteAddress(0x80);
  634.                         for(i=0;i<16;i++)
  635.                         {
  636.                                 WriteData(table6[i]);        
  637.                         }
  638.                         show();
  639.                         if(mm!=0x01||dd!=0x01)
  640.                         break;                        
  641.                 }                                
  642.         }
  643.         if(mm==0x02&&dd==0x14)
  644.         {
  645.                 while(1)
  646.                 {
  647.                         WriteAddress(0x80);
  648.                         for(i=0;i<16;i++)
  649.                         {
  650.                                 WriteData(table7[i]);        
  651.                         }
  652.                         show();
  653.                         if(mm!=0x02||dd!=0x14)
  654.                         break;                        
  655.                 }               
  656.         }
  657. /*         if(mm==0x04&&dd==0x05)
  658.         {
  659.                 while(1)
  660.                 {
  661.                         WriteAddress(0x80);
  662.                         for(i=0;i<16;i++)
  663.                         {
  664.                                 WriteData(table8[i]);        
  665.                         }
  666.                         show();
  667.                         if(mm!=0x04||dd!=0x05)
  668.                         break;                        
  669.                 }               
  670.         }
  671.         if(mm==0x05&&dd==0x01)
  672.         {
  673.                 while(1)
  674.                 {
  675.                         WriteAddress(0x80);
  676.                         for(i=0;i<16;i++)
  677.                         {
  678.                                 WriteData(table9[i]);        
  679.                         }
  680.                         show();
  681.                         if(mm!=0x05||dd!=0x01)
  682.                         break;                        
  683.                 }               
  684.         }
  685.         if(mm==0x06&&dd==0x15)
  686.         {
  687.                 while(1)
  688.                 {
  689.                         WriteAddress(0x80);
  690.                         for(i=0;i<16;i++)
  691.                         {
  692.                                 WriteData(table10[i]);        
  693.                         }
  694.                         show();
  695.                         if(mm!=0x06||dd!=0x15)
  696.                         break;                        
  697.                 }               
  698.         }
  699.         if(mm==0x08&&dd==0x01)
  700.         {
  701.                 while(1)
  702.                 {
  703.                         WriteAddress(0x80);
  704.                         for(i=0;i<16;i++)
  705.                         {
  706.                                 WriteData(table11[i]);        
  707.                         }
  708.                         show();
  709.                         if(mm!=0x08||dd!=0x01)
  710.                         break;                        
  711.                 }               
  712.         }
  713.         if(mm==0x09&&dd==0x10)
  714.         {
  715.                 while(1)
  716.                 {
  717.                         WriteAddress(0x80);
  718.                         for(i=0;i<16;i++)
  719.                         {
  720.                                 WriteData(table12[i]);        
  721.                         }
  722.                         show();
  723.                         if(mm!=0x09||dd!=0x10)
  724.                         break;                        
  725.                 }               
  726.         }
  727.         if(mm==0x10&&dd==0x01)
  728.         {
  729.                 while(1)
  730.                 {
  731.                         WriteAddress(0x80);
  732.                         for(i=0;i<16;i++)
  733.                         {
  734.                                 WriteData(table13[i]);        
  735.                         }
  736.                         show();
  737.                         if(mm!=0x10||dd!=0x01)
  738.                         break;                        
  739.                 }               
  740.         }           */
  741. }
  742. void show()
  743. {
  744. //        uchar i;
  745.         uchar TL;     //儲存暫存器的溫度低位
  746.         uchar TH;    //儲存暫存器的溫度高位
  747.         uchar TN;      //儲存溫度的整數部分
  748.         uchar TD;       //儲存溫度的小數部分
  749.                
  750.                
  751.                
  752.                 t_day=read_1302(0x87);//讀日;
  753.                 day1=t_day&0x0f;
  754.                 day2=(t_day>>4);
  755.         
  756.                 t_mon=read_1302(0x89);//讀月 ;
  757.                 mon1=t_mon&0x0f;
  758.                 mon2=(t_mon>>4);
  759.         
  760.                 week=read_1302(0x8b);//讀星期 ;
  761.                 week1=week&0x0f;
  762.         
  763.                 t_year=read_1302(0x8d);//讀年 ;
  764.                 year1=t_year&0x0f;
  765.                 year2=(t_year>>4);
  766.                 t_sec=read_1302(0x81);//讀秒 ;
  767.                 sec1=t_sec&0x0f;
  768.                 sec2=(t_sec>>4);
  769.         
  770.                 t_min=read_1302(0x83);//讀分 ;
  771.                 min1=t_min&0x0f;
  772.                 min2=(t_min>>4);
  773.         
  774.                 t_hour=read_1302(0x85);//讀小時 ;
  775.                 hour1=t_hour&0x0f;
  776.                 hour2=(t_hour>>4);

  777. //                WriteAddress(0x80+0x40+0x08); //顯示小時
  778. //                WriteData(table1[hour2]);                 
  779. //                WriteAddress(0x80+0x40+0x09);
  780. //                WriteData(table1[hour1]);
  781.         
  782.                 t_day=read_1302(0x87);//讀日;
  783.                 day1=t_day&0x0f;
  784.                 day2=(t_day>>4);
  785.         
  786.                 t_mon=read_1302(0x89);//讀月 ;
  787.                 mon1=t_mon&0x0f;
  788.                 mon2=(t_mon>>4);
  789.         
  790.                 week=read_1302(0x8b);//讀星期 ;
  791.                 week1=week&0x0f;
  792.         
  793.                 t_year=read_1302(0x8d);//讀年 ;
  794.                 year1=t_year&0x0f;
  795.                 year2=(t_year>>4);

  796.                
  797.                         
  798.             display_dot();       //顯示溫度的小數點
  799.             display_cent();      //顯示溫度的單位
  800.         
  801.                 WriteAddress(0x80+0x40+0x08); //顯示小時
  802.                 WriteData(table1[hour2]);                 
  803.                 WriteAddress(0x80+0x40+0x09);
  804.                 WriteData(table1[hour1]);               
  805.         
  806.                 WriteAddress(0x80+0x40+0x0a);  //顯示':'
  807.                 WriteData(':');                                 
  808.         
  809.                 WriteAddress(0x80+0x40+0x0b);  //顯示分鐘
  810.                 WriteData(table1[min2]);                          
  811.                 WriteAddress(0x80+0x40+0x0c);
  812.                 WriteData(table1[min1]);                 
  813.         
  814.                 WriteAddress(0x80+0x40+0x0d); //顯示':'
  815.                 WriteData(':');                                
  816.         
  817.                 WriteAddress(0x80+0x40+0x0e); //顯示秒
  818.                 WriteData(table1[sec2]);                        
  819.                 WriteAddress(0x80+0x40+0x0f);
  820.                 WriteData(table1[sec1]);
  821.                 /*第二行在此顯示完畢*/
  822.                 ReadyReadTemp();     //讀溫度準備
  823.             TL=ReadOneChar();    //先讀的是溫度值低位
  824.                 TH=ReadOneChar();    //接著讀的是溫度值高位
  825.                 TN=TH*16+TL/16;      //實際溫度值=(TH*256+TL)/16,即:TH*16+TL/16
  826.                                           //這樣得出的是溫度的整數部分,小數部分被丟棄了
  827.             TD=(TL%16)*10/16;    //計算溫度的小數部分,將余數乘以10再除以16取整,
  828.                                           //這樣得到的是溫度小數部分的第一位數字(保留1位小數)
  829.             display_temp1(TN);    //顯示溫度的整數部分
  830.             display_temp2(TD);    //顯示溫度的小數部分
  831.                 //以下部分是鬧鐘鍵盤檢測程序
  832.                 if((x==hour2*10+hour1)&&(y==min2*10+min1))//若時間到了,則開啟鬧鐘
  833.                 {
  834.                         beep=0;        
  835.                 }
  836.                 else                 //否則,關閉鬧鐘
  837.                 {
  838.                         beep=1;
  839.                 }        
  840.             delaynms(10);                                
  841. }
復制代碼


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

使用道具 舉報

沙發
ID:109352 發表于 2016-3-19 15:48 | 只看該作者
液晶顯示器有顯示時間、但是時間不正確、求學霸幫忙看看程序、哪有問題
回復

使用道具 舉報

板凳
ID:1 發表于 2016-3-19 16:35 來自手機 | 只看該作者
你這個程序目前有什么問題呢
回復

使用道具 舉報

地板
ID:109352 發表于 2016-3-19 16:48 | 只看該作者
admin 發表于 2016-3-19 16:35
你這個程序目前有什么問題呢

就是仿真圖的顯示器顯示的時間不對,不是現在的時間。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩在线一区二区 | 精品日本中文字幕 | 激情五月婷婷综合 | 亚洲一二三区在线观看 | 91在线精品秘密一区二区 | 国产精品久久久久aaaa九色 | 成人在线观看免费视频 | 精品久久香蕉国产线看观看亚洲 | 亚州精品天堂中文字幕 | 久草中文在线 | 亚洲成人午夜在线 | 欧美99| 美女黄网 | 日韩精品免费在线观看 | 国产欧美一区二区三区国产幕精品 | heyzo在线| 亚洲人成人网 | 久久精品国产99国产 | 国产清纯白嫩初高生视频在线观看 | 天堂资源 | 欧美日韩精品在线一区 | 免费的色网站 | 亚洲国产精品久久久 | 中文字幕在线第一页 | av黄在线观看 | 91视频.com| 美女国内精品自产拍在线播放 | 91精品国产91久久久久久最新 | 成人av电影天堂 | 精品久久精品 | 91九色视频 | 日韩成人一区 | 日韩aⅴ片| 欧美一级久久 | 国产精品99久久久久 | 1000部精品久久久久久久久 | 国产 欧美 日韩 一区 | 中文字幕1区 | 国产综合久久 | 欧美综合久久久 | 九九免费在线视频 |