<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 51單片機(jī)+帶字庫液晶12864+DS1302數(shù)字時鐘C源程序

          51單片機(jī)+帶字庫液晶12864+DS1302數(shù)字時鐘C源程序

          作者: 時間:2016-12-03 來源:網(wǎng)絡(luò) 收藏
          經(jīng)過兩天的搜索與調(diào)試,在別人程序的基礎(chǔ)上,不斷修改,終于調(diào)試成功了這個程序。

          目前還不能修改時間與日期,只是以預(yù)定時間以始。

          本文引用地址:http://www.ex-cimer.com/article/201612/325258.htm

          適用于開發(fā)板:51單片機(jī)(AT89S52)+帶字庫液晶12864(ST7920)+DS1302(實(shí)時時鐘)

          實(shí)現(xiàn)功能:簡單,數(shù)字時鐘+日期(以后會不斷完美)。

          C語言源程序如下:

          #include
          #include
          #define uchar unsigned char
          #define uint unsigned int

          /*DS1302 端口設(shè)置 */
          sbit SCK=P3^6; //DS1302時鐘
          sbit SDA=P3^4; //DS1302 IO
          sbit RST = P3^5; // DS1302復(fù)位

          bit ReadRTC_Flag; //讀DS1302全局變量

          /* 12864端口定義*/
          #define LCD_data P0 //帶字庫液晶12864數(shù)據(jù)口
          sbit LCD_RS = P2^4; //寄存器選擇輸入
          sbit LCD_RW = P2^5; //液晶讀/寫控制
          sbit LCD_EN = P2^6; //液晶使能控制
          sbit PSB=P2^1; //并口控制
          sbit RES=P2^3;


          uchar code dis1[] = {" 電子設(shè)計天地"}; //液晶顯示的漢字

          uchar code dis2[] = {"有志者,事竟成!"};
          uchar code dis4[] = {0,1,2,3,4,5,6,7,8,9};
          unsigned char temp;
          #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
          void lcd_pos(uchar X,uchar Y); //確定顯示位置

          unsigned char l_tmpdate[7]={0,7,16,19,10,1,9};//秒分時日月周年09-10-19 16:07:00

          code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分時日月周年 最低位讀寫位
          code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
          void Write_Ds1302_byte(unsigned char temp);
          void Write_Ds1302( unsigned char address,unsigned char dat );
          unsigned char Read_Ds1302 ( unsigned char address );
          void Read_RTC(void);//read RTC
          void Set_RTC(void); //set RTC
          void InitTIMER0(void);//inital timer0


          /*******************************************************************/
          /* */
          /* 延時函數(shù) */
          /* */
          /*******************************************************************/

          void delay(unsigned int m) //延時程序
          {
          unsigned int i,j;
          for(i=0;i for(j=0;j<10;j++);
          }

          /*******************************************************************/
          /* */
          /*檢查LCD忙狀態(tài) */
          /*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數(shù)據(jù)。 */
          /* */
          /*******************************************************************/
          bit lcd_busy()
          {
          bit result;
          LCD_RS = 0;
          LCD_RW = 1;
          LCD_EN = 1;
          delayNOP();
          result = (bit)(P0&0x80);
          LCD_EN = 0;
          return(result);
          }
          /*******************************************************************/
          /* */
          /*寫指令數(shù)據(jù)到LCD */
          /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */
          /* */
          /*******************************************************************/
          void lcd_wcmd(uchar cmd)
          {
          while(lcd_busy());
          LCD_RS = 0;
          LCD_RW = 0;
          LCD_EN = 0;
          _nop_();
          _nop_();
          P0 = cmd;
          delay(1);
          LCD_EN = 1;
          delay(1);
          LCD_EN = 0;
          }
          /*******************************************************************/
          /* */
          /*寫顯示數(shù)據(jù)到LCD */
          /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。 */
          /* */
          /*******************************************************************/
          void lcd_wdat(uchar dat)
          {
          while(lcd_busy());
          LCD_RS = 1;
          LCD_RW = 0;
          LCD_EN = 0;
          P0 = dat;
          delayNOP();
          LCD_EN = 1;
          delay(1);
          LCD_EN = 0;
          }
          /*******************************************************************/
          /* */
          /* LCD初始化設(shè)定 */
          /* */
          /*******************************************************************/
          void lcd_init()
          {
          P0=0xFF;
          P2=0xFF;

          delay(40);
          PSB=1; //并口方式。
          delay(1);
          RES=0;
          delay(1);
          RES=1;

          delay(10);
          lcd_wcmd(0x30);
          delay(100);
          lcd_wcmd(0x30);
          delay(37);
          lcd_wcmd(0x08);
          delay(100);
          lcd_wcmd(0x10);
          delay(100);
          lcd_wcmd(0x0C); //顯示開,關(guān)光標(biāo)
          delay(100);
          lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容
          delay(100);
          lcd_wcmd(0x06);
          delay(100);

          }


          void main()
          {
          uchar i;
          InitTIMER0();
          Set_RTC();
          lcd_init();



          //初始化LCD
          while(1)
          {
          if(ReadRTC_Flag)
          {
          ReadRTC_Flag=0;
          Read_RTC();
          lcd_pos(0,0); //設(shè)置顯示位置為第一行的第1個字符
          i = 0;
          while(dis1[i] != 看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();