有沒有大佬能不能幫我把這個接地才能用的矩陣按鍵改成上拉電阻可用的!
單片機源程序如下:
- #include "key4_4.h"
- #include "delay.h"
- #include "sys.h"
- //平臺:STM32F103
- //實驗名稱:不連續I/O矩陣鍵盤實驗
- //Author:GXNU_LPK_20512700***
- //使用說明:矩陣鍵盤所用引腳都已經用宏定義定義好了,移植只需根據實際需要在key4_4.c中修改對應的時鐘、引腳和端口即可,其余都不用修改。
- //矩陣鍵盤所用的8個引腳可連續可不連續,看實際需要和個人愛好自己定義。
- int main(void)
- {
- uart_init(9600);
- Key_Init();
- delay_init();
- printf("不連續I/O口矩陣鍵盤測試\r\n");
-
- while(1)
- {
- Key_Test();
- }
- }
復制代碼- #include "key4_4.h"
- #include "delay.h"
- #include "sys.h"
- //8個引腳 4個為行 4個為列
- //行輸出端口定義
- #define X1_GPIO_PORT GPIOA
- #define X2_GPIO_PORT GPIOA
- #define X3_GPIO_PORT GPIOA
- #define X4_GPIO_PORT GPIOB
- //列輸入端口定義
- #define Y1_GPIO_PORT GPIOB
- #define Y2_GPIO_PORT GPIOB
- #define Y3_GPIO_PORT GPIOB
- #define Y4_GPIO_PORT GPIOB
- //行輸出引腳定義
- #define X1_GPIO_PIN GPIO_Pin_11
- #define X2_GPIO_PIN GPIO_Pin_12
- #define X3_GPIO_PIN GPIO_Pin_15
- #define X4_GPIO_PIN GPIO_Pin_3
- //列輸入引腳定義
- #define Y1_GPIO_PIN GPIO_Pin_4
- #define Y2_GPIO_PIN GPIO_Pin_5
- #define Y3_GPIO_PIN GPIO_Pin_6
- #define Y4_GPIO_PIN GPIO_Pin_7
- //行輸出時鐘定義
- #define X1_RCC RCC_APB2Periph_GPIOA
- #define X2_RCC RCC_APB2Periph_GPIOA
- #define X3_RCC RCC_APB2Periph_GPIOA
- #define X4_RCC RCC_APB2Periph_GPIOB
- //列輸入時鐘定義
- #define Y1_RCC RCC_APB2Periph_GPIOB
- #define Y2_RCC RCC_APB2Periph_GPIOB
- #define Y3_RCC RCC_APB2Periph_GPIOB
- #define Y4_RCC RCC_APB2Periph_GPIOB
- //移植代碼只需要修改上面的端口和引腳和時鐘即可,下面的代碼不用修改。
- //矩陣鍵盤所用的8個引腳可連續可不連續,看實際需要和個人愛好自己定義。
- unsigned char Y1,Y2,Y3,Y4;
- void Key_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(X1_RCC|X2_RCC|X3_RCC|X4_RCC|Y1_RCC|Y2_RCC|Y3_RCC|Y4_RCC|RCC_APB2Periph_AFIO, ENABLE);
- GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
-
- /*****************************4行輸出*********************************************/
- GPIO_InitStructure.GPIO_Pin = X1_GPIO_PIN ;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(X1_GPIO_PORT, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = X2_GPIO_PIN ;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(X2_GPIO_PORT, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = X3_GPIO_PIN ;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(X3_GPIO_PORT, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Pin = X4_GPIO_PIN ;
- GPIO_Init(X4_GPIO_PORT, &GPIO_InitStructure);
-
- /**************************************4列輸入*************************************/
- GPIO_InitStructure.GPIO_Pin = Y1_GPIO_PIN ;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(Y1_GPIO_PORT, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = Y2_GPIO_PIN ;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(Y2_GPIO_PORT, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = Y3_GPIO_PIN ;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(Y3_GPIO_PORT, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Pin = Y4_GPIO_PIN;
- GPIO_Init(Y4_GPIO_PORT, &GPIO_InitStructure);
- }
- int Key_Scan(void)
- {
- uchar KeyVal;
- GPIO_SetBits(X1_GPIO_PORT,X1_GPIO_PIN); //先讓X1輸出高
- GPIO_SetBits(X2_GPIO_PORT,X2_GPIO_PIN); //先讓X2輸出高
- GPIO_SetBits(X3_GPIO_PORT,X3_GPIO_PIN); //先讓X3輸出高
- GPIO_SetBits(X4_GPIO_PORT,X4_GPIO_PIN); //先讓X4輸出高
- if((GPIO_ReadInputDataBit(Y1_GPIO_PORT,Y1_GPIO_PIN)|GPIO_ReadInputDataBit(Y2_GPIO_PORT,Y2_GPIO_PIN)|GPIO_ReadInputDataBit(Y3_GPIO_PORT,Y3_GPIO_PIN)|GPIO_ReadInputDataBit(Y4_GPIO_PORT,Y4_GPIO_PIN))==0x0000)
- return -1; //如果X1到X4全為零則沒有按鍵按下
- else
- {
- delay_ms(5); //延時5ms去抖動
- if((GPIO_ReadInputDataBit(Y1_GPIO_PORT,Y1_GPIO_PIN)|GPIO_ReadInputDataBit(Y2_GPIO_PORT,Y2_GPIO_PIN)|GPIO_ReadInputDataBit(Y3_GPIO_PORT,Y3_GPIO_PIN)|GPIO_ReadInputDataBit(Y4_GPIO_PORT,Y4_GPIO_PIN))==0x0000)
- return -1;
- }
-
- GPIO_ResetBits(X1_GPIO_PORT,X1_GPIO_PIN);
- GPIO_ResetBits(X2_GPIO_PORT,X2_GPIO_PIN);
- GPIO_ResetBits(X3_GPIO_PORT,X3_GPIO_PIN);
- GPIO_SetBits(X4_GPIO_PORT,X4_GPIO_PIN);
-
- Y1=GPIO_ReadInputDataBit(Y1_GPIO_PORT,Y1_GPIO_PIN);Y2=GPIO_ReadInputDataBit(Y2_GPIO_PORT,Y2_GPIO_PIN);
- Y3=GPIO_ReadInputDataBit(Y3_GPIO_PORT,Y3_GPIO_PIN);Y4=GPIO_ReadInputDataBit(Y4_GPIO_PORT,Y4_GPIO_PIN);
- if(Y1==1&&Y2==0&&Y3==0&&Y4==0)
- KeyVal='*';
- if(Y1==0&&Y2==1&&Y3==0&&Y4==0)
- KeyVal=0;
- if(Y1==0&&Y2==0&&Y3==0&&Y4==1)
- KeyVal='D';
- if(Y1==0&&Y2==0&&Y3==1&&Y4==0)
- KeyVal='#';
-
- while(((GPIO_ReadInputDataBit(Y1_GPIO_PORT,Y1_GPIO_PIN))|(GPIO_ReadInputDataBit(Y2_GPIO_PORT,Y2_GPIO_PIN))|(GPIO_ReadInputDataBit(Y3_GPIO_PORT,Y3_GPIO_PIN))|(GPIO_ReadInputDataBit(Y4_GPIO_PORT,Y4_GPIO_PIN))) > 0);
- //等待按鍵釋放
- GPIO_SetBits(X1_GPIO_PORT,X1_GPIO_PIN);
- GPIO_ResetBits(X2_GPIO_PORT,X2_GPIO_PIN);
- GPIO_ResetBits(X3_GPIO_PORT,X3_GPIO_PIN);
- GPIO_ResetBits(X4_GPIO_PORT,X4_GPIO_PIN);
-
- Y1=GPIO_ReadInputDataBit(Y1_GPIO_PORT,Y1_GPIO_PIN);Y2=GPIO_ReadInputDataBit(Y2_GPIO_PORT,Y2_GPIO_PIN);
- Y3=GPIO_ReadInputDataBit(Y3_GPIO_PORT,Y3_GPIO_PIN);Y4=GPIO_ReadInputDataBit(Y4_GPIO_PORT,Y4_GPIO_PIN);
- if(Y1==1&&Y2==0&&Y3==0&&Y4==0)
- KeyVal=1;
- if(Y1==0&&Y2==1&&Y3==0&&Y4==0)
- KeyVal=2;
- if(Y1==0&&Y2==0&&Y3==1&&Y4==0)
- KeyVal=3;
- if(Y1==0&&Y2==0&&Y3==0&&Y4==1)
- KeyVal='A';
-
- while(((GPIO_ReadInputDataBit(Y1_GPIO_PORT,Y1_GPIO_PIN))|(GPIO_ReadInputDataBit(Y2_GPIO_PORT,Y2_GPIO_PIN))|(GPIO_ReadInputDataBit(Y3_GPIO_PORT,Y3_GPIO_PIN))|(GPIO_ReadInputDataBit(Y4_GPIO_PORT,Y4_GPIO_PIN))) > 0);
-
- GPIO_ResetBits(X1_GPIO_PORT,X1_GPIO_PIN);
- GPIO_SetBits(X2_GPIO_PORT,X2_GPIO_PIN);
- GPIO_ResetBits(X3_GPIO_PORT,X3_GPIO_PIN);
- GPIO_ResetBits(X4_GPIO_PORT,X4_GPIO_PIN);
-
- Y1=GPIO_ReadInputDataBit(Y1_GPIO_PORT,Y1_GPIO_PIN);Y2=GPIO_ReadInputDataBit(Y2_GPIO_PORT,Y2_GPIO_PIN);
- Y3=GPIO_ReadInputDataBit(Y3_GPIO_PORT,Y3_GPIO_PIN);Y4=GPIO_ReadInputDataBit(Y4_GPIO_PORT,Y4_GPIO_PIN);
- if(Y1==1&&Y2==0&&Y3==0&&Y4==0)
- KeyVal=4;
- if(Y1==0&&Y2==1&&Y3==0&&Y4==0)
- KeyVal=5;
- if(Y1==0&&Y2==0&&Y3==1&&Y4==0)
- KeyVal=6;
- if(Y1==0&&Y2==0&&Y3==0&&Y4==1)
- KeyVal='B';
-
- while(((GPIO_ReadInputDataBit(Y1_GPIO_PORT,Y1_GPIO_PIN))|(GPIO_ReadInputDataBit(Y2_GPIO_PORT,Y2_GPIO_PIN))|(GPIO_ReadInputDataBit(Y3_GPIO_PORT,Y3_GPIO_PIN))|(GPIO_ReadInputDataBit(Y4_GPIO_PORT,Y4_GPIO_PIN))) > 0);
-
- GPIO_ResetBits(X1_GPIO_PORT,X1_GPIO_PIN);
- GPIO_ResetBits(X2_GPIO_PORT,X2_GPIO_PIN);
- GPIO_SetBits(X3_GPIO_PORT,X3_GPIO_PIN);
- GPIO_ResetBits(X4_GPIO_PORT,X4_GPIO_PIN);
- Y1=GPIO_ReadInputDataBit(Y1_GPIO_PORT,Y1_GPIO_PIN);Y2=GPIO_ReadInputDataBit(Y2_GPIO_PORT,Y2_GPIO_PIN);
- Y3=GPIO_ReadInputDataBit(Y3_GPIO_PORT,Y3_GPIO_PIN);Y4=GPIO_ReadInputDataBit(Y4_GPIO_PORT,Y4_GPIO_PIN);
- if(Y1==1&&Y2==0&&Y3==0&&Y4==0)
- KeyVal=7;
- if(Y1==0&&Y2==1&&Y3==0&&Y4==0)
- KeyVal=8;
- if(Y1==0&&Y2==0&&Y3==1&&Y4==0)
- KeyVal=9;
- if(Y1==0&&Y2==0&&Y3==0&&Y4==1)
- KeyVal='C';
- while(((GPIO_ReadInputDataBit(Y1_GPIO_PORT,Y1_GPIO_PIN))|(GPIO_ReadInputDataBit(Y2_GPIO_PORT,Y2_GPIO_PIN))|(GPIO_ReadInputDataBit(Y3_GPIO_PORT,Y3_GPIO_PIN))|(GPIO_ReadInputDataBit(Y4_GPIO_PORT,Y4_GPIO_PIN))) > 0);
-
- return KeyVal;
- }
- /************************************
- 按鍵表盤為: 1 2 3 A
- 4 5 6 B
- 7 8 9 C
- * 0 # D
- ************************************/
- void Key_Test(void)
- {
- int num;
- num = Key_Scan();
- switch(num)
- {
- case 0: printf("0\n"); break;
- case 1: printf("1\n"); break;
- case 2: printf("2\n"); break;
- case 3: printf("3\n"); break;
- case 4: printf("4\n"); break;
- case 5: printf("5\n"); break;
- case 6: printf("6\n"); break;
- case 7: printf("7\n"); break;
- case 8: printf("8\n"); break;
- case 9: printf("9\n"); break;
- case 'A': printf("A\n"); break;
- case 'B': printf("B\n"); break;
- case 'C': printf("C\n"); break;
- case 'D': printf("D\n"); break;
- case '#': printf("#\n"); break;
- case '*': printf("*\n"); break;
- }
- }
復制代碼
所有資料51hei提供下載:
可移植的不連續IO口矩陣鍵盤(接地).7z
(214.93 KB, 下載次數: 8)
2019-12-13 08:55 上傳
點擊文件名下載附件
|