新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 矩陣鍵盤加電子時鐘(c51)

        矩陣鍵盤加電子時鐘(c51)

        作者: 時間:2016-11-18 來源:網絡 收藏

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

        //矩陣鍵盤掃描和可調的電子時鐘

        //采用翻轉識別法(相對代碼少一些)處理矩陣鍵盤,

        //在按下15號鍵的時候處理電子時鐘,然后可以啟動12號鍵

        //用來調節時間

        #include

        #define uchar unsigned char //類型重定義

        #define uint unsigned int

        uchar key=0;

        uchar count=0;

        int second=40,minute=59,hour=23;

        int second_shi=0,second_ge=0,minute_shi=0,minute_ge=0,hour_shi=0,hour_ge=0;

        uchar flag=0;//定義標志位(判斷15號鍵是不是按下)

        uchar movePlace;//調節時鐘時的定位位置計數

        //以下是定義6個數碼管是否加上小數點

        uchar point0=0;

        uchar point1=0;

        uchar point2=0x80;

        uchar point3=0;

        uchar point4=0x80;

        uchar point5=0;

        //共陰數碼管編碼如下(0-15)

        uchar code table[]={

        0x3f,0x06,0x5b,0x4f,

        0x66,0x6d,0x7d,0x07,

        0x7f,0x6f,0x77,0x7c,

        0x39,0x5e,0x79,0x71};

        //位選編碼(選中第0-7位數碼管)

        uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

        //函數聲明

        void display(uchar Duan_value);//顯示按鍵值函數

        void delay(uchar t);//延時1ms函數

        void key_scan();//按鍵掃描函數

        void display_time();//顯示電子時鐘函數

        void init();//寄存器初始化函數

        void main()

        {

        init();//寄存器初始化

        while(1)

        {

        key_scan();//按鍵掃描

        if(flag==1)//15號鍵按下,處理電子時鐘

        {

        if(movePlace==1)

        {//按鍵定位到秒值位置,對應的秒值小數點亮

        point0=0x80;

        point1=0x80;

        point2=0;

        point3=0;

        point4=0;

        point5=0;

        }

        else if(movePlace==2)

        {//按鍵定位到秒值位置,對應的分值小數點亮

        point0=0;

        point1=0;

        point2=0x80;

        point3=0x80;

        point4=0;

        point5=0;

        }

        else if(movePlace==3)

        {//按鍵定位到秒值位置,對應的小時小數點亮

        point0=0;

        point1=0;

        point2=0;

        point3=0;

        point4=0x80;

        point5=0x80;

        }

        else if(movePlace==0)

        {//按鍵定位歸零,關閉時鐘顯示,回復默認值

        point0=0;//小時與分中間加小數點,分與秒之間加小數點

        point1=0;

        point2=0x80;

        point3=0;

        point4=0x80;

        point5=0;

        }

        display_time();//顯示時鐘值

        }

        else//15號鍵沒有按下

        {

        display(key);//最后一位顯示按鍵值

        }

        }

        }

        //定時器初始化函數

        void init()

        {

        TMOD=0x01;//設定定時器0工作在方式1:16位定時器

        TH0=(65536-50000)/256; //每50ms中斷1次

        TL0=(65536-50000)%256;

        EA=1;//開啟總中斷

        ET0=1;//開啟定時器中斷

        TR0=1;//開啟定時器

        }

        //延時1ms函數

        void delay(uchar t)

        {

        uchar x,y;

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

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

        }

        //按鍵數碼管顯示函數

        void display(uchar value)

        {

        P2=table[value];

        P3=table1[5];//只顯示最后一位

        delay(10);

        }

        //按鍵掃描函數

        void key_scan()

        {

        uchar m0,m1;

        uchar temp;

        P1=0xf0;//這樣設置是為了能使低四位將高四位拉低,釋放時自動拉高高四位

        temp=P1;

        if(temp!=0xf0)

        {

        delay(10);//延時,去除抖動

        if(temp!=0xf0)

        {

        m0=temp;//獲得按鍵的列號(對應的就是高4位)

        P1=0x0f;

        temp=P1;

        if(temp!=0x0f)

        {

        m1=temp;//獲得按鍵的行號(對應的就是低4位)

        temp=m0|m1;//組合成最終的按鍵好

        }

        switch(temp)

        {

        case 0xee:key=0;break;//按鍵對應的碼表

        case 0xde:key=1;break;

        case 0xbe:key=2;break;

        case 0x7e:key=3;break;

        case 0xed:key=4;break;

        case 0xdd:key=5;break;

        case 0xbd:key=6;break;

        case 0x7d:key=7;break;

        case 0xeb:key=8;break;

        case 0xdb:key=9;break;

        case 0xbb:key=10;break;

        case 0x7b:key=11;break;

        case 0xe7:key=12;

        if(flag==1)//15號鍵按下后,12號鍵按下,開始設置時鐘

        {

        TR0=0;//設置時,關閉定時器

        movePlace++;//對應的位置標量+1

        if(movePlace==4)//如果按下了4下,表示取消

        {

        TR0=1;//重新開啟定時器

        movePlace=0;

        flag=0;//關閉時鐘顯示,重新打開按鍵顯示

        }

        }

        break;

        case 0xd7:key=13;

        if(flag==1)//若開始設置時鐘,13鍵表示向上+1按鍵

        {

        if(movePlace==1) //秒值設置

        {

        second++;

        if(second==60)

        second=0;

        }

        else if(movePlace==2) //分值設置

        {

        minute++;

        if(minute==60)

        minute=0;

        }

        else if(movePlace==3)//小時設置

        {

        hour++;

        if(hour==24)

        hour=0;

        }

        }

        break;

        case 0xb7:key=14;

        if(flag==1)//若開始設置時鐘,14鍵表示向上-1按鍵

        {

        if(movePlace==1)//秒值設置

        {

        second--;

        if(second==-1)

        second=59;

        }

        else if(movePlace==2)//分值設置

        {

        minute--;

        if(minute==-1)

        minute=59;

        }

        else if(movePlace==3)//小時設置

        {

        hour--;

        if(hour==-1)

        hour=23;

        }

        }

        break;

        case 0x77:key=15;

        flag=1;//當15號鍵按下去之后,把標志位置1,表示顯示時鐘

        break;

        }

        do{

        temp=P1;//消除按起抖動

        temp&=0X0f;

        }while(temp!=0x0f);

        }

        }

        }

        //顯示電子時鐘函數

        void display_time()

        {

        second_shi=second/10; //分別得到時,分,秒值的個位,十位

        second_ge=second%10;

        minute_shi=minute/10;

        minute_ge=minute%10;

        hour_shi=hour/10;

        hour_ge=hour%10;

        P3=0xff;//消影處理顯示秒值的個位

        P2=table[second_ge]|point0; //是否顯示小數點

        P3=table1[5];

        delay(3);

        P3=0xff;//顯示秒值的十位

        P2=table[second_shi]|point1;

        P3=table1[4];

        delay(3);

        P3=0xff;//顯示分值的個位

        P2=table[minute_ge]|point2;

        P3=table1[3];

        delay(3);

        P3=0xff;//顯示分值的十位

        P2=table[minute_shi]|point3;

        P3=table1[2];

        delay(3);

        P3=0xff;//顯示小時的個位

        P2=table[hour_ge]|point4;

        P3=table1[1];

        delay(3);

        P3=0xff;//顯示小時的十位

        P2=table[hour_shi]|point5;

        P3=table1[0];

        delay(3);

        }

        //定時器0中斷函數

        void time0() interrupt 1using 0

        {

        TH0=(65536-50000)/256;

        TL0=(65536-50000)%256;

        count++;

        if(count==20)

        {

        count=0;

        second++; //定時1s鐘,秒值加1

        if(second==60)

        {

        second=0;

        minute++;//分鐘加1

        if(minute==60)

        {

        minute=0;

        hour++;//小時加1

        if(hour==24)

        {

        hour=0;

        }

        }

        }

        }

        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 清流县| 鹤峰县| 吉木萨尔县| 阿拉善右旗| 称多县| 苍山县| 天等县| 盱眙县| 梧州市| 奎屯市| 景德镇市| 高阳县| 汕尾市| 永昌县| 瓦房店市| 东安县| 德阳市| 津市市| 玉山县| 邵东县| 新干县| 东辽县| 山西省| 襄汾县| 渭源县| 班戈县| 德保县| 大石桥市| 扎兰屯市| 汽车| 阆中市| 怀集县| 临朐县| 正安县| 江源县| 邵阳县| 合山市| 太白县| 娄烦县| 昌图县| 杭州市|