不连续IO口矩阵键盘
单片机源程序如下:
- #include "pkey.h"
- #include "delay.h"
- #include "sys.h"
- void HardwareInit(void);
- int main(void)
- {
- HardwareInit();
-
- while(1)
- {
- GetKeyVal();
-
- }
- }
- void HardwareInit(void)
- {
- uart_init(9600); //串口,便于观察
- Key_Config(); //按键初始化
- delay_init(); //延时函数
- }
复制代码- #include "pkey.h"
- #include "delay.h"
- #include "sys.h"
- /**
- ** PB5-PB8,列,输出。 PB10-PB14,行,输入
- **/
- void Key_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);
- GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
-
- /********4行输出*********/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11| GPIO_Pin_12 ;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 ;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- /********4列输入*********/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
- GPIO_Init(GPIOD, &GPIO_InitStructure);
- }
- int KeyScan(void)
- {
- uchar KeyVal;
-
- GPIO_Write(GPIOC, (GPIOC->ODR & 0xE3FF | 0x1C00)); //不管其余12位0xf0ff,先让PC10到PC12全部输出高。
- GPIO_Write(GPIOA, (GPIOA->ODR & 0x7FFF | 0x8000)); //不管其余12位0xf0ff,先让PA15输出高。
- if(((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004))==0x0000) //如果PB12到PB15全为零则没有按键按下
- return -1;
- else
- {
- delay_ms(5); //延时5ms去抖动
- if(((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004))==0x0000)
- return -1;
- }
-
-
- GPIO_Write(GPIOC, (GPIOC->ODR & 0xE3FF | 0x0000)); //不管其余12位0xf0ff,先让PC10到PC12全部输出高。
- GPIO_Write(GPIOA, (GPIOA->ODR & 0x7FFF | 0x8000)); //不管其余12位0xf0ff,先让PA15输出高。
- switch((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004)) //第一行,由低到高,同理,不赘述
- {
- case 0x0004: KeyVal=13; break;
- case 0x0008: KeyVal=12; break;
- case 0x0010: KeyVal=11; break;
- case 0x0020: KeyVal=10; break;
- }
- while((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004) > 0); //等待按键释放
-
- GPIO_Write(GPIOC, (GPIOC->ODR & 0xE3FF | 0x0400)); //不管其余12位0xf0ff,先让PC10到PC12全部输出高。
- GPIO_Write(GPIOA, (GPIOA->ODR & 0x7FFF | 0x0000)); //不管其余12位0xf0ff,先让PA15输出高。
- switch((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004))
- {
- case 0x0004: KeyVal=14; break;
- case 0x0008: KeyVal=9; break;
- case 0x0010: KeyVal=6; break;
- case 0x0020: KeyVal=3; break;
- }
- while((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004) > 0);
-
- GPIO_Write(GPIOC, (GPIOC->ODR & 0xE3FF | 0x0800)); //不管其余12位0xf0ff,先让PC10到PC12全部输出高。
- GPIO_Write(GPIOA, (GPIOA->ODR & 0x7FFF | 0x0000)); //不管其余12位0xf0ff,先让PA15输出高。
- switch((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004))
- {
- case 0x0004: KeyVal=0; break;
- case 0x0008: KeyVal=8; break;
- case 0x0010: KeyVal=5; break;
- case 0x0020: KeyVal=2; break;
- }
- while((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004) > 0);
-
- GPIO_Write(GPIOC, (GPIOC->ODR & 0xE3FF | 0x1000)); //不管其余12位0xf0ff,先让PC10到PC12全部输出高。
- GPIO_Write(GPIOA, (GPIOA->ODR & 0x7FFF | 0x0000)); //不管其余12位0xf0ff,先让PA15输出高。
- switch((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004))
- {
- case 0x0004: KeyVal=15; break;
- case 0x0008: KeyVal=7; break;
- case 0x0010: KeyVal=4; break;
- case 0x0020: KeyVal=1; break;
- }
- // printf("%#x\n ",(GPIOB->IDR & 0x0038));
- // printf("%#x\n ",(GPIOD->IDR & 0x0004));
- // //printf("%#x\n ",(GPIOD->IDR & 0x0004)|(GPIOB->IDR & 0x0038));
- while((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004) > 0);
-
- return KeyVal;
- }
- /************************************
- 按键表盘为: 0 1 2 3
- 4 5 6 7
- 8 9 10 11
- 12 13 14 15
- ************************************/
- void GetKeyVal(void)
- {
- int num;
- num = KeyScan();
- 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 10: printf("10\n"); break;
- case 11: printf("11\n"); break;
- case 12: printf("12\n"); break;
- case 13: printf("13\n"); break;
- case 14: printf("14\n"); break;
- case 15: printf("15\n"); break;
- }
- }
复制代码
所有资料51hei提供下载:
不连续IO口矩阵键盘.rar
(281.38 KB, 下载次数: 11)
|