欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 帶有鬧鐘的電子時鐘 [打印本頁]

作者: xzf586    時間: 2016-9-6 22:11
標題: 帶有鬧鐘的電子時鐘
帶有鬧鐘的電子時鐘


2 用DS1302 LCD1602帶有鬧鐘的電子時鐘.rar (34.7 KB, 下載次數: 41)

  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. uchar a,miao,shi,fen,ri,yue,nian,week,key1n,temp;
  6. uchar shi1,fen1=5,shi2,fen2=2,shi3,fen3=4;
  7. uint flag;
  8. uint flag1;
  9. uint flag2;
  10. uint qqq;
  11. #define yh 0x80 //LCD第一行的初始位置,因為LCD1602字符地址首位D7恒定為1(100000000=80)
  12. #define er 0x80+0x40 //LCD第二行初始位置(因為第二行第一個字符位置地址是0x40)
  13. //液晶屏的與C51之間的引腳連接定義(顯示數據線接C51的P0口)
  14. sbit rs=P2^4; //寄存器選擇
  15. sbit en=P2^2; //下降沿使能
  16. sbit rw=P2^3; //讀寫信號線
  17. //DS1302時鐘芯片與C51之間的引腳連接定義
  18. sbit Key_Input=P1^0;
  19. sbit LEDCLK=P3^4;
  20. sbit LEDDIN=P2^3;
  21. sbit IO=P2^0;//數據線
  22. sbit SCLK=P2^7;
  23. sbit RST=P2^4;
  24. sbit ACC0=ACC^0;
  25. sbit ACC7=ACC^7;
  26. uchar keytemp=0;
  27. uchar keyval=0;
  28. uchar keyback;
  29. int t;
  30. bit keyup;
  31. //ACC累加器=A
  32. //ACC.0=E0H
  33. //校時按鍵與C51的引腳連接定義
  34. sbit buzzer=P1^2;//蜂鳴器,端口低電平響
  35. uchar code tab1[]={"20  -  -   "}; //年顯示的固定字符
  36. uchar code tab2[]={"  :  :  "};//時間顯示的固定字符      
  37. //延時函數,后面經常調用
  38. void delay(uint xms)//延時函數,有參函數
  39. {
  40. uint x,y;
  41. for(x=xms;x>0;x--)
  42.   for(y=120;y>0;y--);
  43. }
  44. void write_1602com(uchar com)//****液晶寫入指令函數****
  45. {
  46. rs=0;//數據/指令選擇置為指令
  47. rw=0; //讀寫選擇置為寫
  48. P0=com;//送入數據
  49. delay(1);
  50. en=1;//拉高使能端,為制造有效的下降沿做準備
  51. delay(1);
  52. en=0;//en由高變低,產生下降沿,液晶執行命令
  53. }
  54. void write_1602dat(uchar dat)//***液晶寫入數據函數****
  55. {
  56. rs=1;//數據/指令選擇置為數據
  57. rw=0; //讀寫選擇置為寫
  58. P0=dat;//送入數據
  59. delay(1);
  60. en=1; //en置高電平,為制造下降沿做準備
  61. delay(1);
  62. en=0; //en由高變低,產生下降沿,液晶執行命令
  63. }

  64. void lcd_init()//***液晶初始化函數****
  65. {
  66. write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據
  67. write_1602com(0x0c);//開顯示不顯示光標
  68. write_1602com(0x06);//整屏不移動,光標自動右移
  69. write_1602com(0x01);//清顯示
  70. write_1602com(yh+1);//日歷顯示固定符號從第一行第1個位置之后開始顯示
  71. for(a=0;a<14;a++)
  72. {
  73. write_1602dat(tab1[a]);//向液晶屏寫日歷顯示的固定符號部分
  74. //delay(3);
  75. }
  76. write_1602com(er+2);//時間顯示固定符號寫入位置,從第2個位置后開始顯示
  77. for(a=0;a<8;a++)
  78. {
  79. write_1602dat(tab2[a]);//寫顯示時間固定符號,兩個冒號
  80. //delay(3);
  81. }
  82. }
  83. void write_byte(uchar dat)//寫一個字節
  84. {
  85. ACC=dat;
  86. RST=1;
  87. for(a=8;a>0;a--)
  88. {
  89.   IO=ACC0;
  90.   SCLK=0; //產生上升沿寫入數據,從低位寫入
  91.   SCLK=1;
  92.   ACC=ACC>>1;
  93. }
  94. }
  95. uchar read_byte()//讀一個字節
  96. {
  97. RST=1;
  98. for(a=8;a>0;a--)
  99. {
  100.   ACC7=IO;
  101.   SCLK=1; //產生下降沿輸出數據,先輸出低位,保存到ACC中
  102.   SCLK=0;
  103.   ACC=ACC>>1;
  104. }
  105. return (ACC);
  106. }
  107. void write_1302(uchar add,uchar dat)//向1302芯片寫函數,指定寫入地址,數據
  108. {
  109. RST=0;
  110. SCLK=0;
  111. RST=1;
  112. write_byte(add);
  113. write_byte(dat);
  114. SCLK=1;
  115. RST=0;
  116. }
  117. uchar read_1302(uchar add)//從1302讀數據函數,指定讀取數據來源地址
  118. {
  119. uchar temp;
  120. RST=0;
  121. SCLK=0;
  122. RST=1;
  123. write_byte(add);
  124. temp=read_byte();
  125. SCLK=1;
  126. RST=0;
  127. return(temp);
  128. }
  129. uchar BCD_Decimal(uchar bcd)//BCD碼轉十進制函數,輸入BCD,返回十進制
  130. {
  131. uchar Decimal;
  132. Decimal=bcd>>4;
  133. return(Decimal=Decimal*10+(bcd&=0x0F));
  134. }

  135. void ds1302_init1() //1302芯片初始化子函數(2012-06-18,12:00:00,week7)
  136. {
  137. RST=0;
  138. SCLK=0;
  139. write_1302(0x8e,0x00); //允許寫,禁止寫保護
  140. write_1302(0xc0,0x04); //設置三個鬧鐘初值
  141. write_1302(0xc2,0x06);
  142. write_1302(0xc4,0x04);
  143. write_1302(0xc6,0x03);
  144. write_1302(0xc8,0x02);
  145. write_1302(0xca,0x08);
  146. write_1302(0x8e,0x80); //打開寫保護
  147. fen1= BCD_Decimal(read_1302(0xc1));
  148. shi1 = BCD_Decimal(read_1302(0xc3));
  149. fen2 = BCD_Decimal(read_1302(0xc5));
  150. shi2 = BCD_Decimal(read_1302(0xc7));
  151. fen3= BCD_Decimal(read_1302(0xc9));
  152. shi3=BCD_Decimal(read_1302(0xcb));
  153. }
  154. void ds1302_init() //1302芯片初始化子函數(2019-09-06,21:54:58,week2)
  155. {
  156. RST=0;
  157. SCLK=0;
  158. write_1302(0x8e,0x00); //允許寫,禁止寫保護
  159. write_1302(0x80,0x58); //向DS1302內寫秒寄存器80H寫入初始秒數據58
  160. write_1302(0x82,0x54);//向DS1302內寫分寄存器82H寫入初始分數據54
  161. write_1302(0x84,0x21);//向DS1302內寫小時寄存器84H寫入初始小時數據21
  162. write_1302(0x8a,0x02);//向DS1302內寫周寄存器8aH寫入初始周數據2
  163. write_1302(0x86,0x06);//向DS1302內寫日期寄存器86H寫入初始日期數據06
  164. write_1302(0x88,0x09);//向DS1302內寫月份寄存器88H寫入初始月份數據09
  165. write_1302(0x8c,0x16);//向DS1302內寫年份寄存器8cH寫入初始年份數據16
  166. write_1302(0x8e,0x80); //打開寫保護
  167. }
  168. //時分秒顯示子函數
  169. void write_sfm(uchar add,uchar dat)//向LCD寫時分秒,有顯示位置加、現示數據,兩個參數
  170. {
  171. uchar gw,sw;
  172. gw=dat%10;//取得個位數字
  173. sw=dat/10;//取得十位數字
  174. write_1602com(er+add);//er是頭文件規定的值0x80+0x40
  175. write_1602dat(0x30+sw);//數字+30得到該數字的LCD1602顯示碼
  176. write_1602dat(0x30+gw);//數字+30得到該數字的LCD1602顯示碼  
  177. }
  178. //年月日顯示子函數
  179. void write_nyr(uchar add,uchar dat)//向LCD寫年月日,有顯示位置加數、顯示數據,兩個參數
  180. {
  181. uchar gw,sw;
  182. gw=dat%10;//取得個位數字
  183. sw=dat/10;//取得十位數字
  184. write_1602com(yh+add);//設定顯示位置為第一個位置+add
  185. write_1602dat(0x30+sw);//數字+30得到該數字的LCD1602顯示碼
  186. write_1602dat(0x30+gw);//數字+30得到該數字的LCD1602顯示碼
  187. }
  188. void write_week(uchar week)//寫星期函數
  189. {
  190. write_1602com(yh+0x0c);//星期字符的顯示位置
  191. switch(week)
  192. {
  193.   case 1:write_1602dat('M');//星期數為1時,顯示
  194.       write_1602dat('O');
  195.       write_1602dat('N');
  196.       break;
  197.   case 2:write_1602dat('T');//星期數據為2時顯示
  198.       write_1602dat('U');
  199.       write_1602dat('E');
  200.       break;
  201.   case 3:write_1602dat('W');//星期數據為3時顯示
  202.       write_1602dat('E');
  203.       write_1602dat('D');
  204.       break;
  205.   case 4:write_1602dat('T');//星期數據為4是顯示
  206.       write_1602dat('H');
  207.       write_1602dat('U');
  208.       break;
  209.   case 5:write_1602dat('F');//星期數據為5時顯示
  210.       write_1602dat('R');
  211.       write_1602dat('I');
  212.       break;
  213.   case 6:write_1602dat('S');//星期數據為6時顯示
  214.       write_1602dat('T');
  215.       write_1602dat('A');
  216.       break;
  217.   case 7:write_1602dat('S');//星期數據為7時顯示
  218.       write_1602dat('U');
  219.       write_1602dat('N');
  220.       break;
  221. }
  222. }
  223. void Read_Key()                                                 //**鍵值讀取函數**//
  224. {
  225.         keytemp<<=1;
  226.         if(Key_Input==1)
  227.         {
  228.                 keytemp++;
  229.         }
  230. }
  231. void  keyscan()                            //鍵值確認函數
  232. {  
  233.         if(keytemp==0xff)
  234.         {   keyup=1;                                //按鍵已經放開
  235.                 keyback=0;                         //清除按鍵備份值
  236.                 keyval=0;                                       //清除按鍵存放單元         
  237.         }                                                           
  238.         else if(keytemp==keyback&&keyup==1)    //兩次的檢測的值一樣且按鍵已經放開
  239.         {        t=1;
  240.                 keyval=keytemp;                           //存放按鍵值
  241.                 keyup=0;                            //按下按鍵
  242.                 keyback=0;                         //清除按鍵備份值
  243.         }                                               
  244.         else
  245.         {         keyback=keytemp;
  246.          }

  247. }
  248.   void Key_job1()                   //鬧鐘按鍵功能函數
  249.   {

  250.    switch(keyval)
  251.    {case 0x7f:
  252.    if(t)
  253.    {t=0;
  254.    key1n++;
  255.    if(key1n==8)
  256.    key1n=1;
  257.    switch(key1n)
  258.    {
  259.    case 1:
  260.         write_1602com(er+0x06);
  261.          write_1602com(0x0F);qqq=1;break;
  262.         case 2:        write_1602com(er+0x03);        break;
  263.         case 3: write_1602com(yh+0x0e);        break;
  264.         case 4:        write_1602com(yh+0x0b);        break;
  265.         case 5: write_1602com(yh+0x06);        break;
  266.         case 6:         write_1602com(yh+0x03);break;
  267.         case 7:         qqq=0;write_1602com(0x0c); break;
  268.         }}
  269.         case 0xbf:
  270.        
  271.          if(t)
  272.         {t=0;
  273.          
  274.          switch(key1n)  //鬧鐘調整函數
  275.          {case 1:fen1++;
  276.          if(fen1==60)
  277.          fen1=0;
  278.         write_sfm(5,fen1);
  279.    
  280.           temp=(fen1)/10*16+(fen1)%10;//十進制轉換成DS1302要求的DCB碼
  281.       write_1302(0x8e,0x00);//允許寫,禁止寫保護
  282.       write_1302(0xc0,temp);//向DS1302內ram寄存器c0H寫入調整后的分數據BCD碼
  283.       write_1302(0x8e,0x80);//打開寫保護  
  284.          write_1602com(er+0x06);break;
  285.          case 2:shi1++;
  286.          if(shi1==24)
  287.          shi1=0;
  288.           write_sfm(2,shi1);//
  289.          temp=(shi1)/10*16+(shi1)%10;//十進制轉換成DS1302要求的DCB碼
  290.      write_1302(0x8e,0x00);//允許寫,禁止寫保護
  291.       write_1302(0xc2,temp);//向DS1302內ram寄存器c2H寫入調整后的分數據BCD碼
  292.       write_1302(0x8e,0x80);//打開寫保護
  293.          write_1602com(er+0x03);
  294.          break;
  295.          case 3:fen2++;
  296.          if(fen2==60)
  297.          fen2=0;
  298.           write_nyr(13,fen2);
  299.          temp=(fen2)/10*16+(fen2)%10;//十進制轉換成DS1302要求的DCB碼
  300.      write_1302(0x8e,0x00);//允許寫,禁止寫保護
  301.       write_1302(0xc4,temp);//向DS1302內ram寄存器c4H寫入調整后的分數據BCD碼
  302.       write_1302(0x8e,0x80);//打開寫保護
  303.          write_1602com(yh+0x14);
  304.          break;
  305.          case 4:shi2++;
  306.          if(shi2==24)
  307.          shi2=0;
  308.            write_nyr(10,shi2);
  309.           temp=(shi2)/10*16+(shi2)%10;//十進制轉換成DS1302要求的DCB碼
  310.      write_1302(0x8e,0x00);//允許寫,禁止寫保護
  311.       write_1302(0xc6,temp);//向DS1302內ram寄存器c6H寫入調整后的分數據BCD碼
  312.       write_1302(0x8e,0x80);//打開寫保護
  313.          write_1602com(yh+0x11);
  314.          break;
  315.          case 5:fen3++;
  316.          if(fen3==60)
  317.          fen3=0;
  318.            write_nyr(5,fen3);//第三個鬧鐘分鐘從第一行第5個字符后開始顯示
  319.           temp=(fen3)/10*16+(fen3)%10;//十進制轉換成DS1302要求的DCB碼
  320.      write_1302(0x8e,0x00);//允許寫,禁止寫保護
  321.       write_1302(0xc8,temp);//向DS1302內ram寄存器c8H寫入調整后的分數據BCD碼
  322.       write_1302(0x8e,0x80);//打開寫保護
  323.          write_1602com(yh+0x06);
  324.          break;
  325.          case 6:
  326.          shi3++;
  327.          if(shi3==24)
  328.          shi3=0;
  329.            write_nyr(2,shi3);//第三個鬧鐘小時從第一行第2個字符后開始顯示
  330.           temp=(shi3)/10*16+(shi3)%10;//十進制轉換成DS1302要求的DCB碼
  331.      write_1302(0x8e,0x00);//允許寫,禁止寫保護
  332.       write_1302(0xca,temp);//向DS1302內ram寄存器caH寫入調整后的分數據BCD碼
  333.       write_1302(0x8e,0x80);//打開寫保護
  334.          write_1602com(yh+0x03);
  335.          break;
  336.          }}       
  337.         case 0xfb:
  338.    {if(t)
  339.         {t=0;
  340.          switch(key1n)
  341.          {
  342.          case 1:fen1--;
  343.          if(fen1==-1)
  344.          fen1=59;
  345.          write_sfm(5,fen1);
  346.          temp=(fen1)/10*16+(fen1)%10;//十進制轉換成DS1302要求的DCB碼
  347.       write_1302(0x8e,0x00);//允許寫,禁止寫保護
  348.       write_1302(0xc0,temp);//向DS1302內ram寄存器c0H寫入調整后的分數據BCD碼
  349.       write_1302(0x8e,0x80);//打開寫保護
  350.          write_1602com(er+0x06);
  351.          break;
  352.          case 2:shi1--;
  353.          if(shi1==-1)
  354.          shi1=23;
  355.           write_sfm(2,shi1);
  356.           temp=(shi1)/10*16+(shi1)%10;//十進制轉換成DS1302要求的DCB碼
  357.       write_1302(0x8e,0x00);//允許寫,禁止寫保護
  358.       write_1302(0xc2,temp);//向DS1302內ram寄存器c2H寫入調整后的分數據BCD碼
  359.       write_1302(0x8e,0x80);//打開寫保護
  360.          write_1602com(er+0x03);
  361.          break;
  362.          case 3:fen2--;
  363.          if(fen2==-1)
  364.          fen2=59;
  365.          write_nyr(13,fen2);
  366.          temp=(fen2)/10*16+(fen2)%10;//十進制轉換成DS1302要求的DCB碼
  367.      write_1302(0x8e,0x00);//允許寫,禁止寫保護
  368.       write_1302(0xc4,temp);//向DS1302ram分寄存器c4H寫入調整后的分數據BCD碼
  369.       write_1302(0x8e,0x80);//打開寫保護
  370.          write_1602com(yh+0x14);
  371.          break;
  372.          case 4:shi2--;
  373.          if(shi2==-1)
  374.          shi2=23;
  375.            write_nyr(10,shi2);
  376.           temp=(shi2)/10*16+(shi2)%10;//十進制轉換成DS1302要求的DCB碼
  377.       write_1302(0x8e,0x00);//允許寫,禁止寫保護
  378.       write_1302(0xc6,temp);//向DS1302內ram寄存器c6H寫入調整后的分數據BCD碼
  379.       write_1302(0x8e,0x80);//打開寫保護
  380.          write_1602com(yh+0x11);
  381.          break;
  382.          case 5:fen3--;
  383.          if(fen3==-1)
  384.          fen3=59;
  385.           write_nyr(5,fen3);
  386.          temp=(fen3)/10*16+(fen3)%10;//十進制轉換成DS1302要求的DCB碼
  387.       write_1302(0x8e,0x00);//允許寫,禁止寫保護
  388.       write_1302(0xc8,temp);//向DS1302內ram寄存器c8H寫入調整后的分數據BCD碼
  389.       write_1302(0x8e,0x80);//打開寫保護
  390.          write_1602com(yh+0x06);
  391.          break;
  392.          case 6:shi3--;
  393.          if(shi3==-1)
  394.          shi3=23;
  395.           write_nyr(2,shi3);
  396.          temp=(shi3)/10*16+(shi3)%10;//十進制轉換成DS1302要求的DCB碼
  397.       write_1302(0x8e,0x00);//允許寫,禁止寫保護
  398.       write_1302(0xca,temp);//向DS1302內ram寄存器caH寫入調整后的分數據BCD碼
  399.       write_1302(0x8e,0x80);//打開寫保護
  400.          write_1602com(yh+0x03);
  401.          break;
  402.          }}}
  403.          case 0xef:if(t){t=0;flag=~flag; write_1602com(0x01);
  404. break;}
  405.      case 0xf7:if(t){t=0;flag2=~flag2;}
  406.          }}
  407.   void Key_job()                                          //**鍵值工作程序**//
  408. {
  409. switch(keyval)
  410. {
  411. case 0x7f:
  412. {
  413.   if(t)
  414. {t=0;
  415. key1n++;
  416. if(key1n==9)
  417.   key1n=1;//設置按鍵共有秒、分、時、星期、日、月、年、返回,8個功能循環
  418.   switch(key1n)
  419. {
  420. case 1: qqq=1;     //關顯示
  421.    write_1602com(er+0x09);//設置按鍵按動一次,秒位置顯示光標
  422.       write_1602com(0x0f);//設置光標為閃爍
  423.           /*temp=(miao)/10*16+(miao)%10;//秒數據寫入DS1302
  424.       write_1302(0x8e,0x00);
  425.        write_1302(0x80,temp);//miao
  426.          // write_1302(0x80,0x80|temp);//miao
  427.         write_1302(0x8e,0x80); */
  428.       break;
  429. case 2:  write_1602com(er+6);//按2次fen位置顯示光標
  430.        //write_1602com(0x0f);
  431.    break;
  432. case 3: write_1602com(er+3);//按動3次,shi
  433.        //write_1602com(0x0f);
  434.    break;
  435. case 4: write_1602com(yh+0x0e);//按動4次,week
  436.        //write_1602com(0x0f);
  437.    break;
  438. case 5: write_1602com(yh+0x0a);//按動5次,ri
  439.        //write_1602com(0x0f);
  440.    break;
  441. case 6: write_1602com(yh+0x07);//按動6次,yue
  442.        //write_1602com(0x0f);
  443.    break;
  444. case 7: write_1602com(yh+0x04);//按動7次,nian
  445.        //write_1602com(0x0f);
  446.    break;
  447. case 8:
  448.    write_1602com(0x0c);//按動到第8次,設置光標不閃爍
  449.   qqq=0;      //開顯示     
  450.             break;               
  451. }
  452. }
  453. }
  454. case 0xbf:
  455. { if(t)
  456. {t=0;
  457. switch(key1n)
  458. {
  459. case 1:
  460.    miao++;
  461.   //設置鍵按動1次,調秒
  462.    if(miao==60)
  463.     miao=0;//秒超過59,再加1,就歸零
  464.    write_sfm(0x08,miao);//令LCD在正確位置顯示"加"設定好的秒數
  465.    temp=(miao)/10*16+(miao)%10;//十進制轉換成DS1302要求的BCD碼
  466.       write_1302(0x8e,0x00); //允許寫,禁止寫保?
  467.                   write_1302(0x80,temp); //向DS1302內寫秒寄存器80H寫入調整后的秒數據BCD碼
  468.       write_1302(0x8e,0x80); //打開寫保護
  469.    write_1602com(er+0x09);//因為設置液晶的模式是寫入數據后,光標自動右移,所以要指定返回
  470.    break;
  471. case 2:fen++;TR1=1;
  472.    if(fen==60)
  473.     fen=0;
  474.    write_sfm(0x05,fen);//令LCD在正確位置顯示"加"設定好的分數據
  475.    temp=(fen)/10*16+(fen)%10;//十進制轉換成DS1302要求的DCB碼
  476.       write_1302(0x8e,0x00);//允許寫,禁止寫保護
  477.       write_1302(0x82,temp);//向DS1302內寫分寄存器82H寫入調整后的分數據BCD碼
  478.       write_1302(0x8e,0x80);//打開寫保護
  479.    write_1602com(er+6);//因為設置液晶的模式是寫入數據后,指針自動加一,在這里是寫回原來的位置
  480.    break;
  481.    case 3:shi++;
  482.    if(shi==24)
  483.     shi=0;
  484.    write_sfm(2,shi);//令LCD在正確的位置顯示"加"設定好的小時數據
  485.    temp=(shi)/10*16+(shi)%10;//十進制轉換成DS1302要求的DCB碼
  486.       write_1302(0x8e,0x00);//允許寫,禁止寫保護
  487.       write_1302(0x84,temp);//向DS1302內寫小時寄存器84H寫入調整后的小時數據BCD碼
  488.       write_1302(0x8e,0x80);//打開寫保護
  489.    write_1602com(er+3);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
  490.    break;
  491. case 4:week++;
  492.    if(week==8)
  493.     week=1;
  494.             write_1602com(yh+0x0C);//指定'加'后的周數據顯示位置
  495.     write_week(week);//指定周數據顯示內容
  496.             temp=(week)/10*16+(week)%10;//十進制轉換成DS1302要求的DCB碼
  497.       write_1302(0x8e,0x00);//允許寫,禁止寫保護
  498.       write_1302(0x8a,temp);//向DS1302內寫周寄存器8aH寫入調整后的周數據BCD碼
  499.       write_1302(0x8e,0x80);//打開寫保護
  500.    write_1602com(yh+0x0e);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
  501.    break;
  502. case 5:ri++;
  503.    if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12) //閏年、月份控制
  504.    {if(ri==32)
  505.     ri=1;}
  506.    if(yue==4||yue==6||yue==9||yue==11)
  507.          {if(ri==31)
  508.           ri=1;}
  509.    if(nian%4!=0&&nian%100!=0||nian%400!=0&&yue==2)
  510.            {if(ri==30)
  511.            ri=1;}
  512.         if(nian%4==0&&nian%100==0||nian%400==0&&yue==2)  
  513.            {if(ri==29)
  514.            ri=1; }
  515.    write_nyr(9,ri);//令LCD在正確的位置顯示"加"設定好的日期數據
  516.    temp=(ri)/10*16+(ri)%10;//十進制轉換成DS1302要求的DCB碼
  517.       write_1302(0x8e,0x00);//允許寫,禁止寫保護
  518.       write_1302(0x86,temp);//向DS1302內寫日期寄存器86H寫入調整后的日期數據BCD碼
  519.       write_1302(0x8e,0x80);//打開寫保護
  520.    write_1602com(yh+10);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
  521.    break;
  522. case 6:yue++;
  523.    if(yue==13)
  524.     yue=1;
  525.    write_nyr(6,yue);//令LCD在正確的位置顯示"加"設定好的月份數據
  526.    temp=(yue)/10*16+(yue)%10;//十進制轉換成DS1302要求的DCB碼
  527.       write_1302(0x8e,0x00);//允許寫,禁止寫保護
  528.       write_1302(0x88,temp);//向DS1302內寫月份寄存器88H寫入調整后的月份數據BCD碼
  529.       write_1302(0x8e,0x80);//打開寫保護
  530.    write_1602com(yh+7);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
  531.    break;
  532. case 7:nian++;
  533.    if(nian==100)
  534.    nian=0;
  535.    write_nyr(3,nian);//令LCD在正確的位置顯示"加"設定好的年份數據
  536.             temp=(nian)/10*16+(nian)%10;//十進制轉換成DS1302要求的DCB碼
  537.       write_1302(0x8e,0x00);//允許寫,禁止寫保護
  538.       write_1302(0x8c,temp);//向DS1302內寫年份寄存器8cH寫入調整后的年份數據BCD碼
  539.       write_1302(0x8e,0x80);//打開寫保護
  540.    write_1602com(yh+4);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
  541.    break;
  542. }
  543. }
  544. }
  545. case 0xfb:
  546. { if(t)
  547. {t=0;
  548. switch(key1n)
  549. {
  550.   case 1:miao--;
  551.     if(miao==-1)
  552.      miao=59;//秒數據減到-1時自動變成59
  553.    write_sfm(0x08,miao);//在LCD的正確位置顯示改變后新的秒數
  554.             temp=(miao)/10*16+(miao)%10;//十進制轉換成DS1302要求的DCB碼
  555.       write_1302(0x8e,0x00); //允許寫,禁止寫保護
  556.       write_1302(0x80,temp); //向DS1302內寫秒寄存器80H寫入調整后的秒數據BCD碼
  557.       write_1302(0x8e,0x80); //打開寫保護
  558.    write_1602com(er+0x09);//因為設置液晶的模式是寫入數據后,指針自動加一,在這里是寫回原來的位置
  559.    //write_1602com(0x0b);
  560.    break;
  561.   case 2:fen--;
  562.     if(fen==-1)
  563.      fen=59;
  564.    write_sfm(5,fen);
  565.    temp=(fen)/10*16+(fen)%10;//十進制轉換成DS1302要求的DCB碼
  566.       write_1302(0x8e,0x00);//允許寫,禁止寫保護
  567.       write_1302(0x82,temp);//向DS1302內寫分寄存器82H寫入調整后的分數據BCD碼
  568.       write_1302(0x8e,0x80);//打開寫保護
  569.    write_1602com(er+6);//因為設置液晶的模式是寫入數據后,指針自動加一,在這里是寫回原來的位置
  570.    break;
  571.   case 3:shi--;
  572.       if(shi==-1)
  573.      shi=23;
  574.    write_sfm(2,shi);
  575.    temp=(shi)/10*16+(shi)%10;//十進制轉換成DS1302要求的DCB碼
  576.       write_1302(0x8e,0x00);//允許寫,禁止寫保護
  577.       write_1302(0x84,temp);//向DS1302內寫小時寄存器84H寫入調整后的小時數據BCD碼
  578.       write_1302(0x8e,0x80);//打開寫保護
  579.    write_1602com(er+3);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
  580.    break;
  581.   case 4:week--;
  582.     if(week==0)
  583.      week=7;  
  584.            write_1602com(yh+0x0C);//指定'加'后的周數據顯示位置
  585.     write_week(week);//指定周數據顯示內容
  586.       temp=(week)/10*16+(week)%10;//十進制轉換成DS1302要求的DCB碼
  587.       write_1302(0x8e,0x00);//允許寫,禁止寫保護
  588.       write_1302(0x8a,temp);//向DS1302內寫周寄存器8aH寫入調整后的周數據BCD碼
  589.       write_1302(0x8e,0x80);//打開寫保護
  590.       write_1602com(yh+0x0e);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
  591.    break;
  592.   case 5:ri--;
  593.     if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)//日調整控制
  594.    {if(ri==0)
  595.     ri=31;}
  596.    if(yue==4||yue==6||yue==9||yue==11)
  597.          {if(ri==0)
  598.           ri=30;}
  599.    if(nian%4!=0&&nian%100!=0||nian%400!=0&&yue==2)
  600.            {if(ri==0)
  601.            ri=29;}
  602.         if(nian%4==0&&nian%100==0||nian%400==0&&yue==2)  
  603.            {if(ri==0)
  604.            ri=28; }
  605.    write_nyr(9,ri);
  606.    temp=(ri)/10*16+(ri)%10;//十進制轉換成DS1302要求的DCB碼
  607.       write_1302(0x8e,0x00);//允許寫,禁止寫保護
  608.       write_1302(0x86,temp);//向DS1302內寫日期寄存器86H寫入調整后的日期數據BCD碼
  609.       write_1302(0x8e,0x80);//打開寫保護
  610.    write_1602com(yh+10);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
  611.    break;
  612.   case 6:yue--;
  613.     if(yue==0)
  614.      yue=12;
  615.    write_nyr(6,yue);
  616.    temp=(yue)/10*16+(yue)%10;//十進制轉換成DS1302要求的DCB碼
  617.       write_1302(0x8e,0x00);//允許寫,禁止寫保護
  618.       write_1302(0x88,temp);//向DS1302內寫月份寄存器88H寫入調整后的月份數據BCD碼
  619.       write_1302(0x8e,0x80);//打開寫保護
  620.    write_1602com(yh+7);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
  621.    break;
  622.   case 7:nian--;
  623.    if(nian==-1)
  624.    nian=99;
  625.    write_nyr(3,nian);
  626.       temp=(nian)/10*16+(nian)%10;//十進制轉換成DS1302要求的DCB碼
  627.       write_1302(0x8e,0x00);//允許寫,禁止寫保護
  628.       write_1302(0x8c,temp);//向DS1302內寫年份寄存器8cH寫入調整后的年份數據BCD碼
  629.       write_1302(0x8e,0x80);//打開寫保護
  630.    write_1602com(yh+4);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
  631.    break;   
  632. }
  633. }
  634. }
  635. case 0xef:if(t){t=0;flag=~flag; write_1602com(0x01); //切換標志位
  636. break;}
  637.   case 0xf7:if(t){t=0;flag2=~flag2;}
  638. }
  639. }
  640. void init() //定時器1、計數器設置函數
  641. {
  642. TMOD=0x10;                //設置定時器1工作在方式1       
  643.         ET1=1;         //允許T1溢出中斷
  644.         EA=1;         //開啟CPU總中斷
  645.         TH1=(65536-1000)/256;          //設置定時器初值
  646.         TL1=(65536-1000)%256;
  647.         TR1=1;        //開啟T1計數
  648. }
  649. void bell()    //鬧鈴函數
  650. {
  651.           if((fen1==fen&&shi1==shi)||(fen2==fen&&shi2==shi)||(fen3==fen&&shi3==shi))
  652.   {
  653.    buzzer=0;//蜂鳴器長響一次
  654.         if(flag2)
  655.         {
  656.         buzzer=~buzzer;
  657.         }
  658.         }
  659.         }
  660. void display1()                   //鬧鐘顯示函數
  661. {
  662.   write_1602com(yh);
  663.    write_1602dat('3');
  664.    write_1602com(0x01+yh);
  665.    write_1602dat('t');
  666.     write_1602com(0x08+yh);
  667.    write_1602dat('2');
  668.    write_1602com(0x09+yh);
  669.    write_1602dat('t');
  670.          write_1602com(er);
  671.    write_1602dat('1');
  672.    write_1602com(0x01+er);
  673.    write_1602dat('t');
  674.          write_1602com(0x04+er);
  675.    write_1602dat(':');
  676.          write_1602com(0x04+yh);
  677.    write_1602dat(':');
  678.    write_1602com(0x0c+yh);
  679.    write_1602dat(':');
  680.     write_sfm(5,fen1);
  681.     write_sfm(2,shi1);
  682.     write_nyr(13,fen2);
  683.     write_nyr(10,shi2);
  684.     write_nyr(5,fen3);
  685.     write_nyr(2,shi3);
  686.         fen1= BCD_Decimal(read_1302(0xc1));
  687.     shi1 = BCD_Decimal(read_1302(0xc3));
  688.     fen2 = BCD_Decimal(read_1302(0xc5));
  689.     shi2 = BCD_Decimal(read_1302(0xc7));
  690.     fen3= BCD_Decimal(read_1302(0xc9));
  691.     shi3=BCD_Decimal(read_1302(0xcb));
  692. }
  693. void display()        //日期顯示函數
  694. {
  695.    write_1602com(yh+1);
  696.         write_1602dat('2');
  697.         write_1602com(yh+2);
  698.     write_1602dat('0');
  699.         write_1602com(yh+5);
  700.         write_1602dat('-');
  701.         write_1602com(yh+8);
  702.         write_1602dat('-');
  703.         write_1602com(er+4);
  704.         write_1602dat(':');
  705.         write_1602com(er+7);
  706.         write_1602dat(':');
  707.         miao = BCD_Decimal(read_1302(0x81));
  708.     fen  = BCD_Decimal(read_1302(0x83));
  709.     shi  = BCD_Decimal(read_1302(0x85));
  710.     ri   = BCD_Decimal(read_1302(0x87));
  711.     yue  = BCD_Decimal(read_1302(0x89));
  712.     nian =BCD_Decimal(read_1302(0x8d));
  713.     week =BCD_Decimal(read_1302(0x8b));
  714. //顯示秒、時、分數據:
  715. write_sfm(8,miao);//秒,從第二行第8個字后開始顯示(調用時分秒顯示子函數)
  716. write_sfm(5,fen);//分,從第二行第5個字符后開始顯示
  717. write_sfm(2,shi);//小時,從第二行第2個字符后開始顯示
  718. //顯示日、月、年數據:
  719. write_nyr(9,ri);//日期,從第二行第9個字符后開始顯示
  720. write_nyr(6,yue);//月份,從第二行第6個字符后開始顯示
  721. write_nyr(3,nian);//年,從第二行第3個字符后開始顯示
  722. write_week(week);
  723. }

  724. //*******************主函數**************************
  725. void main()
  726. {
  727. ds1302_init1();
  728. ds1302_init();   //調用DS1302時鐘的初始化子函數       
  729. lcd_init();      //調用液晶屏初始化子函數
  730. init();         //調用定時計數器的設置子函數
  731. buzzer=1;       //設置蜂鳴器初值
  732. while(1)  //無限循環下面的語句:
  733. {               uchar j;
  734.                 LEDCLK=0;
  735.                 LEDDIN=0;
  736.                 _nop_();
  737.                 LEDCLK=1;
  738.                 for(j=0;j<8;j++)
  739.                 {   Read_Key();
  740.                         delay(2);
  741.                         LEDCLK=0;
  742.                         LEDDIN=1;
  743.                         _nop_();
  744.                         LEDCLK=1; }
  745.            keyscan();
  746.            if(flag)
  747.            Key_job1();       
  748.            else
  749.                 Key_job();       
  750.         if(qqq==0)     //開顯示
  751.           {if(flag)
  752.       display1();//顯示鬧鐘時間
  753.      else
  754.         display();//顯示日期、 星期、秒、時、分數據       
  755. }
  756. bell();
  757. }
  758. }
復制代碼



作者: YeeeJ    時間: 2020-3-17 20:25
為什么我運行不了?提示是這樣的錯誤......(我用的是Keil3)
* RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED: 0D1AH BYTE (163%) *
******************************************************************************
Program Size: data=39.1 xdata=0 code=3583
LINK/LOCATE RUN COMPLETE.  0 WARNING(S),  0 ERROR(S)
*** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED
    MODULE:  D:\KEIL\C51\LIB\C51S.LIB (-----)
    LIMIT:   0800H BYTES
Target not created




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1