有空做了一个4X4的矩阵键盘
单片机源程序如下:
- #include "key.h"
- #include "Systick.h"
- uint8_t Key_Number=0,column=0;
- //行做输出低电平,列读取电平
- void KEY_L_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APBxPeriphClockCmd (RCC_APB2Periph_GPIOx,ENABLE);
- //列
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空输入
- GPIO_InitStructure.GPIO_Pin=KEY_L0_GPIO_PIN;
- GPIO_Init(KEY_L0_PORN,&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin=KEY_L1_GPIO_PIN;
- GPIO_Init(KEY_L1_PORN,&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin=KEY_L2_GPIO_PIN;
- GPIO_Init(KEY_L2_PORN,&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin=KEY_L3_GPIO_PIN;
- GPIO_Init(KEY_L3_PORN,&GPIO_InitStructure);
-
-
- //行
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Pin=KEY_R0_PIN;
- GPIO_Init(KEY_R0_PORN,&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin=KEY_R1_PIN;
- GPIO_Init(KEY_R1_PORN,&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin=KEY_R2_PIN;
- GPIO_Init(KEY_R2_PORN,&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin=KEY_R3_PIN;
- GPIO_Init(KEY_R3_PORN,&GPIO_InitStructure);
-
- }
- //列做输出高电平,行读取电平
- void KEY_R_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APBxPeriphClockCmd (RCC_APB2Periph_GPIOx,ENABLE);
- //列
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Pin=KEY_L0_GPIO_PIN;
- GPIO_Init(KEY_L0_PORN,&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin=KEY_L1_GPIO_PIN;
- GPIO_Init(KEY_L1_PORN,&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin=KEY_L2_GPIO_PIN;
- GPIO_Init(KEY_L2_PORN,&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin=KEY_L3_GPIO_PIN;
- GPIO_Init(KEY_L3_PORN,&GPIO_InitStructure);
-
- //行
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空输入
- GPIO_InitStructure.GPIO_Pin=KEY_R0_PIN;
- GPIO_Init(KEY_R0_PORN,&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin=KEY_R1_PIN;
- GPIO_Init(KEY_R1_PORN,&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin=KEY_R2_PIN;
- GPIO_Init(KEY_R2_PORN,&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin=KEY_R3_PIN;
- GPIO_Init(KEY_R3_PORN,&GPIO_InitStructure);
- }
- void Keyboard_Scanning (void)
- {
- KEY_L_Init(); //行做输出低电平,列读取电平
- L_KEY_R0; //各行输出低电平
- L_KEY_R1;
- L_KEY_R2;
- L_KEY_R3;
-
- if(KEY_L0==0)column=1; //如果第一列读到低电平
- if(KEY_L1==0)column=2; //如果第二列读到低电平
- if(KEY_L2==0)column=3; //如果第三列读到低电平
- if(KEY_L3==0)column=4; //如果第四列读到低电平
-
- if(column==1) //如果第一列读到低电平
- {
- KEY_R_Init(); //列做输出高电平,行读取电平
- H_KEY_L0; //第一列输出高电平
- SysTick_Delay_us(5);
- if(KEY_R0==1)Key_Number=1; //第一行
- if(KEY_R1==1)Key_Number=2; //第二行
- if(KEY_R2==1)Key_Number=3; //第三行
- if(KEY_R3==1)Key_Number=4; //第四行
- }
- if(column==2) //如果第二列读到低电平
- {
- KEY_R_Init();
- H_KEY_L1; //第二列输出高电平
- SysTick_Delay_us(5);
- if(KEY_R0==1)Key_Number=5;
- if(KEY_R1==1)Key_Number=6;
- if(KEY_R2==1)Key_Number=7;
- if(KEY_R3==1)Key_Number=8;
- }
-
- if(column==3) //如果第三列读到低电平
- {
- KEY_R_Init();
- H_KEY_L2; //第三列输出高电平
- SysTick_Delay_us(5);
- if(KEY_R0==1)Key_Number=9;
- if(KEY_R1==1)Key_Number=10;
- if(KEY_R2==1)Key_Number=11;
- if(KEY_R3==1)Key_Number=12;
- }
-
- if(column==4) //如果第四列读到低电平
- {
- KEY_R_Init();
- H_KEY_L3; //第四列输出高电平
- SysTick_Delay_us(5);
- if(KEY_R0==1)Key_Number=13;
- if(KEY_R1==1)Key_Number=14;
- if(KEY_R2==1)Key_Number=15;
- if(KEY_R3==1)Key_Number=16;
- }
- column=0; //列标记清零
- }
复制代码
所有资料51hei提供下载:
4x4矩形键盘.7z
(182.31 KB, 下载次数: 22)
|