色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于PIC16F877A單片機(jī)設(shè)計(jì)的萬年歷程序

          基于PIC16F877A單片機(jī)設(shè)計(jì)的萬年歷程序

          作者: 時(shí)間:2012-11-27 來源:網(wǎng)絡(luò) 收藏

          //-------------------------------------------------
          //啟動(dòng)溫度轉(zhuǎn)換函數(shù)
          void get_temp()
          {
          int i;
          DQ_HIGH();
          reset(); //復(fù)位等待從機(jī)應(yīng)答
          write_byte(0XCC); //忽略ROM匹配
          write_byte(0X44); //發(fā)送溫度轉(zhuǎn)化命令
          for(i=10;i>0;i--)
          {
          delay(201,132); //調(diào)用多次延遲函數(shù),確保溫度轉(zhuǎn)換完成所需要的時(shí)間
          }
          reset(); //再次復(fù)位,等待從機(jī)應(yīng)答
          write_byte(0XCC); //忽略ROM匹配
          write_byte(0XBE); //發(fā)送讀溫度命令
          TLV=read_byte(); //讀出溫度低8
          THV=read_byte(); //讀出溫度高8位
          DQ_HIGH(); //釋放總線
          TZ=(TLV>>4)|(THV4);
          }

          3.日歷顯示程序
          /***************************************************
          * 標(biāo)題:DS1302讀寫 *
          * 作者:Wujieflash *
          * 日期:2008年1月14日 *
          * 說明:日歷顯示范圍:2000年--2099年 *
          ***************************************************/
          #define RST RC0
          #define SCLK RC1
          #define IO RC2
          uch flag=0;
          uch second=1,minute=1,hour=1,year=1,month=1,date=1,day=1;
          uch clock[]={0};
          uch DisCash[]={0x00,0x30,0x09,0x16,0x01,0x03,0x09};
          /////往1302寫入1Byte數(shù)據(jù)////////////////////////
          void RTInputByte(uch d)
          {
          uch i;
          TRISC=0x00;
          for(i=8; i>0; i--)
          {
          IO = d0x01; //取最低位
          SCLK = 1; //上升沿發(fā)送
          SCLK = 0; //恢復(fù)
          d = d >> 1;
          }
          }
          ///////從1302讀取1Byte數(shù)據(jù)////////////////////////
          uch RTOutputByte(void)
          {
          uch i,val=0;
          TRISC2=1; //設(shè)置為輸入
          for(i=8; i>0; i--)
          {
          val = val >>1;
          if(IO)val=val|0x80;// 從最低位開始接收
          SCLK = 1; //下降沿接收
          SCLK = 0;
          }
          return(val);
          }
          ///////先寫地址,后寫命令/數(shù)據(jù)//////////////////////////
          void W1302(uch ucAddr, uch ucDa)
          {
          RST = 0;
          SCLK = 0;
          RST = 1; //打開DS1302
          RTInputByte(ucAddr); // /* 地址,命令 */
          RTInputByte(ucDa); // /* 寫1Byte數(shù)據(jù)*/
          SCLK = 1;
          RST = 0; //關(guān)閉DS1302
          }
          ///////先寫地址,后讀命令/數(shù)據(jù)////////////////////////
          uch R1302(uch ucAddr)
          {
          uch ucData;
          RST = 0;
          SCLK = 0;
          RST = 1;
          RTInputByte(ucAddr); // /* 地址,命令 */
          ucData = RTOutputByte(); // /* 讀1Byte數(shù)據(jù) */
          SCLK = 1;
          RST = 0;
          return(ucData);
          }
          /////////向1302寫入 秒 分 時(shí) 日 月 星期 年 */////////////
          void Set1302(uch *pClock)
          {
          uch i;
          uch ucAddr = 0x80; //起使地址
          W1302(0x8e,0x00); ///* 控制命令,WP=0,允許寫操作*/
          for(i =7; i>0; i--)
          {
          W1302(ucAddr,*pClock); ///* 秒 分 時(shí) 日 月 星期 年 */
          pClock++;
          ucAddr +=2; //寫地址加2
          }
          W1302(0x8e,0x80); // /* 控制命令,WP=1,寫保護(hù)*/
          }
          ////////從1302讀出 秒 分 時(shí) 日 月 星期 年 *//////////////////
          void v_Get1302(unsigned char ucCurtime[])
          {
          unsigned char i;
          unsigned char ucAddr = 0x81;
          for(i=0;i
          /////////與LCD的顯示接口//////////////////////
          void display()
          {
          uch i;
          for(i=0;i

          4.按鍵掃描與服務(wù)程序
          /***************************************************
          * 標(biāo)題:按鍵掃描和服務(wù) *
          * 作者:Wujieflash *
          * 日期:2008年1月17日 *
          * 說明:當(dāng)按鍵按下,選中的單元就會(huì)閃爍 *
          ***************************************************/
          uch k=0;
          //鍵盤初始化子程序
          void keyinit()
          {
          TRISD0=1;
          TRISD0=1;
          TRISD0=1;
          }
          /*----------------------------------------------------------*/
          //鍵盤掃描子程序
          void KeyScan()
          {
          int d;
          if(RD0==0) //設(shè)置鍵按下
          {
          k++; //選定入口值
          k=k%8;
          }
          while(1)
          {
          if(RD0==1)break;//等待按鍵松開
          }
          switch(k)//鍵盤服務(wù)入口
          {
          case 1://設(shè)置秒
          {
          d=R1302(0x81);//讀取秒
          d=d/16*10+d%16;//轉(zhuǎn)換為16進(jìn)制
          second=flag; //設(shè)置秒的閃爍標(biāo)志
          minute=1; //其余變量不閃爍
          hour=1;
          year=1;
          month=1;
          date=1;
          day=1;
          if(second==0) //閃爍
          {
          Show8X16_2(0,111,noshu);
          Show8X16_2(0,119,noshu);
          }
          if(RD1==0) //秒數(shù)值加1
          {
          d++;
          if(d>0x3b)d=0;//大于59就為0
          d=d/10*16+d%10;
          W1302(0x80,d);//寫入DS1302
          while(1)
          {
          if(RD1==1)break;//等待鍵松開
          }
          }
          if(RD2==0)//數(shù)值減1
          {
          d--;
          if(d0x3b)d=0;
          d=d/10*16+d%10;
          W1302(0x82,d);
          while(1)
          {
          if(RD1==1)break;
          }
          }
          if(RD2==0)
          {
          d--;
          if(d0x17)d=0;
          d=d/10*16+d%10;
          W1302(0x84,d);
          while(1)
          {
          if(RD1==1)break;
          }
          }
          if(RD2==0)
          {
          d--;
          if(d0x1f)d=1;
          d=d/10*16+d%10;
          W1302(0x86,d);
          while(1)
          {
          if(RD1==1)break;
          }
          }
          if(RD2==0)
          {
          d--;
          if(d0x0c)d=1;
          d=d/10*16+d%10;
          W1302(0x88,d);
          while(1)
          {
          if(RD1==1)break;
          }
          }
          if(RD2==0)
          {
          d--;
          if(d0x07)d=1;
          d=d/10*16+d%10;
          W1302(0x8a,d);
          while(1)
          {
          if(RD1==1)break;
          }
          }
          if(RD2==0)
          {
          d--;
          if(d0x63)d=0;
          d=d/10*16+d%10;
          W1302(0x8c,d);
          while(1)
          {
          if(RD1==1)break;
          }
          }
          if(RD2==0)
          {
          ……

          5.液晶顯示程序
          /***************************************************
          * 標(biāo)題:LCD操作 *
          * 作者:Wujieflash *
          * 日期:2008年1月12日 *
          * 說明:液晶不帶字庫 *
          ***************************************************/
          #include
          #define E RA0 //液晶使能端
          #define RW RA1 //讀寫控制端
          #define DI RA2 //數(shù)據(jù)/指令通道
          #define CSA RA5 //片選
          #define CSB RA3 //片選
          #define nop() asm("nop")
          ////////////////////////基本子函數(shù)///////////////////////
          //延時(shí)
          void delay(char x,char y)
          {
          char z;
          do{
          z=y;
          do{;}while(--z);
          }while(--x);
          }
          //其指令時(shí)間為:7+(3*(Y-1)+7)*(X-1)如果再加上函數(shù)調(diào)用的call 指令、頁面設(shè)定、傳遞參數(shù)花掉的7 個(gè)指令。
          //則是:14+(3*(Y-1)+7)*(X-1)。
          //--------------------------------------------------
          void LCDdelay()
          {
          unsigned int i=500;
          while(i--)
          {;}
          }
          /*----------------------------------------------------*/
          //狀態(tài)檢查
          void CheckState()
          {
          unsigned int dat;
          RW=1; //讀狀態(tài)
          DI=0;
          TRISB=0xff; //設(shè)置口為輸入
          while(1)
          {
          E=1; //高電平讀數(shù)據(jù)
          dat=PORTB0x90; //當(dāng)4、7位為0時(shí)為正常狀態(tài)
          E=0;
          if(dat==0x00)break;
          }
          TRISB=0x00; //恢復(fù)口為輸出
          }



          關(guān)鍵詞: PIC16F877A 萬年歷 KS0108系列

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉