新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 關(guān)于LCD1602顯示可調(diào)時(shí)鐘的程序

        關(guān)于LCD1602顯示可調(diào)時(shí)鐘的程序

        作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò) 收藏

        //奉上,希望對(duì)初學(xué)者有幫助//

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

        #include
        #define uchar unsigned char
        #define uint unsigned int
        sbit lcden=P2^7;
        sbit lcdrs=P2^6;
        sbit W=P2^5;
        sbit k1=P3^0;
        sbit k2=P3^1;
        sbit k3=P3^2;
        uchar num,count,k1num;
        char miao,fen,shi;
        uchar code table[]=" 2015-01-5 SAT" ;
        uchar code table1[]=" 00:00:00";

        void delay(uint z)
        {
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
        }

        void write_com(uchar com) // 寫命令
        {
        W=0;
        lcdrs=0; //RS選擇寫命令還是寫數(shù)據(jù),寫命令
        P0=com; //將寫入的命令送到數(shù)據(jù)總線
        delay(5); //稍作延時(shí)以待數(shù)據(jù)穩(wěn)定
        lcden=1; //使能端給一個(gè)高脈沖,因?yàn)槌跏蓟瘮?shù)已將lcden置為0
        delay(5); //稍作延時(shí)
        lcden=0; //將使能端置0以完成高脈沖
        }

        void write_data(uchar date)
        {
        lcdrs=1;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
        }

        void write_sfm(uchar add,uchar date) //將數(shù)據(jù)寫到某個(gè)地址上
        {
        uchar shi,ge;
        shi=date/10;
        ge=date;
        write_com(0x80+0x40+add); //地址指針指在第二行的第add+1個(gè)
        write_data(0x30+shi); //送數(shù)據(jù),將數(shù)據(jù)data的十位數(shù)送過(guò)去
        write_data(0x30+ge); //送數(shù)據(jù),將數(shù)據(jù)data的個(gè)位數(shù)送過(guò)去
        }

        void keyscan()
        {
        if(k1==0)
        {
        delay(5);
        if(k1==0)//去抖
        {
        k1num++; //計(jì)數(shù),計(jì)算k1按了幾次
        while(!k1); //松手檢測(cè)
        if(k1num==1) //當(dāng)按了一次
        {
        TR0=0; //計(jì)時(shí)器停止,時(shí)間停止
        write_com(0x0f); //開(kāi)顯示,顯示光標(biāo),光標(biāo)閃爍
        write_com(0x80+0x49); //數(shù)據(jù)指針指在第二行秒的個(gè)位
        }

        if(k1num==2) //當(dāng)k1按了兩次
        {

        // write_com(0x0f);
        write_com(0x80+0x46); //數(shù)據(jù)指針指在第二行分的個(gè)位

        }
        if(k1num==3) //當(dāng)k1按了三次
        {
        // write_com(0x0f);
        write_com(0x80+0x43); //數(shù)據(jù)指針指在第二行時(shí)的個(gè)位
        }

        if(k1num==4) //如果被按了四次
        {
        TR0=1; //啟動(dòng)計(jì)時(shí)器
        k1num=0; //清零
        write_com(0x0c); //關(guān)閉光標(biāo)
        }
        // if(k1num==5)
        // {
        // write_com(0x80+0x14)
        // }
        }
        }
        if(k1num!=0) //如果k1已經(jīng)按下過(guò)
        {
        if(k2==0) //如果k2按下
        {
        delay(5);
        if(k2==0)
        {
        while(!k2); //松手檢測(cè)
        if(k1num==1) //當(dāng)k1按了一次,調(diào)秒
        {
        miao++; //每按一次k2秒加一
        if(miao==60)
        {
        miao=0;
        }
        write_sfm(8,miao); //數(shù)據(jù)顯示在第二行第9位和第10位
        write_com(0x80+0x40+9); //k1中已設(shè)置光標(biāo),數(shù)據(jù)指針指在0x48

        }
        if(k1num==2) //如果k1被按過(guò)兩次
        {
        fen++;
        if(fen==60)
        fen=0;
        write_sfm(5,fen); //數(shù)據(jù)送到數(shù)據(jù)指針指在第六位++
        write_com(0x80+0x40+6); //數(shù)據(jù)指針指在第七位
        }
        if(k1num==3) //如果k1被按過(guò)3次
        {
        shi++;
        if(shi==24)
        shi=0;
        write_sfm(2,shi); // 數(shù)據(jù)送到第3++
        write_com(0x80+0x40+3); //地址指針指在第四位
        }

        }
        }
        if(k3==0) //k1按過(guò)后,如果k3按下
        {
        delay(5);
        if(k3==0)
        {
        while(!k3);
        if(k1num==1) //如果k1按下一次
        {
        miao--;
        if(miao==-1)
        {
        miao=59;
        }
        write_sfm(8,miao); //數(shù)據(jù)送到第二行第九位++
        write_com(0x80+0x40+9); //指針指在第十位

        }
        if(k1num==2)
        {
        fen--;
        if(fen==-1)
        fen=59;
        write_sfm(5,fen);
        write_com(0x80+0x40+6);
        }
        if(k1num==3)
        {
        shi--;
        if(shi==-1)
        shi=23;
        write_sfm(2,shi);
        write_com(0x80+0x40+3);
        }
        }
        }
        }
        }


        void init() //初始化函數(shù)
        {
        // dula=0;
        // wela=0;
        lcden=0;
        write_com(0x38); //設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
        write_com(0x0c ); //開(kāi)顯示,不顯示光標(biāo)
        write_com(0x06); //當(dāng)寫一個(gè)數(shù)據(jù)后地址指針加1,且光標(biāo)加1,當(dāng)顯示一個(gè)數(shù)據(jù)時(shí),整屏顯示不移動(dòng)
        write_com(0x01); //數(shù)據(jù)指針清0,顯示清0
        write_com(0x80); //顯示在屏內(nèi)
        TMOD=0x01;
        TH0=(655536-50000)/256;
        TL0=(655536-50000)%6;
        EA=1;
        ET0=1;
        TR0=1;
        }


        void main()
        {
        init(); //初始化
        for(num=0;num<15;num++)
        {
        write_data(table[num]);
        delay(10);
        }

        write_com(0x80+0x40); //開(kāi)始時(shí)第二行顯s
        for(num=0;num<10;num++)
        {
        write_data(table1[num]);
        delay(5);
        }
        while(1)
        {
        keyscan();

        }
        }

        void timer0() interrupt 1
        {
        TH0=(655536-50000)/256;
        TL0=(655536-50000)%6;
        count++;
        if(count==18) //一秒時(shí)間到
        {
        count=0;
        miao++;
        if(miao==60)
        { miao=0;
        fen++;
        if(fen==60)
        {
        fen=0;
        shi++;
        if(shi==24)
        {
        shi=0;
        }
        write_sfm(2,shi);
        }
        write_sfm(5,fen);
        }
        write_sfm(8,miao);
        }
        }



        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 五家渠市| 嘉善县| 两当县| 郴州市| 玉门市| 龙山县| 介休市| 义马市| 西城区| 蓬安县| 和平区| 政和县| 科技| 瓮安县| 吉安市| 溆浦县| 赤水市| 甘德县| 伽师县| 克拉玛依市| 武夷山市| 丹阳市| 柘荣县| 庆安县| 常山县| 信阳市| 绥中县| 临江市| 浮梁县| 车险| 乡城县| 三门县| 健康| 民县| 吉林省| 秭归县| 肥乡县| 鸡西市| 庆阳市| 保定市| 舞钢市|