当前位置:   article > 正文

矩阵键盘控制数码管显示数符

键盘控制数码管显示

读取4x4矩阵键盘,从上到下,从左到右,依次定义为0—9,A—F,按下相应按键,则在8段数码管上显示对应数符

一、硬件原理

在这里插入图片描述

二、代码

main.c

int main()
{
    s16 kval;    
    SysTick_Init();     //初始化系统时钟
    KeyBoard_Init();    //初始化矩阵键盘GPIOA
    NixieTubes_Init();  //使用GPIOD、GPIOE控制数码管
  while(1)
    {
        kval = Read_KeyValue();
      NixieDisplay(kval);   
    }  
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

NixieTubes.c

void NixieTubes_Init(void)
 {

    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE,ENABLE);
    
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Pin = 0xff;//使用Pin0--Pin7
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOD, &GPIO_InitStructure);  //GPIOD作为位选
    GPIO_Init(GPIOE, &GPIO_InitStructure);  //GPIOE作为段选
 }
 
  void NixieDisplay(s16 value)
 {
     //DP G F E D C B A
     //0  0 1 1 1 1 1 1
     //以上为适合共阴接法的 0 的字形码
    u16 num[16] = {0x3f, 0x06, 0x5b, 0x4f, 
                     0x66, 0x6d, 0x7d, 0x07, 
                     0x7f, 0x6F, 0x77, 0x7c, 
                   0x39, 0x5e, 0x79, 0x71};
    s16 j;
    j=value;

    if(j>=0)
    {   
//PD[7..0]对应选择从左到右的8个数码管,低电平选用,高电平禁用        
    GPIOD->ODR = 0xff;//关闭全部显示      
        GPIOE->ODR = ~num[j];//字形表格按共阴接法设计,对于共阳接法,取反使用
        GPIOD->ODR = 0x00;//选择全部管子
        Delay_ms(2);
    }
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

KeyBoardValue.c

#define COL_ALL GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3
#define ROW_ALL GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7

void KeyBoard_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        
    GPIO_InitStructure.GPIO_Pin = COL_ALL;//pa0--pa3对应从左到右四根列线
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//置为推挽输出模式
    GPIO_Init(GPIOA, &GPIO_InitStructure);
        
    GPIO_InitStructure.GPIO_Pin = ROW_ALL;//pa4--pa7对应从上到下四根行线
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//置为下拉输入模式
    GPIO_Init(GPIOA, &GPIO_InitStructure);
        
    GPIO_SetBits(GPIOA, COL_ALL);//列线全部置1
}

/*
   4*4的矩阵键盘
   从上到下,从左到右
   键号依次为0-3,
             4-7,
             8,9,A,B,
             C,D,E,F
*/
s16 Read_KeyValue(void)
{
    s16 KeyValue=-1;//无按键
    if((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f)//列线全部置1后读入的行线值不等于全0,则表明有键按下
    {
        Delay_ms(2);//软件消抖
        if((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f)//延时等待后如果读入的行值仍然不全等于0,则确认有键按下
        {
            GPIO_SetBits(GPIOA, GPIO_Pin_0);//仅第1列列线置1,检查按键是否位于第1列
            GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);//第2、3、4列列线置0
            switch(GPIO_ReadInputData(GPIOA)&0xff)//获取PA口低8位PA[7..4]PA[3..0]
            {
                case 0x11: KeyValue = 0; break;//PA[7..4]PA[3..0]=0001_0001表明第1行第1列之间的按键闭合
                case 0x21: KeyValue = 4; break;//PA[7..4]PA[3..0]=0010_0001表明第2行第1列之间的按键闭合
                case 0x41: KeyValue = 8; break;//PA[7..4]PA[3..0]=0100_0001表明第3行第1列之间的按键闭合
                case 0x81: KeyValue = 0x0C;break;//PA[7..4]PA[3..0]=1000_0001表明第4行第1列之间的按键闭合
            }
            GPIO_SetBits(GPIOA, GPIO_Pin_1);//仅第2列列线置1,检查按键是否位于第2列
            GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_3);//第1、3、4列列线置0
            switch(GPIO_ReadInputData(GPIOA)&0xff)//获取PA口低8位PA[7..4]PA[3..0]
            {
                case 0x12: KeyValue = 1; break;//PA[7..4]PA[3..0]=0001_0010表明第1行第2列之间的按键闭合
                case 0x22: KeyValue = 5; break;//PA[7..4]PA[3..0]=0010_0010表明第2行第2列之间的按键闭合
                case 0x42: KeyValue = 9;break;//PA[7..4]PA[3..0]=0100_0010表明第3行第2列之间的按键闭合
                case 0x82: KeyValue = 0x0D;break;//PA[7..4]PA[3..0]=1000_0010表明第4行第2列之间的按键闭合
            }
            GPIO_SetBits(GPIOA, GPIO_Pin_2);//仅第3列列线置1,检查按键是否位于第3列
            GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3);
            switch(GPIO_ReadInputData(GPIOA)&0xff)
            {
                case 0x14: KeyValue = 2; break;
                case 0x24: KeyValue = 6; break;
                case 0x44: KeyValue = 0x0A;break;
                case 0x84: KeyValue = 0x0E;break;
            }
            GPIO_SetBits(GPIOA, GPIO_Pin_3);//仅第4列列线置1,检查按键是否位于第4列
            GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);
            switch(GPIO_ReadInputData(GPIOA)&0xff)
            {
                case 0x18: KeyValue = 3; break;
                case 0x28: KeyValue = 7; break;
                case 0x48: KeyValue = 0x0B;break;
                case 0x88: KeyValue = 0x0F;break;
            }
            GPIO_SetBits(GPIOA, COL_ALL);//全部列线置1
            while((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f);//等待按键释放
            return KeyValue;
        }
    }
    return -1;//没有键按下
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80

三、照片

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/408832
推荐阅读
相关标签
  

闽ICP备14008679号