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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

做了個大字符萬年歷,12864顯示 帶PCB圖原理圖完整源碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:140489 發(fā)表于 2017-6-23 09:32 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
附件里有完整源碼,原理圖,PCB圖,protel格式的,PCB板和12864的尺寸一樣大,采用大字符數(shù)字顯示,效果還是比較好的。源碼是論壇里的,做了些改動;
大數(shù)字顯示時間,冒號閃爍;
加背光調(diào)亮度的代碼,溫度顯示有點跳動,后來就改成背光開關(guān)了。
DS1302的接晶振的腳留有電容的位置,加10~20pF的電容可以微調(diào)時間的精度。有備用電池,掉電時鐘芯片繼續(xù)走時。


實物圖:


電路原理圖:


背面圖:


pcb圖(protel99格式):

晶振腳接的15P的電容,測試下來,每天慢2秒,請高手看一下,能不能寫一個自動校正誤差的函數(shù),我在數(shù)碼管時鐘的程序里寫過自動校正誤差的函數(shù),但是在這里不行。
以下是數(shù)碼管時鐘自動校正誤差的函數(shù):
  1. /*********************************************************************************
  2. 描述: 8位共陰數(shù)碼管時鐘,顯示88-88-88樣式,正常走時的時候,兩個“-”0.5秒閃爍一次;
  3.        調(diào)時:按KEY1按鍵第1次分鐘位閃爍,再按KEY2一次分鐘加1,按KEY3一次分鐘減1,長按連加連減;
  4.                          按KEY1按鍵第2次小時位閃爍,再按KEY2一次小時加1,按KEY3一次小時減1,長按連加連減;
  5.                          按KEY1按鍵第3次,秒從零開始累加,時鐘回到正常走時;
  6.                          對時的時候先調(diào)好時、分,分鐘要比參考時間的分鐘加1分,
  7.                          再看參考時間的秒數(shù)到了59再按KEY1按鍵的第3次,這樣對時可以很準(zhǔn)的。
  8.                          加備用電池,掉電走時
  9. 仿真 實物都通過.  11.0592MHz晶振,STC89C52RC,兩個74HC573鎖存器做位選、段選
  10. **********************************************************************************/
  11. #include <reg52.h>
  12. #include <intrins.h>
  13. #define uchar unsigned char
  14. #define uint unsigned int


  15. sbit TSCLK = P1^0;//時鐘線 接到P10上用杜邦線
  16. sbit TIO   = P1^1;//數(shù)據(jù)線,接到P11上
  17. sbit TRST  = P1^2;//使能端,接到P12上


  18. sbit wela = P2^7;                                                                //位選
  19. sbit dula = P2^6;                                                                //段選

  20. sbit KEY1=P3^0;                                                                        //按鍵 設(shè)置/確認(rèn)
  21. sbit KEY2=P3^1;                                                                        //按鍵 加
  22. sbit KEY3=P3^2;                                                                        //按鍵 減

  23. uchar snum,fnum;

  24. char shi,fen,miao;

  25. uchar ss;

  26. char FunctionKeyNum=0;                                //功能鍵鍵值
  27. char FuncTempNum=0;                                        //功能鍵臨時鍵值
  28. typedef enum KeyState{StateInit,StateAffirm,StateSingle,StateRepeat};        //鍵值狀態(tài)值

  29. bit flag=0;           //自動校時標(biāo)志位

  30. /***********寫時分秒地址************/
  31. #define write_shi  0x84
  32. #define write_fen  0x82
  33. #define write_miao 0x80
  34. #define write_ram  0xc0
  35. /***********讀時分秒地址************/
  36. #define read_shi  0x85
  37. #define read_fen  0x83
  38. #define read_miao 0x81
  39. #define read_ram  0xc1
  40.                   // 0     1    2    3    4     5    6    7    8   9
  41. uchar d[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共陰不帶小數(shù)點
  42. //uchar dd[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};  //        共陰帶小數(shù)點


  43. void delay(uint z)
  44. {
  45.         uint x,y;
  46.         for(x=z;x>0;x--)
  47.                 for(y=120;y>0;y--);
  48. }


  49. void t0_init()  //定時50ms一個中斷
  50. {
  51.    
  52.   TMOD |= 0X01;
  53.   TH0 = (65536-46080)/256;
  54.   TL0 = (65536-46080)%256;
  55.   EA = 1;
  56.   ET0 = 1;
  57.   TR0 = 1;

  58. }

  59. void t1_init()
  60. {
  61.         TMOD |= 0x10;
  62.         TH1 = 0xDC;
  63.         TL1 = 0x00;
  64.         TR1 = 1;        
  65. }

  66. void temer0() interrupt 1
  67. {
  68.   TH0=(65536-46080)/256;
  69.   TL0=(65536-46080)%256;
  70.   ss++;
  71.   if(ss==20)
  72.   ss=0;

  73. }         


  74. void display(uchar shi,uchar fen,uchar miao)                          //顯示函數(shù)
  75. {
  76.         if(FunctionKeyNum==0)
  77.         {
  78.                 snum=30;
  79.                 fnum=30;
  80.         }
  81.         
  82.         if(FunctionKeyNum==1)
  83.         {
  84.                 fnum++;
  85.                 snum=30;
  86.         }
  87.         
  88.         if(FunctionKeyNum==2)
  89.         {
  90.                 snum++;
  91.                 fnum=30;
  92.         }
  93.         
  94.         
  95.         if(snum>=30)
  96.         {        
  97.                 if((shi/10)<1)         //如果小時十位小于1,
  98.                 {
  99.                 dula=1;                          //消影
  100.                 P0=0;
  101.                 dula=0;
  102.                
  103.                
  104.                 wela=1;
  105.                 P0=0xfe;                //第1位
  106.                 wela=0;

  107.                 dula = 1;
  108.                 P0=0xff;           // 小時十位就不顯示
  109.                 dula = 0;
  110.                 }
  111.                
  112.                 else
  113.                 {
  114.                 dula=1;                                //消影
  115.                 P0=0;
  116.                 dula=0;
  117.                
  118.                
  119.                 wela=1;
  120.                 P0=0xfe;          //第1位
  121.                 wela=0;

  122.                 dula=1;
  123.                 P0=d[shi/10];
  124.                 dula=0;
  125.                 P0=0xff;
  126.                 delay(2);
  127.                 }
  128.            
  129.                 dula=1;                                //消影
  130.                 P0=0;
  131.                 dula=0;
  132.                         
  133.                         wela=1;
  134.                         P0=0xfd;           //第2位
  135.                         wela=0;

  136.                         dula=1;
  137.                         P0=d[shi%10];                        
  138.                         dula=0;                                       
  139.                         delay(2);
  140.         
  141.         
  142.                 if(snum==60)
  143.                         snum=0;
  144.         }               


  145.         //        if(miao%2==0)         //if(miao%2==0) 1秒閃爍1次
  146.                 if(ss>=10)                 //        這里寫為ss>=10,閃爍頻率可調(diào)
  147.                 {                                 
  148.                 dula=1;                         //消影
  149.                 P0=0;
  150.                 dula=0;
  151.                
  152.                 wela=1;
  153.                 P0=0xfb;                //第3位
  154.                 wela=0;

  155.                 dula=1;
  156.                 P0=0x40;          //第三位數(shù)碼管顯示“— ”
  157.                
  158.                 dula=0;
  159.                 delay(2);
  160.         
  161.                 }

  162.                 else
  163.                 {
  164.                 dula=1;
  165.                 P0=0;
  166.                 dula=0;
  167.                
  168.                 wela=1;
  169.                 P0=0xfb;   //第3位
  170.                 wela=0;

  171.                 dula=1;
  172.                 P0=0;          //第三位數(shù)碼管不顯示
  173.                 dula=0;
  174.                 delay(2);        
  175.                 }
  176.         
  177.         
  178.         if(fnum>=30)
  179.         {
  180.                 dula=1;                   //消影
  181.                 P0=0;
  182.                 dula=0;
  183.                
  184.                 wela=1;
  185.                 P0=0xf7;         //第4位
  186.                 wela=0;

  187.                 dula=1;
  188.                 P0=d[fen/10];
  189.                 dula=0;
  190.                 delay(2);
  191.                
  192.                 dula=1;
  193.                 P0=0;
  194.                 dula=0;


  195.                 wela=1;
  196.                 P0=0xef;         //第5位
  197.                 wela=0;

  198.                 dula=1;
  199.                 P0=d[fen%10];
  200.                 dula=0;
  201.                 delay(2);
  202.         
  203.                
  204.                 if(fnum==60)
  205.                         fnum=0;
  206.         }
  207.                
  208.         //        if(miao%2==0)         //if(miao%2==0) 1秒閃爍1次
  209.                 if(ss>=10)                 //if(ss>=10)閃爍頻率可調(diào)
  210.                 {
  211.                 dula=1;
  212.                 P0=0;
  213.                 dula=0;
  214.                
  215.                 wela=1;
  216.                 P0=0xdf;          //第6位
  217.                 wela=0;
  218.                 dula=1;
  219.                 P0=0x40;          //第六位數(shù)碼管顯示“— ”
  220.                 dula=0;
  221.                 delay(2);
  222.                 }

  223.                 else
  224.                 {
  225.                 dula=1;                           //消影
  226.                 P0=0;
  227.                 dula=0;
  228.                
  229.                 wela=1;
  230.                 P0=0xdf;   //第6位
  231.                 wela=0;
  232.                 dula=1;
  233.                 P0=0;          //第六位數(shù)碼管不顯示
  234.                 dula=0;
  235.                 delay(2);
  236.                 }
  237. //--------------------/        
  238.                 dula=1;                          //消影
  239.                 P0=0;
  240.                 dula=0;
  241.                
  242.                 wela=1;
  243.                 P0=0xbf;                //第7位
  244.                 wela=0;

  245.             dula=1;
  246.                 P0=d[miao/10];        //秒十位
  247.                 dula=0;
  248.                 delay(2);
  249. //--------------------/        
  250.                 dula=1;                          //消影
  251.                 P0=0;
  252.                 dula=0;
  253.                
  254.                 wela=1;
  255.                 P0=0x7f;                //第8位
  256.                 wela=0;

  257.                 dula=1;
  258.                 P0=d[miao%10];        //秒個位
  259.                 dula=0;
  260.                 delay(2);               
  261. }  




  262. //寫DS1302數(shù)據(jù)
  263. void Write_DS1302_DAT(uchar cmd, uchar dat)
  264. {
  265.         uchar i;
  266.         TRST = 0; //拉低使能端
  267.         TSCLK = 0;//拉低數(shù)據(jù)總線
  268.         TRST = 1; //拉高使能端,產(chǎn)生上升沿開始寫數(shù)據(jù)
  269.         for(i = 0; i < 8; i++)//每次寫1位,寫8次
  270.         {
  271.                 TSCLK = 0;                  //拉低時鐘總線
  272.                 TIO = cmd & 0x01; //寫1位數(shù)據(jù),從最低位開始寫
  273.                 TSCLK = 1;                  //拉高時鐘總線,產(chǎn)生上升沿數(shù)據(jù)被DS1302讀走
  274.                 cmd >>=1;                  //右移一位
  275.         }
  276.         for(i = 0; i < 8; i++)//每次寫1位,寫8次
  277.         {
  278.                 TSCLK = 0;                  //拉低時鐘總線
  279.                 TIO = dat & 0x01; //寫1位數(shù)據(jù),從最低位開始寫
  280.                 TSCLK = 1;                  //拉高時鐘總線,產(chǎn)生上升沿數(shù)據(jù)被DS1302讀走
  281.                 dat >>= 1;                  //右移一位
  282.         }
  283. }
  284. //讀DS1302數(shù)據(jù)
  285. uchar Read_DS1302_DAT(uchar cmd)
  286. {
  287.         uchar i, dat;
  288.         TRST = 0;  //拉低使能端
  289.         TSCLK = 0; //拉低數(shù)據(jù)總線
  290.         TRST = 1;  //拉高使能端,產(chǎn)生上升沿開始寫數(shù)據(jù)
  291.         for(i = 0; i < 8; i++)//每次寫1位,寫8次
  292.         {
  293.                 TSCLK = 0;                 //拉低時鐘總線
  294.                 TIO = cmd & 0x01;//寫1位數(shù)據(jù),從最低位開始寫
  295.                 TSCLK = 1;                 //拉高時鐘總線,產(chǎn)生上升沿數(shù)據(jù)被DS1302讀走
  296.                 cmd >>=1;                 //右移一位
  297.         }
  298.         for(i = 0; i < 8; i++)//每次讀1位,讀8次
  299.         {
  300.                 TSCLK = 0;                  //拉低時鐘總線,產(chǎn)生下降沿,DS1302把數(shù)據(jù)放到TIO上
  301.                 dat >>= 1;                  //右移一位
  302.                 if(TIO)        dat |= 0x80;//讀取數(shù)據(jù),從最低位開始
  303.                 TSCLK = 1;                        //拉高時鐘總線,以備下一次產(chǎn)生下降沿
  304.         }
  305.         return dat;        //返回讀出數(shù)據(jù)
  306. }

  307. //數(shù)據(jù)轉(zhuǎn)BCD碼
  308. uchar Dat_Chg_BCD(uchar dat)
  309. {
  310.         uchar dat1, dat2;
  311.         dat1 = dat / 10;
  312.         dat2 = dat % 10;
  313.         dat2 = dat2 + dat1 * 16;
  314.         return dat2;
  315. }

  316. //BCD碼轉(zhuǎn)換為數(shù)據(jù)
  317. uchar BCD_Chg_Dat(uchar dat)
  318. {
  319.         uchar dat1, dat2;
  320.         dat1 = dat / 16;
  321.         dat2 = dat % 16;
  322.         dat2 = dat2 + dat1 * 10;
  323.         return dat2;
  324. }



  325. void init_1302()                //初始化函數(shù) 設(shè)置時間
  326. {                                                //加備用電池,掉電走時

  327.         if((Read_DS1302_DAT(0x81)& 0x80) != 0)        //讀出秒數(shù)據(jù),再跟80h(0x80)與運算看結(jié)果,結(jié)果是0則不需要初始化1302;是80h就要初始化!
  328.         {
  329.         Write_DS1302_DAT(0x8e, 0);//清除寫保護(hù)
  330.         Write_DS1302_DAT(0x80, Dat_Chg_BCD(58));//58秒(并且進(jìn)行BCD碼轉(zhuǎn)換)
  331.         Write_DS1302_DAT(0x82, Dat_Chg_BCD(10));//10分
  332.         Write_DS1302_DAT(0x84, Dat_Chg_BCD(9));//9時
  333.         Write_DS1302_DAT(0x8e, 0x80);//開寫保護(hù)
  334.         }

  335. }         


  336. void read_sf()
  337. {

  338.         miao = BCD_Chg_Dat(Read_DS1302_DAT(0x81));//讀秒寄存器(并且進(jìn)行BCD碼轉(zhuǎn)換)
  339.         fen        = BCD_Chg_Dat(Read_DS1302_DAT(0x83));//讀分寄存器
  340.         shi = BCD_Chg_Dat(Read_DS1302_DAT(0x85));//讀時寄存器

  341.         display(shi,fen,miao);

  342. }


  343. void zdjs()                                                          //自動校時,這方法測試可行,每天減去快出的秒數(shù)
  344. {
  345.          if((shi==12)&&(fen==0)&&(miao==4))        //   清翔實驗板上的時鐘每天快4秒
  346.            {
  347.                            if(flag==0)
  348.                         {
  349.                                 Write_DS1302_DAT(0x8e,0x00);           //寫保護(hù)取消
  350.                                 Write_DS1302_DAT(write_miao,0x00); //寫秒0,這里是假如每天快4秒,每到這個時候就減去4秒
  351.                             Write_DS1302_DAT(0x8e,0x80);           //啟動寫保護(hù)
  352.                                 flag=1;                                                           //標(biāo)志位置1,不然這里會成一個死循環(huán)
  353.                         }
  354.             }

  355.           if((shi==12)&&(fen==1)&&(miao==0))
  356.                           flag=0;                                   //標(biāo)志位清零,準(zhǔn)備第二天校時
  357. }



  358. void KeyScan(void)
  359. {
  360.         static uchar KeyStateTemp1 = 0;                  //按鍵狀態(tài)臨時存儲值1
  361.         static uchar KeyStateTemp2 = 0;                  //按鍵狀態(tài)臨時存儲值2
  362.         static uchar KeyStateTemp3 = 0;                  //按鍵狀態(tài)臨時存儲值3
  363.         static uchar KeyTime = 0;                          //按鍵延時時間
  364.         bit KeyPressTemp1;                                          //按鍵是否按下存儲值1
  365.         bit KeyPressTemp2;                                          //按鍵是否按下存儲值2
  366.         bit KeyPressTemp3;                                          //按鍵是否按下存儲值3

  367.         KeyPressTemp1 = KEY1;                                  //讀取IO口的鍵值
  368.         switch(KeyStateTemp1)
  369.         {
  370.                 case StateInit:
  371.                         if(!KeyPressTemp1)                                        //KEY1按下
  372.                                 KeyStateTemp1 = StateAffirm;        //按鍵狀態(tài)切換到確認(rèn)態(tài)
  373.                 break;
  374.                 case StateAffirm:                                                //確認(rèn)狀態(tài)
  375.                         if(!KeyPressTemp1)                                        //按鍵還在按下
  376.                         {
  377.                                 KeyTime = 0;
  378.                                 KeyStateTemp1 = StateSingle;        //按鍵狀態(tài)切換到單擊狀態(tài)
  379.                         }
  380.                         else KeyStateTemp1 = StateInit;                //否則按鍵抬起,回到初始態(tài)
  381.                 break;
  382.                
  383.                 case StateSingle:                                                //單擊
  384.                          if(KeyPressTemp1)
  385.                          {
  386.                                 KeyStateTemp1 = StateInit;                 //按鍵釋放
  387.                                 FuncTempNum++;                                         //鍵值加1
  388.                                 if(FuncTempNum>3)  FuncTempNum = 0;
  389.                          }

  390.                          else if(++KeyTime>100)
  391.                          {
  392.                                          KeyPressTemp1 = StateRepeat;
  393.                                         KeyTime = 0;
  394.                          }
  395.                 break;
  396.         
  397.                 case StateRepeat:                                                 //連發(fā)
  398.                         if(KeyPressTemp1)
  399.                                 KeyStateTemp1 = StateInit;
  400.                         else
  401.                         {
  402.                                 if(++KeyTime > 10)
  403.                                 {
  404.                                         KeyTime = 0;
  405.                                         FuncTempNum++;
  406.                                         if(FuncTempNum>3)  FuncTempNum = 0;
  407.                                 }
  408.                                 break;
  409.                         }
  410.                 break;
  411.         
  412.                 default :KeyStateTemp1 = KeyStateTemp1 = StateInit; break;
  413.                         
  414.         }


  415. if(FuncTempNum)                                                                //只有功能鍵被按下后,增加和減小鍵才有效
  416.         {
  417.                 KeyPressTemp2 = KEY2;                                        //讀取I/O口的鍵值
  418.                 switch(KeyStateTemp2)
  419.                 {        
  420.                         case StateInit:                                                //按鍵初始狀態(tài)
  421.                                 if(!KeyPressTemp2)                                //當(dāng)按鍵按下,狀態(tài)切換到確認(rèn)態(tài)
  422.                                         KeyStateTemp2 = StateAffirm;
  423.                                 break;
  424.                         case StateAffirm:                                        //按鍵確認(rèn)態(tài)
  425.                                 if(!KeyPressTemp2)
  426.                                 {
  427.                                         KeyTime = 0;
  428.                                         KeyStateTemp2 = StateSingle;//切換到單次觸發(fā)態(tài)        
  429.                                 }
  430.                                 else KeyStateTemp2 = StateInit; //按鍵已抬起,切換到初始態(tài)
  431.                                 break;
  432.                         case StateSingle:                                        //按鍵單發(fā)態(tài)
  433.                                 if(KeyPressTemp2)                                //按下時間小于1s
  434.                                 {
  435.                                         KeyStateTemp2 = StateInit;  //按鍵釋放,則回到初始態(tài)
  436.                                         if(FunctionKeyNum == 1)                //若功能鍵第一次按下
  437.                                         {
  438.                                         fen++;
  439.                                         fen=fen/10*16+fen%10;                //轉(zhuǎn)為16進(jìn)制
  440.                                         if(fen==0x60)
  441.                                             fen=0x00;
  442.                                                 Write_DS1302_DAT(write_fen,fen);
  443. //                                                write_1302(write_fen,fen);        //寫入1302
  444.                                         read_sf();                                        //讀出時間,然后顯示
  445.                                         }
  446.                                         if(FunctionKeyNum == 2)                //若功能鍵第二次按下
  447.                                         {
  448.                                                 shi++;
  449.                                                 shi=shi/10*16+shi%10;                //轉(zhuǎn)為16進(jìn)制
  450.                                                 if(shi==0x24)
  451.                                                         shi=0x00;
  452.                                                 Write_DS1302_DAT(write_shi,shi);
  453. //                                                write_1302(write_shi,shi);
  454.                                                 read_sf();

  455.                                         }
  456.                                         }
  457.                                         else if(++KeyTime > 100)        //按下時間大于1s(100*10ms)
  458.                                         {
  459.                                                 KeyStateTemp2 = StateRepeat;//狀態(tài)切換到連發(fā)態(tài)
  460.                                                 KeyTime = 0;        
  461.                                         }
  462.                                 break;
  463.                         case StateRepeat:                                        //按鍵連發(fā)態(tài)               
  464.                                 if(KeyPressTemp2)
  465.                                         KeyStateTemp2 = StateInit;        //按鍵釋放,則進(jìn)初始態(tài)
  466.                                 else                                                        //按鍵未釋放
  467.                                 {
  468.                                         if(++KeyTime > 10)                        //按鍵計時值大于100ms(10*10ms)
  469.                                         {
  470.                                                 KeyTime = 0;        
  471.                                                 if(FunctionKeyNum == 1)        //若功能鍵第一次按下
  472.                                                 {
  473.                                         fen++;
  474.                                         fen=fen/10*16+fen%10;                //轉(zhuǎn)為16進(jìn)制
  475.                                         if(fen==0x60)
  476.                                             fen=0x00;
  477.                                                         Write_DS1302_DAT(write_fen,fen);
  478. //                                                write_1302(write_fen,fen);        //寫入1302
  479.                                         read_sf();                                        //讀出時間,然后顯示
  480.                                                 }
  481.                                                 
  482.                                                 if(FunctionKeyNum == 2)        //若功能鍵第二次按下
  483.                                                 {
  484.                                                 shi++;
  485.                                                 shi=shi/10*16+shi%10;                //轉(zhuǎn)為16進(jìn)制
  486.                                                 if(shi==0x24)
  487.                                                         shi=0x00;
  488.                                                 
  489.                                                 Write_DS1302_DAT(write_shi,shi);
  490. //                                                write_1302(write_shi,shi);
  491.                                                 read_sf();
  492.                                                 }
  493.                                         }
  494.                                         break;
  495.                                 }
  496.                                 break;
  497.                         default: KeyStateTemp2 = KeyStateTemp2 = StateInit; break;
  498.                 }


  499.                 KeyPressTemp3 = KEY3;                                                //讀取I/O口的鍵值
  500.                 switch(KeyStateTemp3)
  501.                 {        
  502.                         case StateInit:                                                        //按鍵初始狀態(tài)
  503.                                 if(!KeyPressTemp3)                                        //當(dāng)按鍵按下,狀態(tài)切換到確認(rèn)態(tài)
  504.                                         KeyStateTemp3 = StateAffirm;
  505.                                 break;
  506.                         case StateAffirm:                                                //按鍵確認(rèn)態(tài)
  507.                                 if(!KeyPressTemp3)
  508.                                 {
  509.                                         KeyTime = 0;
  510.                                         KeyStateTemp3 = StateSingle;        //切換到單次觸發(fā)態(tài)        
  511.                                 }
  512.                                 else KeyStateTemp3 = StateInit;         //按鍵已抬起,切換到初始態(tài)
  513.                                 break;
  514.                         case StateSingle:                                                //按鍵單發(fā)態(tài)
  515.                                 if(KeyPressTemp3)                                        //按下時間小于1s
  516.                                 {
  517.                                         KeyStateTemp3 = StateInit;          //按鍵釋放,則回到初始態(tài)
  518.                                         if(FunctionKeyNum == 1)                        //若功能鍵第一次按下
  519.                                         {
  520.                                                 fen--;
  521.                                                 fen=fen/10*16+fen%10;                //轉(zhuǎn)為16進(jìn)制
  522.                                                 if(fen==-1)
  523.                                                 fen=0x59;
  524.                                                         Write_DS1302_DAT(write_fen,fen);
  525. //                                                write_1302(write_fen,fen);
  526.                                                 read_sf();
  527.                                         }
  528.                                         if(FunctionKeyNum == 2)                        //若功能鍵第二次按下
  529.                                         {
  530.                                                 shi--;
  531.                                                 shi=shi/10*16+shi%10;                //轉(zhuǎn)為16進(jìn)制
  532.                                                 if(shi==-1)
  533.                                                 shi=0x23;
  534.                                                 
  535.                                                 Write_DS1302_DAT(write_shi,shi);

  536. //                                                write_1302(write_shi,shi);
  537.                                                 read_sf();
  538.                                         }
  539.                                 }
  540.                                 else if(++KeyTime > 100)                        //按下時間大于1s(100*10ms)
  541.                                 {
  542.                                         KeyStateTemp3 = StateRepeat;        //狀態(tài)切換到連發(fā)態(tài)
  543.                                         KeyTime = 0;        
  544.                                 }
  545.                                 break;
  546.                         case StateRepeat:                                                //按鍵連發(fā)態(tài)               
  547.                                 if(KeyPressTemp3)
  548.                                         KeyStateTemp3 = StateInit;                //按鍵釋放,則進(jìn)初始態(tài)
  549.                                 else                                                                //按鍵未釋放
  550.                                 {
  551.                                         if(++KeyTime > 10)                                //按鍵計時值大于100ms(10*10ms)
  552.                                         {
  553.                                                 KeyTime = 0;        
  554.                                                 if(FunctionKeyNum == 1)                //若功能鍵第一次按下
  555.                                                 {
  556.                                                         fen--;
  557.                                                         fen=fen/10*16+fen%10;                //轉(zhuǎn)為16進(jìn)制
  558.                                                         if(fen==-1)
  559.                                                         fen=0x59;
  560.                                                                 Write_DS1302_DAT(write_fen,fen);
  561. //                                                        write_1302(write_fen,fen);
  562.                                                         read_sf();
  563.                                                 }
  564.                                                 if(FunctionKeyNum == 2)                //若功能鍵第二次按下
  565.                                                 {
  566.                                                         shi--;
  567.                                                         shi=shi/10*16+shi%10;                //轉(zhuǎn)為16進(jìn)制
  568.                                                         if(shi==-1)
  569.                                                         shi=0x23;
  570.                                                 Write_DS1302_DAT(write_shi,shi);
  571. //                                                        write_1302(write_shi,shi);
  572.                                                         read_sf();
  573.                                                 }
  574.                                         }
  575.                                         break;
  576.                                 }
  577.                                 break;
  578.                         default: KeyStateTemp3 = KeyStateTemp3 = StateInit; break;
  579.                 }
  580.         }
  581. }


  582. void ExecuteKeyNum()
  583. {
  584.         if(TF1)
  585.         {
  586.                 TF1 = 0;
  587.                 TH1 = 0xDC;
  588.                 TL1 = 0x00;
  589.                 KeyScan();
  590.         }

  591.         switch (FuncTempNum)
  592.         {
  593.                 case 1:        FunctionKeyNum = 1;

  594.                                 Write_DS1302_DAT(0x8e,0x00);                //寫保護(hù)取消
  595.                                 Write_DS1302_DAT(write_miao,0x80); //  寫秒80,時鐘停止走時;
  596.                 break;
  597.                
  598.                 case 2: FunctionKeyNum = 2;

  599.                 break;
  600.                
  601.                 case 3:
  602.                                 FunctionKeyNum = 0;
  603.                                 Write_DS1302_DAT(write_miao,0x00);
  604.                                 Write_DS1302_DAT(0x8e,0x80);                //保護(hù)啟動
  605.                                 FuncTempNum =0;
  606.                 break;


  607.         }
  608. }


  609. void main()
  610. {        
  611.         t0_init();
  612.         t1_init();
  613.         init_1302();

  614.         while(1)
  615.         {
  616.            read_sf();  
  617.            ExecuteKeyNum();
  618.            zdjs();//自動校時
  619.         }
  620. }

復(fù)制代碼




單片機源程序:
  1. /*---------------------------------------------------------------------------

  2.         單 片 機:STC90C516RD+      (HEX文件不到8K,用STC89C52也可以)
  3.         晶    振:11.0592MHz
  4.         時鐘芯片:DS1302
  5.         測溫芯片:DS18B20
  6.         接 收 頭:HS0038BD
  7.         液 晶 屏:LCM-12864-ST7920
  8.         功能描述: 大數(shù)字顯示時間;能顯示農(nóng)歷、溫度和設(shè)置鬧鈴;有整點報時功能
  9.                           紅外遙控和按鍵都能設(shè)置時間、鬧鈴和背光的開關(guān)
  10.         實物測試通過
  11. ------------------------------------------------------------------------------*/

  12. /*-------------------------------頭文件---------------------------------------*/
  13. #include <reg52.h>
  14. #include <intrins.h>
  15. #include "LCD12864.h"
  16. #include "DS1302.h"
  17. #include "DS18B20.h"
  18. #include "nongli.h"
  19. #include "displaytime.h"
  20. #include "zk.h"
  21. #include "bell.h"
  22. #include "HW.H"
  23. #include "delay.h"

  24. #define uint  unsigned int
  25. #define uchar unsigned char

  26. /*--------------------定義按鍵-----------------------------------------------*/
  27. sbit K1  = P3^0; //K1-設(shè)置
  28. sbit K2  = P3^1; //K2-確認(rèn)、返回
  29. sbit K3  = P3^3; //K3-加
  30. sbit K4  = P3^4; //K4-減
  31. sbit K6  = P3^6; //背光開關(guān)
  32. sbit BL = P2^7;         //背光控制端

  33. /*---------------------函數(shù)聲明------------------------------*/              
  34. void ds_w0(void);
  35. void ds_w(void);
  36. void Conver_week(bit c,uchar year,uchar month,uchar day);
  37. /*-----------------------------定義全局變量------------------------------*/
  38. bit  w=0;    //調(diào)時標(biāo)志位

  39. unsigned char yy,mo,dd,xq,hh,mm,ss,month_moon,day_moon,week,tiangan,dizhi,moontemp1,moontemp2;//定義時間映射全局變量(專用寄存器)
  40. signed char address,item,item0,max,mini;
  41. unsigned char clk_ala[2]={0x00,0x00};//鬧鐘數(shù)據(jù)存放初,始值為00:00
  42. unsigned char hour,minute,time;//用于鬧鈴的設(shè)置

  43. //unsigned char ba=5,bi=0;

  44. /*-----------------------------日期、時間設(shè)置函數(shù)-----------------------------*/

  45. void tiaozheng(void){
  46.         yy = read_clock(0x8d);//調(diào)用1302時鐘數(shù)據(jù)中的年數(shù)據(jù),從地址0x8d中
  47.         mo = read_clock(0x89);//調(diào)用1302時鐘數(shù)據(jù)中的月數(shù)據(jù),從地址0x89中
  48.         dd = read_clock(0x87);//從1302芯片中讀取日數(shù)據(jù),從地址0x87中
  49.         week = read_clock(0x8b);//從1302芯片中讀取星期數(shù)據(jù),從地址0x8b中
  50.         //----------------------------------
  51.         lcm_w_test(0,0x80);
  52.         lcm_w_word("20");//顯示內(nèi)容字符20
  53.         lcm_w_test(1,(yy/16)+0x30);//函數(shù)參數(shù)1,代表本行寫數(shù)據(jù),YY/16+0X30得出年十位數(shù)字的顯示碼地址,送顯示        
  54.         lcm_w_test(1,yy%16+0x30);//函數(shù)
  55.         lcm_w_word("年");
  56.         //----------------------------------
  57.         lcm_w_test(1,(mo/16)+0x30);
  58.         lcm_w_test(1,mo%16+0x30);//與16取余數(shù),得到月份的個位數(shù),加0x30得到該數(shù)字的液晶內(nèi)定顯示碼送顯示
  59.         lcm_w_word("月");//調(diào)用字符顯示函數(shù),顯示文字 月
  60.         //----------------------------------
  61. /*
  62.         lcm_w_test(0,0x88);//第一個參數(shù)0,表示本行寫入LCM的是指令,指定顯示位置88H(第三行左端)
  63.         lcm_w_word("星期");//調(diào)用字符顯示函數(shù),顯示文字 星期
  64.         lcm_w_test(1,mo%16+0x30);//與16取余數(shù),得到月份的個位數(shù),加0x30得到該數(shù)字的液晶內(nèi)定顯示碼送顯示
  65. */
  66.         //----------------------------------
  67.         lcm_w_test(1,(dd/16)+0x30);
  68.         lcm_w_test(1,dd%16+0x30);//第一個1參數(shù),表示本行寫數(shù)據(jù),日數(shù)據(jù)與16取余得個位數(shù),加0x30得到顯示碼
  69.         lcm_w_word("日");//顯示字符 日
  70.         //----------------------------------
  71.         if(read_clock(0x85) != hh){//如果程序中的小時與1302芯片中的不同,
  72.                 hh = read_clock(0x85);//刷新程序中的小時數(shù)據(jù)
  73.         }
  74.         lcm_w_test(0,0x91);//第一個參數(shù)0,表示本行寫入LCM的是指令,指定顯示位置88H(第三行左端)
  75.         lcm_w_test(1,(hh/16)+0x30);//顯示十位
  76.         lcm_w_test(1,hh%16+0x30);//顯示個位
  77.         lcm_w_word("時");
  78.         //----------------------------------
  79.         if(read_clock(0x83) != mm){//如果1302芯片中的分鐘數(shù)據(jù)與程序中的分鐘變量不相等               
  80.                 mm = read_clock(0x83);//刷新程序中的分鐘數(shù)據(jù)
  81.         }
  82.         lcm_w_test(1,(mm/16)+0x30);//向液晶寫數(shù)據(jù),顯示分鐘的十位數(shù)
  83.         lcm_w_test(1,mm%16+0x30);//向液晶寫數(shù)據(jù),顯示分鐘的個位數(shù)
  84.         lcm_w_word("分");
  85.         //----------------------------------
  86.         if(read_clock(0x81) != ss){//如果1302芯片中的分鐘數(shù)據(jù)與程序中的秒鐘變量不相等(0x81為讀秒數(shù)據(jù)0x80為寫秒數(shù)據(jù))               
  87.                 ss = read_clock(0x81);//刷新程序中的秒鐘數(shù)據(jù)
  88.         }
  89.         lcm_w_test(1,(ss/16)+0x30);//向液晶寫數(shù)據(jù),顯示分鐘的十位數(shù)
  90.         lcm_w_test(1,ss%16+0x30);//向液晶寫數(shù)據(jù),顯示分鐘的個位數(shù)
  91.         lcm_w_word("秒");

  92. //////////////////////////////////////////////////////////////////////
  93.         //=========顯示鬧鐘的設(shè)置時間===================        
  94.         
  95.         hour=clk_ala[0];        //取出上一次的鬧鐘小時值
  96.         minute=clk_ala[1];         //取出上一次的鬧鐘分鐘值
  97.         
  98.         lcm_w_test(0,0x88);
  99.         lcm_w_word("鬧鐘---");
  100.         //----------------------------        
  101.         lcm_w_test(1,(hour/10)+0x30);//顯示小時十位
  102.         lcm_w_test(1,(hour%10)+0x30);//顯示小時個位
  103.         //----------------------------
  104.           lcm_w_word(":");
  105.         //----------------------------
  106.         lcm_w_test(1,(minute/10)+0x30);//顯示分鐘的十位
  107.         lcm_w_test(1,(minute%10)+0x30);//顯示分鐘的個位
  108.         //----------------------------
  109.         lcm_w_word("----");


  110. /////////////////////////////////////////////////////////////////////////

  111. }
  112. /*****************************************************************************/
  113. //被調(diào)數(shù)據(jù)加一或減一,并檢查數(shù)據(jù)范圍,寫入1302指定地址保存
  114. void ds_w(void)
  115. {
  116.         item0=time;
  117.         item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;//時間的調(diào)整
  118.         if(K3 == 0||key_add==1){//如果按動上調(diào)鍵
  119.          item++;//數(shù)加 1  
  120.         }
  121.         if(K4 == 0||key_minish==1){//如果按動下調(diào)鍵
  122.            item--;//數(shù)減 1
  123.         }
  124.         if(item>max)  item=mini;//查看數(shù)值是否在有效范圍之內(nèi)   
  125.         if(item<mini) item=max;//如果數(shù)值小于最小值,則自動等于最大值           
  126.         write_clock(0x8e,0x00);//允許寫1302芯片操作
  127.         write_clock(address,(item/10)*16+item%10);//轉(zhuǎn)換成16進(jìn)制寫入1302
  128.         write_clock(0x8e,0x80);//寫保護(hù),禁止寫操作
  129. }

  130. /********************************************************************/
  131. //===============鬧鐘時間的加減設(shè)置======================
  132. void ds_w0(void)
  133. {
  134.   item0=time;

  135.   if(K3 == 0||key_add==1){//如果按動上調(diào)鍵
  136.         item0++;//數(shù)加 1
  137.         }
  138.   if(K4 == 0||key_minish==1){//如果按動下調(diào)鍵
  139.         item0--;//數(shù)減 1
  140.         }
  141.   if(item0>max) item0=mini;//查看數(shù)值是否在有效范圍之內(nèi)
  142.   if(item0<mini)item0=max;//如果數(shù)值小于最小值,則自動等于最大值
  143.   time=item0;//調(diào)整后的時間重新賦值給time(time為hour或minute),這步很重要,沒有將無法更新鬧鐘數(shù)據(jù)
  144. }


  145. /**********************************************************************************************************/
  146. //調(diào)整時間子函數(shù),設(shè)置鍵、數(shù)據(jù)范圍、上調(diào)加一,下調(diào)減一功能。
  147. void Set_time(unsigned char sel){ //根據(jù)選擇調(diào)整的相應(yīng)項目加1并寫入DS1302,函數(shù)參數(shù)是按動設(shè)置鍵的次數(shù)

  148.         write_com(0x30); write_com(0x06);

  149.         lcm_w_test(0,0x98);//第一參數(shù)0表示本行寫入指令,指定下面行的 調(diào)整 顯示起始位置為9AH
  150.         lcm_w_word(">>調(diào)整>>    <<<<");//調(diào)用字符顯示函數(shù),顯示 調(diào)整字樣

  151. /*        if(sel==8)  {lcm_w_word("星期");address=0x8a; max=7;mini=1;         
  152.      tiaozheng();
  153.      ds_w();
  154.      tiaozheng();
  155.           }
  156. */
  157. //================================================================
  158.         lcm_w_test(0,0x9c);
  159.         if(sel==7)  {lcm_w_word("鬧鐘分"); time=minute;max=59;mini=0;         
  160.          tiaozheng();//顯示調(diào)整前的內(nèi)容
  161.      ds_w0();//設(shè)置鬧鐘
  162.          clk_ala[1]=time;//把更新后的分鐘數(shù)據(jù)重新保存
  163.      tiaozheng();//顯示調(diào)整后的內(nèi)容
  164.           }//按動8次顯示 調(diào)整鬧鐘的分鐘部分
  165.         if(sel==6)  {lcm_w_word("鬧鐘時");time=hour; max=23;mini=0;
  166.      tiaozheng();
  167.      ds_w0();
  168.          clk_ala[0]=time;//把更新后的小時數(shù)據(jù)重新保存
  169.      tiaozheng();
  170.           }//按動7次顯示 調(diào)整鬧鐘的小時部分
  171. //================================================================

  172.         if(sel==5)  {lcm_w_word("秒鐘");address=0x80; max=59;mini=0;         
  173.         tiaozheng();  //調(diào)用日期、時間調(diào)整函數(shù)
  174.            ds_w();                  //被調(diào)數(shù)據(jù)加一或減一函數(shù)
  175.            tiaozheng();

  176.         }        //秒6,按動6次顯示 調(diào)整秒鐘   
  177.                 //并指定秒鐘數(shù)據(jù)寫入1302芯片的寫入地址是0x80,秒鐘數(shù)據(jù)的最大值是59,最小值是0

  178.         if(sel==4)  {lcm_w_word("分鐘");address=0x82; max=59;mini=0;
  179.            tiaozheng();
  180.            ds_w();
  181.            tiaozheng();

  182.         }        //分鐘5,按動5次顯示 調(diào)整分鐘
  183.                 //并指定分鐘數(shù)據(jù)寫入1302芯片的地址是0x82,分鐘數(shù)據(jù)的最大值是59,最小值是0

  184.         if(sel==3)  {lcm_w_word("小時");address=0x84; max=23;mini=0;

  185.             tiaozheng();
  186.            ds_w();
  187.            tiaozheng();

  188.         }        //小時4,按動4次顯示 調(diào)整小時
  189.                 //規(guī)定小時數(shù)據(jù)寫入1302芯片的位置是0x84,小時數(shù)據(jù)最大值23,最小值是0


  190.         if(sel==2)  {lcm_w_word("日期");address=0x86;
  191.                 mo = read_clock(0x89);//讀月數(shù)據(jù)
  192.                 moontemp1=mo/16;
  193.                 moontemp2=mo%16;
  194.                 mo=moontemp1*10+moontemp2;//轉(zhuǎn)換成10進(jìn)制月份數(shù)據(jù)

  195.       yy = read_clock(0x8d);//讀年數(shù)據(jù)
  196.       moontemp1=yy/16;
  197.                 moontemp2=yy%16;
  198.                 yy=moontemp1*10+moontemp2;//轉(zhuǎn)換成10進(jìn)制年份數(shù)據(jù)

  199.       if(mo==2&&yy%4!=0){max=28;mini=1;}//平年2月28天
  200.                 if(mo==2&&yy%4==0){max=29;mini=1;}//閏年2月29天
  201.                 if(mo==1||mo==3||mo==5||mo==7||mo==8||mo==10||mo==12){max=31;mini=1;}//31天的月份
  202.                 if(mo==4||mo==6||mo==9||mo==11){max=30;mini=1;}//30天的月份
  203.                 tiaozheng();
  204.                 ds_w();
  205.                 tiaozheng(); //調(diào)用日期、時間調(diào)整函數(shù)

  206.   }        //日3,按動3次顯示 調(diào)整日期
  207.                 //規(guī)定日期數(shù)據(jù)寫入1302的位置地址是0x86,日期最大值31,最小值是1



  208.   if(sel==1)  {lcm_w_word("月份");address=0x88; max=12;mini=1;
  209.      tiaozheng();
  210.      ds_w();
  211.      tiaozheng();

  212.    }        //月2,按動2次顯示 調(diào)整月份
  213.                 //規(guī)定月份寫入1302的位置地址是0x88,月份最大值12,最小值1


  214.   if(sel==0)  {lcm_w_word("年份");address=0x8c; max=99; mini=0;
  215.          tiaozheng();
  216.      ds_w();                //被調(diào)數(shù)據(jù)加一或減一函數(shù)
  217.      tiaozheng();        //調(diào)用日期、時間調(diào)整函數(shù)

  218.    }        //年1,按動1次顯示 調(diào)整年份,
  219.                 //規(guī)定年份寫入1302的地址是0x8c,年份的最大值99,最小值0

  220. }

  221. /*********************************************************************
  222. **********************************************************************
  223. **************             主函數(shù)                                  ****************
  224. **********************************************************************
  225. /********************************************************************/
  226. void main()
  227. {        
  228.         unsigned char e=0,f=0,tmp,i;                     

  229.     IE = 0x81;    //允許總中斷中斷,使能 INT0 外部中斷
  230.     TCON = 0x01;  //觸發(fā)方式為脈沖負(fù)邊沿觸發(fā)   
  231.     IRIN=1;       //IO口初始化

  232. //        TMOD |=0x02;
  233. ////    EA=1;
  234. //    ET0=1;
  235. //    TR0=1;
  236.         
  237.         
  238.         BEEP=1;
  239.         K1=1;K2=1;K3=1;K4=1; K6=1;
  240.         
  241.         BL = 0;

  242. //        duan = 1;
  243. //        P0 = 0;
  244. //        duan = 0;

  245.         Init_1302();                //時鐘芯片初始化
  246.         lcm_init();                        //液晶初始化
  247.         welcome0();  //調(diào)用歡迎信息1
  248.         DelayM(2000);//延時
  249.         //welcome();DelayM(1000);  //調(diào)用歡迎信息2                 
  250.         lcm_clr();            //清屏
  251.         Clean_12864_GDRAM();         //清屏
  252.         while(1)
  253.         {


  254.                 if (w == 0)                  //正常走時
  255.                 {
  256.                         displaydate();         //顯示日期
  257.                         displaynl();         //顯示農(nóng)歷
  258.                         displaytime();         //顯示時間
  259.                         read_temp();         //讀取溫度
  260.                         ds1820disp();          //顯示溫度
  261.                         displayxq();         //顯示星期
  262.                                 
  263.                 //=================以下是鬧鐘的相關(guān)處理===================
  264.                         
  265.                         if(ala_flag==1){//鬧鐘標(biāo)志位               
  266.                         set1616pic(6,1,0,2);} //顯示"鬧鐘圖標(biāo)"               
  267.                     else{                                                                                
  268.                         set1616pic(6,1,0,3);}//關(guān)閉"鬧鐘圖標(biāo)"顯示

  269.                         //----------------------------------------
  270.                         tmp=read_clock(0x85);//取出1302小時
  271.                         i = tmp/16;
  272.                         tmp = tmp&0x0f;
  273.                         tmp = tmp + i*10;
  274.                         if(clk_ala[0]==tmp)//與鬧鐘設(shè)定的小時值相同
  275.                                 {
  276.                                 tmp=read_clock(0x83);//取出1302分鐘
  277.                                 i = tmp/16;
  278.                                 tmp = tmp&0x0f;
  279.                                 tmp = tmp + i*10;
  280.                                         if(clk_ala[1]==tmp)//與鬧鐘設(shè)定的分鐘值相同
  281.                                           {
  282.                                                 if(ala_flag==1)//鬧鐘打開
  283.                                                   {
  284.                                                         alarmbeep();//鬧鈴聲響1分鐘后自動關(guān)閉,
  285.                                                         DelayM(200);//控制鬧鐘響的間隔即頻率
  286.                                                    }
  287.                                                 else BEEP=1;//關(guān)閉蜂鳴器
  288.                                            }
  289.                                          else BEEP=1;//關(guān)閉蜂鳴器
  290.                                 }
  291.                         //==============鬧鐘處理結(jié)束=======================
  292.                 }        
  293.                 else {} //========否則啟動調(diào)時=========================


  294. /*---------------按鍵及紅外遙控設(shè)置時間------------------------------*/               
  295.                 if (K1 == 0||key_manue==1)         
  296.                 {                  
  297.                         
  298.                         DelayM(8);                       //按鍵消抖
  299. /*當(dāng)是調(diào)時狀態(tài) 本鍵用于調(diào)整下一項---------------------------------------------------*/               
  300.                         if((K1 == 0 && w == 1)||(key_manue==1&&w==1))      //
  301.                         {
  302.                                        
  303.                                 e++;
  304.                                 if (e >= 8 ) {e = 0;}
  305.                              while(! K1 );            //等待鍵松開
  306.                           key_manue=0;
  307.                                 Set_time(e); beep();          //調(diào)整                                
  308.                         }
  309. /*當(dāng)是正常狀態(tài)時就進(jìn)入調(diào)時狀態(tài)---------------------------------------------------*/               
  310.                         if((K1 == 0 && w == 0)||(key_manue==1&&w==0))  //
  311.                         {        
  312.                                 key_manue=0;
  313.                                 lcm_clr();            
  314.                                 Clean_12864_GDRAM();   //清屏
  315.                                 w=1;                       //進(jìn)入調(diào)時
  316.                                 Set_time(e);beep();
  317.                         }
  318.                            while(K1 == 0);            //等待鍵松開
  319.                 }
  320. /*當(dāng)在調(diào)時狀態(tài)時就退出調(diào)時---------------------------------------------------*/               
  321.                 if (K2 == 0||key_ok==1)                   //
  322.                 {        beep();
  323.                         DelayM(8);
  324.                         if((K2 == 0 && w == 1)||(key_ok==1&&w==1))
  325.                         {                        
  326.                                 w = 0;                       //退出調(diào)時
  327.                                 e = 0;                           //"下一項"計數(shù)器清0                                                               
  328.                         }
  329.                         if((K2 == 0 && w == 0)||(key_ok==1&&w==0))
  330.                         {
  331.                                 lcm_clr(); Clean_12864_GDRAM();
  332.                                 write_com(0x30); write_com(0x06);
  333.                                 welcome();        
  334.                                 while(K2 == 0); //按下K2是顯示歡迎信息
  335.                                 DelayM(500);key_ok=0;//紅外"OK"按鍵按下時顯示0.5秒鐘的歡迎界面2                                 
  336.                         }
  337.                         lcm_clr(); Clean_12864_GDRAM();
  338. //                        ds_write(0x0a,0x20);       //調(diào)時完畢,開啟時鐘振蕩器                                
  339.                         
  340. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

全部資料下載地址:
萬年歷12864 紅外 按鍵.rar (866.48 KB, 下載次數(shù): 337)



評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

板凳
ID:140489 發(fā)表于 2017-7-4 09:23 | 只看該作者
問題解決了,我把32768晶振的匹配電容換成10PF,走時比較準(zhǔn)了,和電腦時間對比幾天下來,1秒不差
回復(fù)

使用道具 舉報

地板
ID:357446 發(fā)表于 2018-6-23 20:53 | 只看該作者

好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

5#
ID:184706 發(fā)表于 2018-6-25 14:59 | 只看該作者
效果看來是很不錯的
回復(fù)

使用道具 舉報

6#
ID:19998 發(fā)表于 2018-11-15 12:30 | 只看該作者
正需要的資料,下載學(xué)習(xí)下
回復(fù)

使用道具 舉報

7#
ID:425056 發(fā)表于 2018-11-27 15:37 | 只看該作者
資料下了,hex文件20多kb,stc89c52寫進(jìn)去根本用不了
回復(fù)

使用道具 舉報

8#
ID:43186 發(fā)表于 2018-11-27 22:10 | 只看該作者
需要的好資料,下載學(xué)習(xí)下,謝謝分享
回復(fù)

使用道具 舉報

9#
ID:149799 發(fā)表于 2018-12-31 13:27 | 只看該作者
學(xué)習(xí)了,謝謝。
回復(fù)

使用道具 舉報

10#
ID:261834 發(fā)表于 2019-3-20 02:48 來自手機 | 只看該作者
完美 :)

IMG_1029.JPG (1.49 MB, 下載次數(shù): 92)

IMG_1029.JPG
回復(fù)

使用道具 舉報

11#
ID:138664 發(fā)表于 2019-3-27 18:42 | 只看該作者
lids 發(fā)表于 2017-7-4 09:23
問題解決了,我把32768晶振的匹配電容換成10PF,走時比較準(zhǔn)了,和電腦時間對比幾天下來,1秒不差[em0 ...

樓主,晶振是多大的?晶振電容是10p嗎?
回復(fù)

使用道具 舉報

12#
ID:140489 發(fā)表于 2019-3-28 16:28 | 只看該作者
親愛的混蛋 發(fā)表于 2019-3-27 18:42
樓主,晶振是多大的?晶振電容是10p嗎?

這電容要根據(jù)你的晶振來調(diào)試的,如果走時慢了,電容就減小,反之走時快了,就加大電容
回復(fù)

使用道具 舉報

13#
ID:498099 發(fā)表于 2019-3-28 20:27 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

14#
ID:324043 發(fā)表于 2019-3-29 12:59 來自手機 | 只看該作者
不錯謝謝樓主分享。
回復(fù)

使用道具 舉報

15#
ID:499931 發(fā)表于 2019-4-9 15:42 | 只看該作者

想問下12864,不停的閃爍,并且時間顯示不動,是什么問題
回復(fù)

使用道具 舉報

16#
ID:140489 發(fā)表于 2019-4-10 11:57 | 只看該作者
嘻哈w 發(fā)表于 2019-4-9 15:42
想問下12864,不停的閃爍,并且時間顯示不動,是什么問題

檢查你的硬件接線是否和這程序里面的端口定義一致,這程序是沒有問題的,
回復(fù)

使用道具 舉報

17#
ID:577490 發(fā)表于 2019-7-8 13:32 | 只看該作者
很強,學(xué)習(xí)了
回復(fù)

使用道具 舉報

18#
ID:17109 發(fā)表于 2019-7-30 11:38 | 只看該作者

分享一下完整源碼可以嗎謝謝
回復(fù)

使用道具 舉報

19#
ID:601770 發(fā)表于 2019-8-28 20:33 | 只看該作者

厲害啊
回復(fù)

使用道具 舉報

20#
ID:125719 發(fā)表于 2019-9-4 08:25 | 只看該作者
這個很厲害了,感謝分享
回復(fù)

使用道具 舉報

21#
ID:105826 發(fā)表于 2019-9-11 16:56 | 只看該作者
好資料,一定要收藏,感謝樓言主無私分享!
回復(fù)

使用道具 舉報

22#
ID:465554 發(fā)表于 2019-10-26 15:45 | 只看該作者
謝謝,我正在跟你做想同的項目
回復(fù)

使用道具 舉報

23#
ID:687162 發(fā)表于 2020-1-18 15:36 | 只看該作者
很需要這份資料,感謝大神!
回復(fù)

使用道具 舉報

24#
ID:96881 發(fā)表于 2020-1-20 13:26 | 只看該作者
謝謝分享,正好有空仿照您的這個電路來制作一個,謝謝
回復(fù)

使用道具 舉報

25#
ID:634466 發(fā)表于 2020-1-29 13:37 | 只看該作者
做得非常漂亮
回復(fù)

使用道具 舉報

26#
ID:575976 發(fā)表于 2020-6-12 00:55 | 只看該作者
不錯,下載下來看看
回復(fù)

使用道具 舉報

27#
ID:517951 發(fā)表于 2020-11-15 17:06 | 只看該作者
不錯,值得學(xué)習(xí)。51hei有你更精彩!!
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 伊人色综合久久天天五月婷 | 成人av网站在线观看 | 成人国产精品久久 | 九九久久精品 | 国产情品 | 欧美成视频 | 性生活毛片 | 午夜一区二区三区在线观看 | 欧美日韩精选 | 日韩精品 电影一区 亚洲 | 一区二区三区高清 | 日韩中文字幕免费在线 | 午夜影院在线观看 | 在线观看成人小视频 | 在线成人av | 91精品国产91久久久久久密臀 | 精品国产伦一区二区三区观看方式 | 国产一区二区三区久久久久久久久 | 午夜电影合集 | 99热在线免费| 午夜一级黄色片 | 天天澡天天操 | 国产一区二区影院 | 欧美爱爱视频网站 | 三级av在线| 中文字幕亚洲一区二区三区 | 成人性生交a做片 | 日韩欧美中文字幕在线观看 | 日韩一区二区三区精品 | 伊人精品在线视频 | 国产精品亚洲视频 | 国产做爰 | 国产精品永久久久久久久www | 亚洲一区免费视频 | 午夜一区 | 91国内精品久久 | 久久久青草婷婷精品综合日韩 | 欧美激情国产日韩精品一区18 | 久久五月婷 | 免费观看羞羞视频网站 | 欧美寡妇偷汉性猛交 |