《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 解決方案 > ST7920液晶---DS1302時鐘程序

ST7920液晶---DS1302時鐘程序

2015-11-04
關鍵詞: DS1302 時鐘程序

//DS1302時鐘程序
//液晶用的ST7920控制芯片的12864       
#include <reg52.h>
#include <intrins.h>
/********************************************************************/
#define  LCD12864_IO  P0
#define  CLERADISPLAY LCD12864_command(0x01);
#define uchar unsigned char
#define uint unsigned int
/********************************************************************/
sbit LCD12864_EN=P2^7;   //E
sbit LCD12864_DIN=P2^5;  // RS
sbit LCD12864_CLK=P2^6;  //RW
sbit DS1302_CLK =P2^0;// P1^0;
sbit DS1302_IO =P2^1;// P1^1;
sbit DS1302_RST =P2^2;// P1^2;
unsigned char time[]={0x10,0x01,0x27,0x03,0x14,0x00,0x00};// 初始化時間年月日星期時分秒     
uchar Display_Buffer[]="12-22-00";//時、分、秒 的格式
uchar riqi[]="11-03-28";//年、月、日 的格式     
uchar xingqi[]="week-3";//星期  
unsigned char second,minute,hour,week,day,month,year;
/********************************************************************/
void LCD12864_busy(void);
void LCD12864_command(unsigned char command);
void LCD12864_data(unsigned char dat);
void LCD12864_address(unsigned char row,unsigned char line);
void LCD12864_string(unsigned char row,unsigned char line,unsigned char *s);
void LCD12864_picture(unsigned char *gImage);
void LCD12864_init(void);
 void LCD12864_char (unsigned char row,unsigned char line,unsigned char a);
/********************************************************************/
 
//
 void delayms(uint k)
 {
uint data i,j;
for(i=0;i<k;i++)
  {
    for(j=0;j<121;j++)
     {;}
   }
 }
void delayus(uchar x)      
 {
    while(--x);
 }

void Mcu_init(void)
{
 
 LCD12864_init();
 
 
 CLERADISPLAY 
 CLERADISPLAY 
 LCD12864_init();
}


 


void Delay(void)
{
 unsigned char i;
     unsigned int j;
 for(i=0;i<200;i++)
  for(j=1000;j>0;j--);
}
 
/*****************************************************************************
函數功能:向DS1302送一字節數據子程序
入口參數:
出口參數:
*****************************************************************************/
void InputByte(unsigned char BYTE)
{
char i;
for(i=8;i>0;i--)
{  //前面在read_ds1302()函數里已經把CLK清0了    
   DS1302_CLK=0;//這里再清0一次,看著清楚。呵呵   
   DS1302_IO=(bit)(BYTE&0x01);//取出低位數據給數據引腳    
    DS1302_CLK=1;//置1,時鐘上升沿,引腳上的數據傳入1302寄存器中   
   BYTE>>=1;//因為這里移位的BYTE不是最后要的結果,雖然最后循環完會多移一位,但沒影響。
 //循環最后一次后,時鐘狀態是高電平。  
}
}


/*****************************************************************************
函數功能:讀DS1302一個字節子程序,讀數據是下降沿讀
入口參數:
出口參數:
*****************************************************************************/
unsigned char OutputByte(void)
{
unsigned char i;
unsigned char ucdat=0;
for(i=8;i>0;i--)
{  //前面時鐘狀態是高電平。  
    ucdat>>=1; //移位注意,移位不能放在循環語句末,否則最后循環完會多移一位。得到結果就錯了。
   DS1302_IO=1;//單片機端置高防止破壞1302傳來的數據,開始接收1302端的高低數據對數據線的改變。    
   DS1302_CLK=0;//緊接著時鐘變低,下降沿數據輸出。 
   if(DS1302_IO)//數據已經輸出,判斷是1還是0.  
   ucdat|=0x80;//如果引腳是高則此位保存1。低不保存,右移的時候自然補0了。  
   DS1302_CLK=1;//讀完一位數據,再置高時鐘,準備讀下一個。   
   _nop_();//延時一下。    
 
}
  //讀完數據還是把時鐘清0,下次好直接用。     
  DS1302_CLK=0;//讀完數據還是把時鐘清0,下次好直接用。   
DS1302_RST=0;
_nop_();
DS1302_CLK=0;
 DS1302_RST=0;
 return(ucdat);


}


/*****************************************************************************
函數功能:向DS1302某地址寫一字節數據子程序
入口參數:addr,TDat
出口參數:
*****************************************************************************/
void write_ds1302(unsigned char addr,unsigned char TDat)
{
   DS1302_RST=0;
   _nop_();
   DS1302_CLK=0;
    _nop_();
   DS1302_RST=1;
    _nop_();
   InputByte(addr);//先寫地址 
   InputByte(TDat);//再寫數據    
 DS1302_IO=1;//單片機端置高防止破壞1302傳來的數據,開始接收1302端的高低數據對數據線的改變。   
 DS1302_RST=0;
   _nop_();
 DS1302_CLK=0;
}


/*****************************************************************************
函數功能:讀DS1302地址子程序   
入口參數:add
出口參數:timedata
*****************************************************************************/
unsigned char read_ds1302(unsigned char addr)
{
unsigned char timedata;
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
InputByte(addr);//先寫入讀命令   
timedata=OutputByte();//再讀出數據    
 DS1302_IO=1;//單片機端置高防止破壞1302傳來的數據,開始接收1302端的高低數據對數據線的改變。   
 DS1302_RST=0;
  _nop_();
 DS1302_CLK=0;
return(timedata);
}


/*****************************************************************************
函數功能:初始化DS1302子程序
入口參數:time[](全局變量)
出口參數:
*****************************************************************************/
void initial_ds1302()
{
 DS1302_IO=1;//單片機端置高防止破壞1302傳來的數據,開始接收1302端的高低數據對數據線的改變。   
 DS1302_RST=0;
 DS1302_CLK=0;
write_ds1302(0x8e,0x00);   //寫保護寄存器,在對時鐘或RAM寫前WP一定要為0
write_ds1302(0x8c,time[0]);   //年 
write_ds1302(0x88,time[1]);   //月 
write_ds1302(0x86,time[2]);   //日 
write_ds1302(0x8A,time[3]);   //星期 
write_ds1302(0x84,time[4]);   //時  
write_ds1302(0x82,time[5]);   //分 
write_ds1302(0x80,time[6]);   //秒  
write_ds1302(0x8e,0x80);   //寫保護寄存器 
}



/*****************************************************************************
函數功能:讀DS1302時間子程序
入口參數:
出口參數:全局變量(second,minute,hour,week,day,month,year)
*****************************************************************************/
void read_time()
{
second=read_ds1302(0x81);   //秒寄存器  
minute=read_ds1302(0x83);   //讀分 
hour=read_ds1302(0x85);    //讀時 
//week=read_ds1302(0x8B);    //讀星期  
//day=read_ds1302(0x87);    //日  
//month=read_ds1302(0x89);   //月  
//year=read_ds1302(0x8d);    //年  
}


void main(void)
{
Mcu_init();
 DS1302_RST=0;
 DS1302_IO=1;
      delayms(1000);
    DS1302_CLK=0;
     delayms(1000);
initial_ds1302();     //初始化DS1302


 Delay();Delay();
 CLERADISPLAY 
  LCD12864_string(1,1,"日期");
 LCD12864_string(2,1,"星期");
 LCD12864_string(3,1,"時間");
 while(1)
 {


    read_time();//讀取時間 
    Display_Buffer[0]=hour/16+'0';//存儲下時的高位進數組
    Display_Buffer[1]=hour%16+'0';//存儲下時的低位進數組
    Display_Buffer[3]=minute/16+'0';//注意+'0'后存儲的是ASCII。用于下面液晶顯示。
    Display_Buffer[4]=minute%16+'0';//注意+'0'后存儲的是ASCII。用于下面液晶顯示。
    Display_Buffer[6]=second/16+'0';
    Display_Buffer[7]=second%16+'0';
 //   riqi[0]=year/16+'0';
 //   riqi[1]=year%16+'0';
 //   riqi[3]=month/16+'0';
 //   riqi[4]=month%16+'0';
  //  riqi[6]=day/16+'0';
 //   riqi[7]=day%16+'0';
  //  xingqi[1]=week%16+'0';


// LCD12864_string(1,3,riqi);//液晶的第1行從第3位開始顯示日期
// LCD12864_string(2,3,xingqi);//液晶的第2行從第3位開始顯示星期
 LCD12864_string(3,3,Display_Buffer);//液晶的第3行從第3列開始顯示時間
 }
}


/*******************************************************************/
void LCD12864_busy(void)
{
    bit BF = 0;
    LCD12864_EN=0;
    LCD12864_DIN=0;
    LCD12864_CLK=1;
    LCD12864_IO=0xff;  //單片機讀數據之前必須先置高位
    do
    {
     LCD12864_EN=1;
        BF=LCD12864_IO&0x80;
        LCD12864_EN=0;
    } while(BF);
   
}
/*******************************************************************/
//          寫入命令 
/*******************************************************************/
void LCD12864_command(unsigned char command)
{
    LCD12864_busy();
    LCD12864_EN=0;
    LCD12864_DIN=0;
    LCD12864_CLK=0; 
   LCD12864_IO=0xff;
    LCD12864_EN=1;
    LCD12864_IO=command;
    LCD12864_EN=0;
}
/*******************************************************************/
//          寫入一字節數據
/*******************************************************************/
void LCD12864_data(unsigned char dat)
{
  
    LCD12864_busy();
    LCD12864_EN=0;
    LCD12864_DIN=1;
    LCD12864_CLK=0;
    LCD12864_IO=0xff;
    LCD12864_EN=1;
    LCD12864_IO=dat;
    LCD12864_EN=0;
}



/*******************************************************************/
//          設置顯示位置    X(1~8),Y(1~4)
/*******************************************************************/
void LCD12864_address(unsigned char row,unsigned char line)
{
    switch(row)
    {
        case 1:LCD12864_command(0x7f + line);
        break;
        case 2:LCD12864_command(0x8f + line);
        break;
        case 3:LCD12864_command(0x87 + line);
        break;
        case 4:LCD12864_command(0x97 + line);
        default:
        break;
    }
}


 /*****************顯示 一個 字符  **************/


  void LCD12864_char (unsigned char row,unsigned char line,unsigned char a)
{
 
    LCD12864_address(row,line);
    LCD12864_data(a);
}


/*******************************************************************/
//          在指定位置顯示字符串
/*******************************************************************/
void LCD12864_string(unsigned char row,unsigned char line,unsigned char *s)
{
    unsigned char LCD12864_temp;
    LCD12864_address(row,line);
    LCD12864_temp=*s;
    while(LCD12864_temp != 0x00)
    {
        LCD12864_data(LCD12864_temp);
        LCD12864_temp=*(++s);
    } 
}


/*******************************************************************/
//          繪制一幅圖片  
/*******************************************************************/
void LCD12864_picture(unsigned char *gImage)
{
    unsigned char X = 0x80,Y = 0x80;
    unsigned char i,j;
    for(i=0;i<64;i++)
    {
        for(j=0;j<16;j++)
        {
            LCD12864_command(0x34);
            LCD12864_command(Y);
            LCD12864_command(X);
            LCD12864_data(*(gImage+i*16+j));      //  low 8 bits
            LCD12864_data(*(gImage+i*16+j+1));    //  high 8 bits
            LCD12864_command(0x36);
            X++;
            j++;
        }
        Y++;
        if(Y>0x9f)
            Y=0x80;
        X=0x80+((i+1)/32)*8;
    }
    LCD12864_command(0x30);
  
}
/*******************************************************************/
//          初始化設置
/*******************************************************************/
void LCD12864_init(void)
{
    CLERADISPLAY      //  clear DDRAM
    LCD12864_command(0x30);     //  8 bits unsigned interface,basic instrument
    LCD12864_command(0x02);     //  cursor return
    LCD12864_command(0x0c);     //  display,cursor on
    LCD12864_command(0x03);  
    LCD12864_command(0x06);
    CLERADISPLAY       //  clear DDRAM
}

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
在线观看91精品国产入口| 亚洲激情在线观看| 久久亚洲欧美| 午夜精品短视频| 亚洲深夜福利网站| 亚洲精选中文字幕| 亚洲激情第一页| 亚洲高清自拍| 亚洲电影自拍| 久久精品2019中文字幕| 新67194成人永久网站| 亚洲欧美综合v| 香港成人在线视频| 亚洲欧美日韩直播| 午夜精品久久久久久久久| 亚洲主播在线播放| 亚洲欧美激情一区| 亚洲欧美日韩高清| 小处雏高清一区二区三区 | 亚洲综合精品自拍| 亚洲一区三区电影在线观看| 亚洲欧美激情一区| 欧美在线精品一区| 亚洲第一天堂av| 91久久精品国产91性色| 亚洲精品国产欧美| 日韩视频在线观看| 亚洲一区久久久| 欧美一区成人| 久久久久久久久一区二区| 久久久青草婷婷精品综合日韩| 久久亚洲春色中文字幕久久久| 久久综合狠狠综合久久激情| 免费欧美日韩| 欧美精品一区二区精品网| 欧美日本一区二区视频在线观看| 性欧美精品高清| 亚洲视频播放| 亚洲男人影院| 久久国产精品99精品国产| 久久精品国产久精国产思思| 久久午夜羞羞影院免费观看| 欧美成人一区二区在线| 欧美久久久久| 国产精品久久久久久久久搜平片| 国产精品一区二区在线观看不卡| 国产一区二区精品久久91| 樱桃成人精品视频在线播放| 亚洲人成在线观看网站高清| av成人黄色| 欧美一级免费视频| 91久久在线视频| 亚洲图片欧美日产| 久久9热精品视频| 免费成人美女女| 欧美性色aⅴ视频一区日韩精品| 国产精品一区二区久久国产| 国产一区日韩欧美| 亚洲人成免费| 亚洲免费一区二区| 亚洲黄色三级| 亚洲五月六月| 久久一区亚洲| 欧美日韩国产不卡| 国产欧美高清| 亚洲国产小视频| 一区二区三欧美| 久久精品首页| 国产精品99久久久久久久久| 久久se精品一区二区| 欧美成人免费观看| 国产精品资源| 91久久中文| 欧美在线高清视频| 一本一本a久久| 久久精品夜色噜噜亚洲aⅴ| 欧美精品粉嫩高潮一区二区| 国产女主播一区| 亚洲啪啪91| 欧美一级一区| 一区二区精品在线观看| 久久久久久久久综合| 国产精品盗摄久久久| 激情亚洲一区二区三区四区| 亚洲性线免费观看视频成熟| 亚洲区在线播放| 欧美亚洲一级| 欧美日韩裸体免费视频| 黑丝一区二区三区| 亚洲欧美国产精品桃花| 99国产精品99久久久久久粉嫩| 久久黄色级2电影| 欧美日韩视频一区二区三区| 亚洲精品美女在线| 亚洲美女免费精品视频在线观看| 亚洲欧美综合另类中字| 一本色道久久综合亚洲精品高清 | 亚洲第一色在线| 一本色道久久综合狠狠躁篇的优点 | 亚洲欧美区自拍先锋| 蘑菇福利视频一区播放| 国产色视频一区| 日韩一二三在线视频播| 久久se精品一区精品二区| 亚洲欧美www| 欧美日产一区二区三区在线观看 | 欧美亚洲三级| 亚洲欧美日韩成人高清在线一区| 欧美精品www在线观看| 狠狠v欧美v日韩v亚洲ⅴ| 午夜精品久久久久久久99黑人| 中国日韩欧美久久久久久久久| 欧美777四色影视在线| 国内精品一区二区| 午夜久久久久| 午夜精品久久| 国产精品久久一级| 一本色道久久88综合日韩精品| 日韩午夜在线观看视频| 蜜桃av噜噜一区| 激情成人在线视频| 久久成人精品视频| 欧美在线视频二区| 国产精品一区亚洲| 亚洲欧美激情一区| 欧美一区二视频在线免费观看| 国产精品久在线观看| 在线中文字幕日韩| 亚洲一区二区三区四区五区午夜| 欧美三级日本三级少妇99| 亚洲九九精品| 亚洲天堂网在线观看| 欧美日韩一区三区四区| 日韩视频免费看| 亚洲少妇自拍| 国产精品福利网站| 亚洲午夜在线| 新狼窝色av性久久久久久| 国产精品一区二区三区四区五区| 亚洲一区免费网站| 欧美伊人影院| 国产一区二区三区在线播放免费观看 | 久久精品一区二区三区中文字幕| 久久久久成人精品免费播放动漫| 国产亚洲欧美另类一区二区三区| 欧美一级成年大片在线观看| 久久理论片午夜琪琪电影网| 激情懂色av一区av二区av| 亚洲第一黄色网| 欧美福利在线| 亚洲精品影视| 亚洲女同精品视频| 国产精品亚洲欧美| 欧美一区二区三区视频在线观看 | 欧美jizz19hd性欧美| 最新国产乱人伦偷精品免费网站 | 一区二区av在线| 国产精品国码视频| 先锋影音国产一区| 六十路精品视频| 日韩午夜中文字幕| 欧美一区1区三区3区公司| 国外视频精品毛片| 亚洲精品视频在线看| 国产精品v欧美精品v日韩| 西西人体一区二区| 欧美电影打屁股sp| 一区二区三区四区国产| 欧美自拍丝袜亚洲| 亚洲人体偷拍| 欧美一区二区三区免费观看视频| 国产综合一区二区| 99re热精品| 国产精品婷婷午夜在线观看| 久久精品毛片| 欧美三级视频在线播放| 欧美一级在线播放| 欧美激情四色| 亚洲欧美日本日韩| 欧美精品三级| 午夜精品电影| 欧美成人日本| 亚洲一区精品在线| 欧美1区2区视频| 亚洲综合大片69999| 男女av一区三区二区色多| 亚洲一区二区成人| 蜜臀99久久精品久久久久久软件| 夜夜狂射影院欧美极品| 久久久免费精品| 一区二区不卡在线视频 午夜欧美不卡' | 国产精品欧美日韩一区二区| 亚洲国产综合91精品麻豆| 国产精品久久久久久久久婷婷| 亚洲激情成人网| 国产欧美日韩不卡| 一本色道久久综合精品竹菊| 韩国精品久久久999| 欧美一区二区三区免费大片| 日韩一区二区福利|