新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AT89C2051+LCD1602+DS1302實時時鐘設計(c51)

        AT89C2051+LCD1602+DS1302實時時鐘設計(c51)

        作者: 時間:2016-11-10 來源:網絡 收藏
        #include

        #include
        #define uchar unsigned char
        sbit rs=P3^0;//LCD1602控制腳
        sbit rw=P3^1;
        sbit e=P3^2;

        本文引用地址:http://www.104case.com/article/201611/317454.htm

        sbit io=P3^4;//DS1302 PCI總線引腳
        sbit rst=P3^5;
        sbit sclk=P3^3;

        uchar hour,minute,second,year,months,date,day;//顯示時間寄存器
        uchar whour,wminute,wsecond,wyear,wmonths,wdate,wday;//設制初始時間寄存器
        uchar code table1[]="0123456789-:w";
        uchar code table2[]="Date:20";
        uchar code table3[]="Time:";

        void delayms(uchar k)//1ms延時
        {
        uchar j,i;
        for(i=0;ifor(j=0;j<120;j++);
        }

        void delay2us() //2us延時
        {
        _nop_();
        _nop_();
        }

        void write1602_data(uchar dat)//1602寫數據子程序
        {
        rs=1;
        rw=0;
        P1=dat;
        delayms(2);
        e=0;
        e=1;
        e=0;
        }

        void write1602_com(uchar com)//1602寫命令子程序
        //
        {
        rs=0;
        rw=0;
        P1=com;
        delayms(5);
        e=0;
        e=1;
        e=0;
        }

        void init1602()//1602初始化子程序
        {
        write1602_com(0x38);//lcd1602 16*2顯示,5*7點陣,8bit數據接口
        write1602_com(0x0f);//開顯示,顯示光標,光標閃爍
        write1602_com(0x06);//當寫一字符后地址指針加一,光標加一
        write1602_com(0x01);//清屏
        }

        void disptop() //1602第一行顯示子程序
        {
        uchar i;
        write1602_com(0x80);
        for(i=0;i<0x07;i++)
        {
        write1602_data(table2[i]);
        delayms(1);
        }
        }

        void dispbot() //1602第二行顯示子程序
        {
        uchar i;
        write1602_com(0xc0);
        for(i=0;i<0x05;i++)
        {
        write1602_data(table3[i]);
        delayms(1);
        }
        }

        /*******************************************************/

        void write1302byte(uchar dat)//1302寫入一個字節子程序
        {
        uchar i;
        sclk=0;
        for(i=0;i<8;i++)
        {
        io=(bit)(dat&0x01);
        delay2us();
        sclk=1;
        delay2us();
        sclk=0;
        dat=dat>>1;
        }
        }

        uchar read1302byte() //1302讀一個字節子程序
        {
        uchar i,dat;
        for(i=0;i<8;i++)
        {
        dat>>=1;
        if(io)
        dat|=0x80;
        delay2us();
        sclk=1;
        delay2us();
        sclk=0;
        delay2us();
        }
        return dat;
        }

        void writeset1302(uchar add,uchar dat)//1302讀子女程序
        {
        rst=0;
        delay2us();
        rst=1;
        write1302byte(add);
        write1302byte(dat);
        rst=0;
        }

        uchar readset1302(uchar add)//1302寫子程序
        {
        uchar dat;
        rst=0;
        delay2us();
        rst=1;
        write1302byte(add);
        dat=read1302byte();
        rst=0;
        return dat;
        }

        void init1302()//1302初始化子程序
        {
        uchar flag;
        flag=readset1302(0x81);//判斷1302是否有備用電池,若有則FLAG為0
        if(flag&0x80)
        {
        writeset1302(0x8e,0x00);
        writeset1302(0x80,((wsecond/10)<<4|(wsecond%10)));
        writeset1302(0x82,((wminute/10)<<4|(wminute%10)));
        writeset1302(0x84,((whour/10)<<4|(whour%10)));
        writeset1302(0x86,((wday/10)<<4|(wday%10)));
        writeset1302(0x88,((wmonths/10)<<4|(wmonths%10)));
        writeset1302(0x8a,((wdate/10)<<4|(wdate%10)));
        writeset1302(0x8c,((wyear/10)<<4|(wyear%10)));
        writeset1302(0x90,0xa5);
        writeset1302(0x8e,0x80);
        }
        }

        uchar readvalue(uchar value) //數據轉換
        {
        uchar a;
        a=((value&0x70)>>4)*10+(value&0x0f);
        return a;
        }

        void read1302() //讀取時間
        {
        uchar value;
        value=readset1302(0x81);
        second=readvalue(value);

        value=readset1302(0x83);
        minute=readvalue(value);

        value=readset1302(0x85);
        hour=readvalue(value);

        value=readset1302(0x87);
        day=readvalue(value);

        value=readset1302(0x89);
        months=readvalue(value);

        value=readset1302(0x8b);
        date=readvalue(value);

        value=readset1302(0x8d);
        year=((value&0xf0)>>4)*10+(value&0x0f);

        }

        void disptime() //時間顯示
        {
        write1602_com(0x87);
        write1602_data(table1[year/10]);
        write1602_data(table1[year%10]);
        write1602_data(table1[10]);
        write1602_data(table1[months/10]);
        write1602_data(table1[months%10]);
        write1602_data(table1[10]);
        write1602_data(table1[day/10]);
        write1602_data(table1[day%10]);
        write1602_com(0xc5);
        write1602_data(table1[hour/10]);
        write1602_data(table1[hour%10]);
        write1602_data(table1[11]);
        write1602_data(table1[minute/10]);
        write1602_data(table1[minute%10]);
        write1602_data(table1[11]);
        write1602_data(table1[second/10]);
        write1602_data(table1[second%10]);
        write1602_com(0xce);
        write1602_data(table1[12]);
        write1602_data(table1[date]);
        }

        void inittime() //初始時間設置
        {
        whour=23;
        wminute=59;
        wsecond=20;
        wyear=10;
        wmonths=12;
        wdate=3;
        wday=1;
        }

        void main()
        {
        inittime();
        init1602();
        disptop();
        dispbot();
        init1302();
        while(1)
        {
        read1302();
        disptime();
        }
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 石楼县| 肇州县| 海阳市| 吉木萨尔县| 榕江县| 额济纳旗| 株洲市| 五家渠市| 宜丰县| 三原县| 洛隆县| 报价| 冀州市| 胶南市| 舟山市| 土默特左旗| 依安县| 竹溪县| 乐都县| 荣成市| 平潭县| 望谟县| 固原市| 德庆县| 多伦县| 尚志市| 临潭县| 利津县| 哈密市| 宜丰县| 乡城县| 乌兰察布市| 钟山县| 富锦市| 沂水县| 安顺市| 吴忠市| 临汾市| 吴江市| 嘉兴市| 万年县|