初级会员 
  
	- 积分
 - 161
 
        - 金钱
 - 161 
 
       - 注册时间
 - 2014-12-9
 
      - 在线时间
 - 28 小时
 
 
 
 | 
 
| 
   
 
 
注意:IO口都要上拉。 
 
 
一、IO口设置为开漏输出: 
GPIO_InitTypeDef GPIO_InitStructure; 
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);  
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;  
GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_OD;    
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
GPIO_Init(GPIOA, &GPIO_InitStructure); 
 
二、扫描程序: 
uint8_t KeyScan(void) 
{ 
int tmp; 
    static int KeyConter = 0; 
 int keyval; 
 keyval = 0xFF; 
    if (KeyConter < 1) 
    {//去抖 
                KeyConter++; 
    } 
else  
{ 
keyval = 0xFF; 
GPIO_Write(GPIOA, 0x0F);          //GPIOA低四位置1,既行选全置1 
tmp = (GPIO_ReadInputData(GPIOA) | 0xF0);//读取此时的列选的值 
keyval &= tmp; 
GPIO_Write(GPIOA, 0xF0);//列选全置1 
tmp = (GPIO_ReadInputData(GPIOA) | 0x0F);//读取此时的行选的值 
keyval &= tmp; //两次的结果相与得到是一个唯一值,既一个按键按下只有一个keyval与之对应 
switch (keyval) 
                {                                                   
                case 0xee:    return 1;  
                case 0xde:    return 2; 
                case 0xbe:    return 3; 
                case 0x7e:    return 4;               
                case 0xed:    return 5; 
                case 0xdd:    return 6; 
                case 0xbd:    return 7; 
                case 0x7d:    return 8; 
                case 0xeb:    return 9; 
                case 0xdb:    return 10;	//*  
                case 0xbb:    return 11; 
                case 0x7b:    return 12;  //# 
case 0x77:    return 13; //下一位 
                default:      return 0; 
                }                
 
KeyConter=0; 
} 					   
} 
  |   
 
 
 
 |