新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 用定時器中斷設計時鐘,用1602液晶顯示

        用定時器中斷設計時鐘,用1602液晶顯示

        作者: 時間:2016-11-28 來源:網絡 收藏
        時鐘有些功能還未完全實現,僅實現一部分功能,年月日星期功能還未實現 還可以加上整點報時和斷電記憶的功能

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

        #include

        #defineucharunsignedchar

        sbit rd=P2^6;

        sbit wr=P2^5;

        sbit lcde=P2^7;

        sbit k1=P1^0;

        sbit k2=P1^1;

        sbit k4=P1^3;

        sbit k8=P1^7;

        uchar code table1[]=" 2011-10-01SAT";

        uchar code table2[]="00:00:00";

        uchar t,s1num;

        charshi,fen,miao;

        voiddelay(uchar z)//延遲zms函數

        {

        uchar x,y;

        for(x=z;x>0;x--)

        for(y=110;y>0;y--);

        }

        voidwrite_com(uchar com)//液晶寫指令操作

        {

        rd=0;

        wr=0;

        delay(5);

        lcde=1;

        P0=com;

        lcde=0;

        }

        voidwrite_date(uchar date)//液晶寫數據操作

        {

        rd=1;

        wr=0;

        delay(5);

        lcde=1;

        P0=date;

        lcde=0;

        }

        voidwrite_sfm(uchar add,uchar date)//更新時分秒

        {

        uchar shi,ge;

        shi=date/10;

        ge=date;

        write_com(0x80+0x40+add);

        write_date(0x30+shi);

        write_date(0x30+ge);

        }

        voidinit()//初始化函數

        {

        uchar i;

        write_com(0x38);

        write_com(0x0c);

        write_com(0x06);

        write_com(0x01);

        write_com(0x80+0x00);

        for(i=0;i<15;i++)

        write_date(table1[i]);

        write_com(0x80+0x46);

        for(i=0;i<8;i++)

        write_date(table2[i]);

        TMOD=0x01;//定時器工作方式

        TH0=(65536-50000)/256;//設定定時器初值

        TL0=(65536-50000)%6;//12M晶振時ms數為

        EA=1;

        ET0=1;

        TR0=1;

        }

        voidkeyscan()//鍵盤掃描函數

        {

        if(k1==0)//按下k1鍵確定調時分秒

        {

        delay(5);

        if(k1==0)

        {

        s1num++;

        while(!k1)

        ;

        delay(5);

        while(!k1);

        if(s1num==1)

        {

        TR0=0;//暫停計時器

        write_com(0x80+0x4d);//光標在秒的位置閃爍

        write_com(0x0f);

        }

        if(s1num==2)//光標在分的位置

        {

        TR0=0;

        write_com(0x80+0x4a);

        write_com(0x0f);

        }

        if(s1num==3)

        {

        TR0=0;

        write_com(0x80+0x47);

        write_com(0x0f);

        }

        if(s1num==4)//按下第四下時接著走時

        {

        s1num=0;

        write_com(0x0c);

        TR0=1;

        }

        }

        }

        if(s1num!=0)

        {

        if(s1num==1)

        {

        if(k2==0)//按k2鍵秒加

        {

        delay(5);

        if(k2==0)

        {

        while(!k2);

        delay(5);

        while(!k2);

        miao++;

        if(miao==60)

        miao=0;

        write_sfm(0x0c,miao);

        write_com(0x80+0x4d);

        }

        }

        }

        if(s1num==2)

        {

        if(k2==0)//分加

        {

        delay(5);

        if(k2==0)

        {

        while(!k2);

        delay(5);

        while(!k2);

        fen++;

        if(fen==60)

        fen=0;

        write_sfm(0x09,fen);

        write_com(0x80+0x4a);

        }

        }

        }

        if(s1num==3)

        {

        if(k2==0)//時加

        {

        delay(5);

        if(k2==0)

        {

        while(!k2);

        delay(5);

        while(!k2);

        shi++;

        if(shi==24)

        shi=0;

        write_sfm(0x06,shi);

        write_com(0x80+0x47);

        }

        }

        }

        if(k4==0)//判斷k3是否被按下

        {

        delay(5);

        if(k4==0)

        {

        while(!k4);

        delay(5);

        while(!k4);

        if(s1num==1)

        {

        miao--;//秒減

        if(miao==-1)

        miao=59;

        write_sfm(0x0c,miao);

        write_com(0x80+0x4d);

        }

        if(s1num==2)

        {

        fen--;//分減

        if(fen==-1)

        fen=59;

        write_sfm(0x09,fen);

        write_com(0x80+0x4a);

        }

        if(s1num==3)

        {

        shi--;//時減

        if(shi==-1)

        shi=23;

        write_sfm(0x06,shi);

        write_com(0x80+0x47);

        }

        }

        }

        }

        if(k8==0)//按下k8退出調時

        {

        delay(5);

        if(k8==0)

        {

        while(!k8);

        delay(5);

        while(!k8);

        s1num=0;

        write_com(0x0c);

        TR0=1;

        }

        }

        }

        voidmain()

        {

        init();

        while(1)

        {

        keyscan();

        }

        }

        voidtimer0() interrupt 1//中斷服務程序

        {

        TH0=(65536-50000)/256;

        TL0=(65536-50000)%6;//重新設定定時器初值

        t++;

        if(t==20)//定時器中斷次為秒

        {

        t=0;

        miao++;

        if(miao==60)

        {

        miao=0;

        fen++;

        if(fen==60)

        {

        fen=0;

        shi++;

        if(shi==24)

        {

        shi=0;

        }

        write_sfm(0x06,shi);//顯示時

        }

        write_sfm(0x09,fen);//顯示分

        }

        write_sfm(0x0c,miao);//顯示秒

        }

        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 峨眉山市| 云林县| 邵阳县| 石首市| 正镶白旗| 隆林| 滨海县| 乐安县| 舞钢市| 疏附县| 罗山县| 铅山县| 永丰县| 梅州市| 金堂县| 惠州市| 峡江县| 石台县| 神池县| 鹤庆县| 邵阳县| 饶平县| 长兴县| 清苑县| 斗六市| 高密市| 洛扎县| 东海县| 惠州市| 旅游| 鹰潭市| 县级市| 温泉县| 麻江县| 光山县| 平远县| 东方市| 贞丰县| 宁河县| 九台市| 攀枝花市|