C51 矩阵按键 个人笔记

矩阵按键

电路

C51 矩阵按键 个人笔记_第1张图片

每个按键一端和同行一端相连(JP4的高4位),另一端和同列一端相连(JP4的低4位)

判断按键是否按下:

法一:逐行扫描

for(int i = 8 ; i>3 ; i-- )
    {
        JP4^i = 0;
        If ( 低四位不全为1)
            低四位为0的那一列,第i行 的按键被按下
}

法二:行列扫描

完整代码:

#include 
typedef unsigned int u16;        
typedef unsigned char u8;
#define delaytime 50000000
#define GPIO_DIG P0
#define GPIO_KEY P1
                              
//这里用的静态数码管是共阳的

 //RAM 占用少,存在flash 里面:code
 //共阴的表
u8 code ledSegment  [16] = {0x3f,   0x06,   0x5b,   0x4f,   0x66,   0x6d,
                        0x7d,   0x07,   0x7f,   0x6f,   0x77,
                        0x7c,   0x39,   0x5e,   0x79,   0x71};
u8 KeyValue=0;
void delay(u16 i)
{
    while(i--);
}
void KeyDown()
{
    char a = 0;
    GPIO_KEY = 0x0f;  //高四位低电平,第四位高电平
    if(GPIO_KEY!= 0x0f)
    {
        delay(1000);
        if(GPIO_KEY!= 0x0f)
        {
            //--------------------------求列数----------------------------------//
            switch(GPIO_KEY)
            {
                case(0x07):  KeyValue = 0; break;       //0000 0111  : 第一列
                case(0x0b):  KeyValue = 1; break;       //0000 1011  : 第二列
                case(0x0d):  KeyValue = 2; break;       //0000 1101  : 第三列
                case(0x0e):  KeyValue = 3; break;       //0000 1110  : 第四列
            }
            //--------------------------求行数----------------------------------//
            GPIO_KEY = 0xf0;  //高四位高电平,第四位低电平   
            switch(GPIO_KEY)
            {
                case(0x70):  KeyValue += 0; break;    //第一行 
                case(0xb0):  KeyValue += 4; break;      
                case(0xd0): KeyValue += 8; break;       
                case(0xe0):  KeyValue += 12; break;     //第四行
            }
            //退出条件:按键松开或超过
            while((a<50)&&(GPIO_KEY!= 0xf0))         //   GPIO_KEY!= 0xf0 说明按键还没松
            {
                delay(1000);
                a++; 
            }
        }
    }
}

void main(void)
{
    
    while(1)
    {
         KeyDown();
         //KeyValue = 1;
         GPIO_DIG = ~ledSegment[KeyValue];
    }
}

接线

在普中科技的开发试验仪上,注意矩阵按键和P1端口的排线要反接,同事可能要拔掉74HC165上的短接片
C51 矩阵按键 个人笔记_第2张图片

你可能感兴趣的:(C51 矩阵按键 个人笔记)