这是源码
void KeyPortInit(){
//键盘输出口
PG_DDR|=0x03;//PG0 PG1
//PG_CR1|=0x03;//PG0 PG1
PG_CR1&=~(0x03);//PG0 PG1
PG_CR2&=~(0x03);
PC_DDR|=0xC0;//PC7 Pc6
//PC_CR1|=0xC0;//PC7 Pc6
PC_CR1&=~(0xC0);//PC7 Pc6
PC_CR2&=~(0xC0);
//键盘输入口
PC_DDR&=~(0x2E);//PC 12345
PC_CR1|=(0x2E);//PC 12345
//PC_CR1&=~(0x2E);
PC_CR2&=~(0x2E);//PC 12345
//PC_ODR|=(0x2E);//PC 12345
PG_ODR|=0x03;
PC_ODR|=0xC0;
}
u8 KeyScan(){
u8 keyValue=0xFF;//默认键值为0xFF 全为11 也就是没有键被按下
u8 keyValueTmp=0;
//拉低第一引脚
PC_ODR&=~(1<<6);//PC6
Delay_Us(5);
if((PC_IDR&0x2E)!=0x2E){
Delay_Ms(20);//延时8MS
keyValueTmp=PC_IDR&0x2E;
if(keyValueTmp!=0x2E){
//有键被按下
switch(keyValueTmp){
case 0x0E : keyValue='1';
while(1){
if((PC_IDR&0x2E)!=0x0E){
Delay_Ms(20);
if((PC_IDR&0x2E)!=0x0E){
return keyValue;
}
}
}
break;
case 0x26 : keyValue='2';
while(1){
if((PC_IDR&0x2E)!=0x26){
Delay_Ms(20);
if((PC_IDR&0x2E)!=0x26){
return keyValue;
}
}
}
break;
case 0x2A : keyValue='3';
while(1){
if((PC_IDR&0x2E)!=0x2A){
Delay_Ms(20);
if((PC_IDR&0x2E)!=0x2A){
return keyValue;
}
}
}
break;
case 0x2C : keyValue='A';
while(1){
if((PC_IDR&0x2E)!=0x2C){
Delay_Ms(20);
if((PC_IDR&0x2E)!=0x2C){
return keyValue;
}
}
}
break;
}
}
}
//拉高第一引脚
PC_ODR|=(1<<6);//PC6
Delay_Us(5);
//拉低第二引脚
PC_ODR&=~(1<<7);
Delay_Us(5);
if((PC_IDR&0x2E)!=0x2E){
Delay_Ms(20);//延时8MS
keyValueTmp=PC_IDR&0x2E;
if(keyValueTmp!=0x2E){
//有键被按下
switch(keyValueTmp){
case 0x0E : keyValue='4';
//while((PC_IDR&0x3F)==0x0E);
while(1){
if((PC_IDR&0x2E)!=0x0E){
Delay_Ms(20);
if((PC_IDR&0x2E)!=0x0E){
return keyValue;
}
}
}
break;
case 0x26 : keyValue='5';
while(1){
if((PC_IDR&0x2E)!=0x26){
Delay_Ms(20);
if((PC_IDR&0x2E)!=0x26){
return keyValue;
}
}
}
break;
case 0x2A : keyValue='6';
while(1){
if((PC_IDR&0x2E)!=0x2A){
Delay_Ms(20);
if((PC_IDR&0x2E)!=0x2A){
return keyValue;
}
}
}
break;
case 0x2C : keyValue='B';
while(1){
if((PC_IDR&0x2E)!=0x2C){
Delay_Ms(20);
if((PC_IDR&0x2E)!=0x2C){
return keyValue;
}
}
}
break;
}
}
}
//拉高第二引脚
PC_ODR|=(1<<7);
Delay_Us(5);
//拉低第三引脚
PG_ODR&=~(1<<0);//PG0
Delay_Us(5);
if((PC_IDR&0x2E)!=0x2E){
Delay_Ms(20);//延时8MS
keyValueTmp=PC_IDR&0x2E;
if(keyValueTmp!=0x2E){
//有键被按下
switch(keyValueTmp){
case 0x0E : keyValue='7';
//while((PC_IDR&0x3F)==0x0E);
while(1){
if((PC_IDR&0x2E)!=0x0E){
Delay_Ms(20);
if((PC_IDR&0x2E)!=0x0E){
return keyValue;
}
}
}
break;
case 0x26 : keyValue='8';
while(1){
if((PC_IDR&0x2E)!=0x26){
Delay_Ms(20);
if((PC_IDR&0x2E)!=0x26){
return keyValue;
}
}
}
break;
case 0x2A : keyValue='9';
while(1){
if((PC_IDR&0x2E)!=0x2A){
Delay_Ms(20);
if((PC_IDR&0x2E)!=0x2A){
return keyValue;
}
}
}
break;
case 0x2C : keyValue='C';
while(1){
if((PC_IDR&0x2E)!=0x2C){
Delay_Ms(20);
if((PC_IDR&0x2E)!=0x2C){
return keyValue;
}
}
}
break;
}
}
}
//拉高第三引脚
PG_ODR|=(1<<0);//PG0
Delay_Us(5);
//拉低第四引脚
PG_ODR&=~(1<<1);//PG1
Delay_Us(5);
if((PC_IDR&0x2E)!=0x2E){
Delay_Ms(20);//延时8MS
keyValueTmp=PC_IDR&0x2E;
if(keyValueTmp!=0x2E){
//有键被按下
switch(keyValueTmp){
case 0x0E : keyValue='*';
//while((PC_IDR&0x3F)==0x0E);
while(1){
if((PC_IDR&0x2E)!=0x0E){
Delay_Ms(20);
if((PC_IDR&0x2E)!=0x0E){
return keyValue;
}
}
}
break;
case 0x26 : keyValue='0';
while(1){
if((PC_IDR&0x2E)!=0x26){
Delay_Ms(20);
if((PC_IDR&0x2E)!=0x26){
return keyValue;
}
}
}
break;
case 0x2A : keyValue='#';
while(1){
if((PC_IDR&0x2E)!=0x2A){
Delay_Ms(20);
if((PC_IDR&0x2E)!=0x2A){
return keyValue;
}
}
}
break;
case 0x2C : keyValue='D';
while(1){
if((PC_IDR&0x2E)!=0x2C){
Delay_Ms(20);
if((PC_IDR&0x2E)!=0x2C){
return keyValue;
}
}
}
break;
}
}
}
//拉高第四引脚
PG_ODR|=(1<<1);//PG1
return keyValue;
}
|