大学生
最后登录1970-1-1
在线时间 小时
注册时间2016-7-20
|
借鉴水友,并仿照,写的两种,保证已经实现。第一种其实也是4*4 只是将另外一行删除了 做成了4行3列
- #include "KEY.h"
- #include "delay.h"
- void KEY_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//áD
- 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_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//DD
- GPIO_Init(GPIOB,&GPIO_InitStructure);
- }
- int KEY_Scan(void)
- {
- u8 KeyVal=16;
- GPIO_Write(GPIOB,((GPIOB->ODR & 0xfff0) | 0x000f));
-
- if((GPIOB->IDR & 0xf000)==0x0000)
- return -1;
- else
- {
- delay_ms(5);
- if((GPIOB->IDR & 0xf000)==0x0000)
- return -1;
- }
- GPIO_Write(GPIOB,((GPIOB->ODR & 0xfff0) | 0x0001));
- switch(GPIOB->IDR & 0xf000)
- {
- case 0x1000: KeyVal=15; break;
- case 0x2000: KeyVal=11; break;
- case 0x4000: KeyVal=7; break;
- case 0x8000: KeyVal=3; break;
- }
- while((GPIOB->IDR & 0xf000)!=0x0000);
-
- GPIO_Write(GPIOB,((GPIOB->ODR & 0xfff0) | 0x0002));
- switch(GPIOB->IDR & 0xf000)
- {
- case 0x1000: KeyVal=14; break;
- case 0x2000: KeyVal=10; break;
- case 0x4000: KeyVal=6; break;
- case 0x8000: KeyVal=2; break;
- }
- while((GPIOB->IDR & 0xf000)!=0x0000);
- GPIO_Write(GPIOB,((GPIOB->ODR & 0xfff0) | 0x0004));
- switch(GPIOB->IDR & 0xf000)
- {
- case 0x1000: KeyVal=13; break;
- case 0x2000: KeyVal=9; break;
- case 0x4000: KeyVal=5; break;
- case 0x8000: KeyVal=1; break;
- }
- while((GPIOB->IDR & 0xf000)!=0x0000);
-
- return KeyVal;
- }
复制代码 第二种4*4
- #include "KeyScan.h"
- #include "rs232.h"
- void Delay_ms(int xms)
- {
- u32 i,j;
- for(i=xms;i>0;i--)
- for(j=72000;j>0;j--);
- }
- void Scan_GPIO_Config(void)
- {
-
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
-
- GPIO_SetBits(GPIOC, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3); //éèÖÃDDÎa¸ßμçƽ
- GPIO_ResetBits(GPIOC, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7); //éèÖÃáDÎaμíμçƽ
- }
-
- void Read_KeyValue(void)
- {
- u8 KeyValue=0;
- if((GPIO_ReadInputData(GPIOC)&0xFF)!=0x0F) //è¡GPIOCμíáùλμçƽÖ죬ÅD¶Ï°′¼üêÇ·ñ°′ÏÂ
- {
- Delay_ms(8); //Ñóê±Ïû¶¶£¬¸ÃÑóê±oˉêyêÇèí¼tÑóê±£¬·Ç×¼è·Ñóê±
- if((GPIO_ReadInputData(GPIOC)&0xFF)!=0x0F) //Ôù′ÎÅD¶Ï°′¼üêÇ·ñ°′ÏÂ
- {
-
- GPIO_SetBits(GPIOC, GPIO_Pin_0); //éèÖÃμúò»DDÎa ¸ßμçƽ£¬ÆäËüDDÎaμíμçƽ£¬í¨1yé¨Ã裬¿éòÔÅD¶ÏÄÇò»áD3öÏÖ¸ßμçƽ
- GPIO_ResetBits(GPIOC, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
- switch(GPIO_ReadInputData(GPIOC)&0xFF) //è¡GPIOCμíáùλμçƽÖ죬ÅD¶ÏÄÇò»°′¼ü°′ÏÂ
- {
- case 0x11: KeyValue = 1; break; // 0001 1001
- case 0x21: KeyValue = 4; break; // 0010 0001
- case 0x41: KeyValue = 7; break; // 0100 0001
- case 0x81: KeyValue = 10; break; // 1000 0001
- }
-
- GPIO_SetBits(GPIOC, GPIO_Pin_1);
- GPIO_ResetBits(GPIOC, GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_3);
- switch(GPIO_ReadInputData(GPIOC)&0xFF) //è¡GPIOCμíáùλμçƽÖ죬ÅD¶ÏÄÇò»°′¼ü°′ÏÂ
- {
- case 0x12: KeyValue = 2; break; // 0001 0010
- case 0x22: KeyValue = 5; break; // 0001 0010
- case 0x42: KeyValue = 8; break; // 0100 0010
- case 0x82: KeyValue = 11; break; // 1000 0010
- }
-
- GPIO_SetBits(GPIOC, GPIO_Pin_2);
- GPIO_ResetBits(GPIOC, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3);
- switch(GPIO_ReadInputData(GPIOC)&0xFF) //è¡GPIOCμíáùλμçƽÖ죬ÅD¶ÏÄÇò»°′¼ü°′ÏÂ
- {
- case 0x14: KeyValue = 3; break; // 0001 0100
- case 0x24: KeyValue = 6; break; // 0010 0100
- case 0x44: KeyValue = 9; break; // 0100 0100
- case 0x84: KeyValue = 12; break; // 1000 0100
- }
-
- GPIO_SetBits(GPIOC, GPIO_Pin_3);
- GPIO_ResetBits(GPIOC, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);
- switch(GPIO_ReadInputData(GPIOC)&0xFF) //è¡GPIOCμíáùλμçƽÖ죬ÅD¶ÏÄÇò»°′¼ü°′ÏÂ
- {
- case 0x18: KeyValue = 13; break; // 0001 1000
- case 0x28: KeyValue = 14; break; // 0010 1000
- case 0x48: KeyValue = 15; break; // 0100 1000
- case 0x88: KeyValue = 16; break; // 1000 1000
- }
-
- GPIO_SetBits(GPIOC, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
- GPIO_ResetBits(GPIOC, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
-
- while((GPIO_ReadInputData(GPIOC)&0xFF)!=0x0F); //μè′y°′¼üËé¿a
-
- printf("°′ÏÂμļüÖμ:%d\n",KeyValue);
- }
- }
- }
复制代码
|
|