?? mkey.c
字號:
/*******************************************
文件:MKEY.C
環境:編譯為ICC AVR6.25A,仿真為AVR Studio4.10
硬件:ATMEGA16芯片
日期:2006年12月10日
功能:驅動開發板上的矩陣鍵盤,按不同的鍵,則數碼管顯示鍵碼0~F
備注:參考《AVR系列單片機C語言編程與應用實例》(清華大學出版社)
/******************************************/
#include <iom16v.h> //包含型號頭文件
#include <macros.h> //包含"位"操作頭文件
#include <stdio.h> //標準輸入輸出頭文件
#include <AVR_PQ1A.h> //包含自定義常量頭文件
#include "SMG.C" //包含數碼管顯示函數
/*******************************************
函數名稱: 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(15); //延時消抖
if(Mkey_press()==TRUE) //如果有鍵按下
{
do
{
i=(i<<1|i>>7); //進行行掃描
KEY_DDR=0x0F; //定義數據端口低四位為輸出,高四位為輸入
KEY_PORTO=i; //輸出掃描碼
Delayms(1); //防止讀入出錯,加入延時
keycode=KEY_PORTI; //讀入原始鍵碼
}while((keycode&0xF0)==0xF0); //是否檢測到被按下按鍵(掃描到就跳出循環,否則繼續掃描)
do
{
}while(Mkey_press()==TRUE); //等待按鍵釋放(為了防止按一次,執行多次的現象)
Delayms(15); //延時消抖
switch(keycode) //將原始鍵碼翻譯成0~F
{
case 0xEE:
keycode=0x0;
break;
case 0xDE:
keycode=0x1;
break;
case 0xBE:
keycode=0x2;
break;
case 0x7E:
keycode=0x3;
break;
case 0xED:
keycode=0x4;
break;
case 0xDD:
keycode=0x5;
break;
case 0xBD:
keycode=0x6;
break;
case 0x7D:
keycode=0x7;
break;
case 0xEB:
keycode=0x8;
break;
case 0xDB:
keycode=0x9;
break;
case 0xBB:
keycode=0xA;
break;
case 0x7B:
keycode=0xB;
break;
case 0xE7:
keycode=0xC;
break;
case 0xD7:
keycode=0xD;
break;
case 0xB7:
keycode=0xE;
break;
case 0x77:
keycode=0xF;
break;
}
}
return keycode; //返回經過翻譯的鍵碼
}
/*******************************************
函數名稱: main
功 能: 獨立按鍵驅動主函數
參 數: 無
返回值 : 無
/********************************************/
void main(void)
{
uchar i;
Board_init( ); //初始化開發板
One_smg_display(8,1); //第1個數碼管,初始顯示數字8
while(1)
{
if(Mkey_press()) //是否有按鍵按下
{
i=Mkey_scan(); //掃描并反回翻譯后的鍵碼
One_smg_display(i,1); //數碼管顯示翻譯后的鍵碼
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -