美文网首页
1.6矩阵键盘

1.6矩阵键盘

作者: 忘川止 | 来源:发表于2017-07-09 19:53 被阅读0次

    先判断列在判断行


    举个例子 假设 按下 S7 (第一行的第二列)
    P3 = 0xf0; 1111 0000 P3 = 1101 0000
    P3 & 0xf0 舍弃行 保留列 1101 0000 行值
    P3 = cord_l | 0x0f 将 1101 1111 => 1101 1110
    P3 & 0x0f 0000 1110 列值
    行+列
    1101 1110

    #include<reg52.h>
    #define uint unsigned int
    #define uchar unsigned char
    sbit we = P2^7;
    sbit du = P2^6;
    void delay(uint z)
    {
        uint x,y;
        for(x = z; x>0; x--)
            for(y = 114;y>0;y--);
    }
    
    uchar code leddata[]={ 
     
                    0x3F,  //"0"
                    0x06,  //"1"
                    0x5B,  //"2"
                    0x4F,  //"3"
                    0x66,  //"4"
                    0x6D,  //"5"
                    0x7D,  //"6"
                    0x07,  //"7"
                    0x7F,  //"8"
                    0x6F,  //"9"
                    0x77,  //"A"
                    0x7C,  //"B"
                    0x39,  //"C"
                    0x5E,  //"D"
                    0x79,  //"E"
                    0x71,  //"F"
                    0x76,  //"H"
                    0x38,  //"L"
                    0x37,  //"n"
                    0x3E,  //"u"
                    0x73,  //"P"
                    0x5C,  //"o"
                    0x40,  //"-"
                    0x00,  //熄灭
                    0x00  //自定义
     
                             };
    uchar KeyScan()
    {
        uchar cord_l,cord_h;
        P3 = 0xf0;   // 1111 0000
        if((P3&0xf0)!=0xf0)
        {   //判断是否有按键按下
            //自判断高位 
            delay(5); //软件消抖
            if((P3&0xf0)!=0xf0)
            {
                cord_l = P3&0xf0;//这样写不考虑行线
                P3 = cord_l|0x0f;
                cord_h = P3&0x0f; //储存行线值
                while((P3&0x0f)!=0x0f); //判断按完?
                return (cord_l+cord_h);//返回值
            }
        }
    }
    
    void KeyPro()
    {
        switch( KeyScan() )
        {
            //第一行键值码
            case 0xee: P0 = leddata[0];     break;
            case 0xde: P0 = leddata[1];     break;
            case 0xbe: P0 = leddata[2];     break;
            case 0x7e: P0 = leddata[3];     break;
            
            //第二行键值码
            case 0xed: P0 = leddata[4];     break;
            case 0xdd: P0 = leddata[5];     break;
            case 0xbd: P0 = leddata[6];     break;
            case 0x7d: P0 = leddata[7];     break;
    
            //第三行键值码
            case 0xeb: P0 = leddata[8];     break;
            case 0xdb: P0 = leddata[9];     break;
            case 0xbb: P0 = leddata[10];    break;
            case 0x7b: P0 = leddata[11];    break;
    
            //第四行键值码
            case 0xe7: P0 = leddata[12];    break;
            case 0xd7: P0 = leddata[13];    break;
            case 0xb7: P0 = leddata[14];    break;
            case 0x77: P0 = leddata[15];    break;
        }   
    }
    
    int main()
    {
        we = 1;
        P0 = 0x00;
        we = 0;
    
        du = 1;
        P0 = leddata[22];
        while(1)
        {     
            
            KeyPro();
    
        }
        return 0;
    }
    

    switch 按下的按键对应一个数值

    相关文章

      网友评论

          本文标题:1.6矩阵键盘

          本文链接:https://www.haomeiwen.com/subject/ldqehxtx.html