新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 課程設計:矩陣鍵盤(c51,使用掃描法實現)

        課程設計:矩陣鍵盤(c51,使用掃描法實現)

        作者: 時間:2016-11-18 來源:網絡 收藏
        //可以比較一下和以前發表的一篇用反轉法實現的不同(感覺一下那個更簡單)

        //這種方法是用只用P3口的前高四位來比較,看改變了么(由于比較倉促,沒有proteus仿真,不過這是個比較經典的方法,網上有很多這個代碼,源自郭天祥的視頻和書籍)

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

        #include

        #define uchar unsigned char

        #define uint unsigned int

        sbit wela=P2^7;

        sbit dula=P2^6;

        uchar num,num1;

        unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,

        0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

        void delay(uint xms)

        {

        uint x,y;

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

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

        }

        void display(uchar num)

        {

        dula=1;

        P1=table[num];

        dula=0;

        //delay(10);

        }

        void matrixkeyscan()

        {

        uchar temp,key;

        P3=0xfe;//第一行

        temp=P3;

        temp=temp&0xf0;

        if(temp!=0xf0)

        {

        delay(10);

        temp=P3;

        temp=temp&0xf0;

        if(temp!=0xf0)

        {

        temp=P3;

        switch(temp)

        {

        case 0xee:

        key=0;

        break;

        case 0xde:

        key=1;

        break;

        case 0xbe:

        key=2;

        break;

        case 0x7e:

        key=3;

        break;

        }

        while(temp!=0xf0)

        {

        temp=P3;

        temp=temp&0xf0;

        }

        display(key);

        }

        }

        P3=0xfd;//第二行

        temp=P3;

        temp=temp&0xf0;

        if(temp!=0xf0)

        {

        delay(10);

        temp=P3;

        temp=temp&0xf0;

        if(temp!=0xf0)

        {

        temp=P3;

        switch(temp)

        {

        case 0xed:

        key=4;

        break;

        case 0xdd:

        key=5;

        break;

        case 0xbd:

        key=6;

        break;

        case 0x7d:

        key=7;

        break;

        }

        while(temp!=0xf0)

        {

        temp=P3;

        temp=temp&0xf0;

        }

        display(key);

        }

        }

        P3=0xfb;//第三行

        temp=P3;

        temp=temp&0xf0;

        if(temp!=0xf0)

        {

        delay(10);

        temp=P3;

        temp=temp&0xf0;

        if(temp!=0xf0)

        {

        temp=P3;

        switch(temp)

        {

        case 0xeb:

        key=8;

        break;

        case 0xdb:

        key=9;

        break;

        case 0xbb:

        key=10;

        break;

        case 0x7b:

        key=11;

        break;

        }

        while(temp!=0xf0)

        {

        temp=P3;

        temp=temp&0xf0;

        }

        display(key);

        }

        }

        P3=0xf7;//第四行

        temp=P3;

        temp=temp&0xf0;

        if(temp!=0xf0)

        {

        delay(10);

        temp=P3;

        temp=temp&0xf0;

        if(temp!=0xf0)

        {

        temp=P3;

        switch(temp)

        {

        case 0xe7:

        key=12;

        break;

        case 0xd7:

        key=13;

        break;

        case 0xb7:

        key=14;

        break;

        case 0x77:

        key=15;

        break;

        }

        while(temp!=0xf0)

        {

        temp=P3;

        temp=temp&0xf0;

        }

        display(key);

        }

        }

        }

        void main()

        {

        dula=0;

        wela=1;

        P1=0x00;

        wela=0;

        //dula=0;

        while(1)

        {//dula=0;

        matrixkeyscan();

        }

        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 遂川县| 晋中市| 阿城市| 长白| 莎车县| 中山市| 台安县| 武定县| 太仓市| 陇川县| 磐石市| 湄潭县| 朝阳区| 福建省| 利辛县| 武鸣县| 青神县| 湄潭县| 雅安市| 庆城县| 静海县| 定兴县| 巴彦淖尔市| 广安市| 乐业县| 江安县| 莒南县| 长汀县| 长治县| 乃东县| 阳谷县| 花莲市| 毕节市| 高碑店市| 同江市| 仁布县| 虹口区| 宜昌市| 辽源市| 陆河县| 屏东市|