?? jianpan.c
字號:
/***********************************矩陣鍵盤模塊的說明*************************
子程序名稱:jzkey.c
子程序功能:此模塊主要應用于4*4矩陣鍵盤,能實時返回當前的鍵值
子程序調用:
/*******************************************
函數名稱: Key_press
功 能: 檢測是否有鍵按下
參 數: 無
返回值 : pressed--有鍵按下時為TRUE,否則為FALSE
/********************************************/
/*******************************************
函數名稱: Key_scan
功 能: 掃描所按的鍵并返回鍵值
參 數: 無
返回值 : keycode--被按下鍵值
*******************************************************************************/
#include <iom128v.h>
#include <macros.h>
/******************數據類型宏定義******************/
#define uchar unsigned char
#define uint unsigned int
#define TRUE 1
#define FALSE 0
/******************按鍵常量******************/
#define KEY_DDR DDRA //按鍵方向定義
#define KEY_PORTO PORTA //按鍵斷口輸出定義
#define KEY_PORTI PINA //按鍵斷口輸入定義
#define OUT 0xFF //輸出常量
#define IN 0xF0 //輸入常量
/*******************************************
函數名稱: Delayus
功 能: 延時指定微秒(8M晶振)
參 數: US--延時的微秒數(大約,不是很精確,MS越大越準確)
返回值 : 無
/********************************************/
void Delayus(uint US)
{
uint i;
US=US*5/4; //5/4是在8MHz晶振下,通過軟件仿真反復實驗得到的數值
for( i=0;i<US;i++);
}
/*******************************************
函數名稱: Delayms
功 能: 延時指定毫秒(8M晶振)
參 數: MS--延時的毫秒數
返回值 : 無
/********************************************/
void Delayms(uint MS)
{
uint i,j;
for( i=0;i<MS;i++)
for(j=0;j<1141;j++); //1141是在8MHz晶振下,通過軟件仿真反復實驗得到的數值
}
/*******************************************
函數名稱: Key_press
功 能: 檢測是否有鍵按下
參 數: 無
返回值 : pressed--有鍵按下時為TRUE,否則為FALSE
/********************************************/
uchar Mkey_press(void)
{
uchar pressed;
KEY_DDR = OUT; //定義數據端口為輸出
KEY_PORTO = 0xF0; //輸出數據(輸出檢測碼)
KEY_DDR = IN; //定義數據端口為輸入
if(KEY_PORTI != 0xF0) //檢測是否有鍵按下
pressed=TRUE; //有鍵按下則返回TRUE
else
pressed=FALSE; //無鍵按下則返回FALSE
KEY_DDR=OUT; //數據端口還原為輸出
return pressed;
}
/*******************************************
函數名稱: Key_scan
功 能: 掃描所按的鍵并返回鍵值
參 數: 無
返回值 : keycode--被按下鍵值
/********************************************/
uchar Mkey_scan(void)
{
uchar i=0x7F,keycode=0xFF; //i為掃描碼,
Delayms(4); //延時消抖
if(Mkey_press()==TRUE) //如果有鍵按下
{
do
{
i=(i<<1|i>>7); //進行行掃描
KEY_DDR=0x0F; //定義數據端口低四位為輸出,高四位為輸入
KEY_PORTO=i; //輸出掃描碼
Delayms(5); //防止讀入出錯,加入延時
keycode=KEY_PORTI; //讀入原始鍵碼
}while((keycode&0xF0)==0xF0); //是否檢測到被按下按鍵(掃描到就跳出循環,否則繼續掃描)
do
{
}while(Mkey_press()==TRUE); //等待按鍵釋放(為了防止按一次,執行多次的現象)
Delayms(5); //延時消抖 `
switch(keycode) //將原始鍵碼翻譯成0~F
{
case 0xEE:
keycode=0x1;//1
break;
case 0xDE:
keycode=0x2;//2
break;
case 0xBE:
keycode=0x3;//3
break;
case 0x7E:
keycode=0xc;//上翻
break;
case 0xED:
keycode=0x4;//4
break;
case 0xDD:
keycode=0x5;//5
break;
case 0xBD:
keycode=0x6;//6
break;
case 0x7D:
keycode=0xd;//下翻
break;
case 0xEB:
keycode=0x7;//7
break;
case 0xDB:
keycode=0x8;//8
break;
case 0xBB:
keycode=0x9;//9
break;
case 0x7B:
keycode=0xe;//左移
break;
case 0xE7:
keycode=0xa;//功能
break;
case 0xD7:
keycode=0x0;//0
break;
case 0xB7:
keycode=0xb;//確定
break;
case 0x77:
keycode=0xf;//右移
break;
}
}
return keycode; //返回經過翻譯的鍵碼
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -