STM32 f103 矩阵键盘

#include "stm32f10x.h"
#include "delay.h"
#include "key.h"


void KEY_Init(void) //³õʼ»¯¾ØÕó¼üÅÌҪʹÓõÄGPIO¿Ú¡£
{


 	GPIO_InitTypeDef  GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);


	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //¶¨ÒåPE8µ½PE11ΪÉÏÀ­ÊäÈë¡¢¡¢¡£
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;
    GPIO_Init(GPIOE,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;       //¶¨ÒåPE12µ½PE15ΪÏÂÀ­ÊäÈë¡£
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
    //ÒòΪÉÏÃ涨ÒåÒý½ÅΪÊä³öʱ£¬ÒѾ­´ò¿ªÕû¸öGPIOAµÄʱÖÓÁË£¬
	//ËùÒÔ´Ë´¦²»ÔÙÐèÒªº¯ÊýRCC_APB2PeriphClockCmd()À´´ò¿ªÊ±ÖÓÁË¡£
    GPIO_Init(GPIOE,&GPIO_InitStructure);		
}


int KEY_Scan(void) //ʵÏÖ¾ØÕó¼üÅÌ¡£·µ»ØֵΪ£¬¸÷°´¼üµÄ¼üÖµ£¬´Ë¼üÖµÓÉÓû§×Ô¼º¶¨Òå¡£
{
	u8 KeyVal;	 //keyValΪ×îºó·µ»ØµÄ¼üÖµ¡£
	GPIO_Write(GPIOE,(GPIOE->ODR & 0xf0ff | 0x0f00)); //ÏÈÈÃPB8µ½PB11È«²¿Êä³ö¸ß¡£
	
	if((GPIOE->IDR & 0xf000)==0x0000)  //Èç¹ûPB12µ½PB15ȫΪ0£¬ÔòûÓмü°´Ï¡£´Ëʱ£¬·µ»ØֵΪ-1.
		return -1;
	else
	{	
	    delay_ms(5);    //ÑÓʱ5msÈ¥¶¶¶¯¡£
	    if((GPIOE->IDR & 0xf000)==0x0000)//Èç¹ûÑÓʱ5msºó£¬PB12µ½PB15ÓÖȫΪ0£¬Ôò£¬¸Õ²ÅÒý½ÅµÄµçλ±ä»¯ÊǶ¶¶¯²úÉúµÄ.
	    return -1;
	}


	GPIO_Write(GPIOE,(GPIOE->ODR & 0xf0ff | 0x0100));	//ÈÃPB11µ½PB8Êä³ö¶þ½øÖƵÄ0001.


		switch(GPIOE->IDR & 0xf000)//¶ÔPB12µ½PB15µÄÖµ½øÐÐÅжϣ¬ÒÔÊä³ö²»Í¬µÄ¼üÖµ¡£
			{
				case 0x1000: KeyVal=15; break;
				case 0x2000: KeyVal=11;	break;
				case 0x4000: KeyVal=7;	break;
				case 0x8000: KeyVal=3;	break;
			}
	   
	GPIO_Write(GPIOE,(GPIOE->ODR & 0xf0ff | 0x0200));	//ÈÃPB11µ½PB8Êä³ö¶þ½øÖƵÄ0.
		switch(GPIOE->IDR & 0xf000)		        //¶ÔPB12µ½PB15µÄÖµ½øÐÐÅжϣ¬ÒÔÊä³ö²»Í¬µÄ¼üÖµ¡£
		{
			case 0x1000: KeyVal=14;	break;
			case 0x2000: KeyVal=10;	break;
			case 0x4000: KeyVal=6;	break;
			case 0x8000: KeyVal=2;	break;
		}


	GPIO_Write(GPIOE,(GPIOE->ODR & 0xf0ff | 0x0400));	//ÈÃPB11µ½PB8Êä³ö¶þ½øÖƵÄ1011.
		switch(GPIOE->IDR & 0xf000)		        //¶ÔPB12µ½PB15µÄÖµ½øÐÐÅжϣ¬ÒÔÊä³ö²»Í¬µÄ¼üÖµ¡£
		{
			case 0x1000: KeyVal=13;	break;
			case 0x2000: KeyVal=9;	break;
			case 0x4000: KeyVal=5;	break;
			case 0x8000: KeyVal=1;	break;
		}
 
	 GPIO_Write(GPIOE,(GPIOE->ODR & 0xf0ff | 0x0800));	//ÈÃPB11µ½PB8Êä³ö¶þ½øÖƵÄ0111.
		switch(GPIOE->IDR & 0xf000)		        //¶ÔPB12µ½PB15µÄÖµ½øÐÐÅжϣ¬ÒÔÊä³ö²»Í¬µÄ¼üÖµ¡£
		{
			case 0x1000: KeyVal=12;	break;
			case 0x2000: KeyVal=8;	break;
			case 0x4000: KeyVal=4;	break;
			case 0x8000: KeyVal=0;	break;
		}									  
	return KeyVal;		
}

你可能感兴趣的:(单片机,以及,编程语言)