?? key.c
字號:
#define KEY_C
#include "includes.h"
char read_keybord(void)
{
static char key_state = 0;
static char key_value, key_line;
static char key_return = NO_KEY;
unsigned char i;
switch(key_state)
{
case 0:
// #ifdef KEY_4X4
// key_line = 0x10; // 0b0001 0000;
//#else
key_line = 0x08; //0b0000 1000;
//#endif
for(i=1;i<=4;i++) //按鍵掃描
{
KEY_PORT = ~key_line; //輸出行線電平
KEY_PORT = ~key_line; //輸出兩次
//delay_nms(2);
key_value = KEY_MASK & KEY_PIN; //讀列電平
if(key_value == KEY_MASK)
{
key_line <<= 1; //沒有按鍵,繼續掃描
//delay_nms(2);
}
else
{
key_state++; //有鍵按下,停止掃描
break; //轉消抖確認狀態
}
}
break;
case 1:
//if((key_value == KEY_MASK & KEY_PIN)) //再次讀列電平
{
//#ifdef KEY_4X4
/* switch((key_value | key_line)) //與狀態0相同,確認按鍵
{
case 0x1e: //0b00011110:
key_return = K1_1;
break;
case 0x1d: //0b00011101:
key_return = K1_2;
break;
case 0x1b: //0b00011011:
key_return = K1_3;
break;
case 0x17: //0b00010111:
key_return = K1_4;
break;
case 0x2e: //0b00101110:
key_return = K2_1;
break;
case 0x2d: //0b00101101:
key_return = K2_2;
break;
case 0x2b: //0b00101011:
key_return = K2_3;
break;
case 0x27: //0b00100111:
key_return = K2_4;
break;
case 0x4e: //0b01001110:
key_return = K3_1;
break;
case 0x4d: //0b01001101:
key_return = K3_2;
break;
case 0x4b: //0b01001011:
key_return = K3_3;
break;
case 0x47: //0b01000111:
key_return = K3_4;
break;
case 0x8e: //0b10001110:
key_return = K4_1;
break;
case 0x8d: //0b10001101:
key_return = K4_2;
break;
case 0x8b: //0b10001011:
key_return = K4_3;
break;
case 0x87: //0b10000111:
key_return = K4_4;
break;
} */
// #else
switch((key_value | key_line)) //與狀態0相同,確認按鍵
{
case 0x0e: //0b00001110:
key_return = K1_1;
break;
case 0x0d: //0b00001101:
key_return = K1_2;
break;
case 0x0b: //0b00001011:
key_return = K1_3;
break;
case 0x16: //0b00010110:
key_return = K2_1;
break;
case 0x15: //0b00010101:
key_return = K2_2;
break;
case 0x13: //0b00010011:
key_return = K2_3;
break;
case 0x26: //0b00100110:
key_return = K3_1;
break;
case 0x25: //0b00100101:
key_return = K3_2;
break;
case 0x23: //0b00100011:
key_return = K3_3;
break;
case 0x46: //0b01000110:
key_return = K4_1;
break;
case 0x45: //0b01000101:
key_return = K4_2;
break;
case 0x43: //0b01000011:
key_return = K4_3;
break;
}
// #endif
key_state++; //轉入按鍵釋放狀態
}
/* else
{
key_state--; //兩次列電平狀態不同返回狀態0 (消抖處理)
}*/
break;
case 2: //等待按鍵釋放
// #ifdef KEY_4X4
//KEY_PORT = 0x0f; //行線全部輸出低電平
//KEY_PORT = 0x0f;
//#else
KEY_PORT = 0x07; //行線全部輸出低電平
KEY_PORT = 0x07;
//#endif
if((KEY_MASK & KEY_PIN) == KEY_MASK)
{
key_state = 0; //列線全部為高電平,返回狀態0
}
break;
}
return(key_return);
}
/*unsigned char key_scan(void)
{
unsigned char sccode,recode;
DDRC = 0xff;
PORTC = 0xf0;
if(((PINC&0xf0)!=0xf0)) //有鍵按下
{
delay_nms(15);
if(((PINC&0xf0)!=0xf0)) //有鍵按下
{
sccode = 0xfe; //逐含掃描初始值
while((sccode&0x10)!=0)
{
PORTC = sccode; //輸出行掃描碼
if(((PINC&0xf0)!=0xf0)) //本行有鍵按下
{
recode = (PINC&0xf0)|0x0f;
return((~sccode)+(~recode)); //返回特征字節碼
}
else
{
sccode = (sccode<<1)|0x01; //行掃描碼左移一位
}
}
}
}
return(0); //無鍵按下返回0
}
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -