?? 4x4行列式矩陣鍵盤驅動(c51).txt
字號:
4X4行列式矩陣鍵盤驅動(C51)
作者:POWER 來源:斯凱科技 點擊數:93 更新時間:2007年02月06日
/********************************************************************************************
* 文 件 名:test024.c
* 功 能:4*4行列式鍵盤驅動。
* 硬件條件:1.CPU型號:AT89S52
* 2.晶振:12.000MHz
* 3.用跳線帽短接BEEP_P1.3
* 4.用杜綁線將4*4行列式鍵盤模塊與開發板的P2口相連,連接關系如下:
* ==============================================================
* ARMSKY-51Easy教學實驗開發板 4*4行列式鍵盤模塊
*
* P2.7 row1
* P2.6 row2
* P2.5 row3
* P2.4 row4
* P2.3 col1
* P2.2 col2
* P2.1 col3
* P2.0 col4
* +5V VCC
* GND GND
* ==============================================================
* 注意:用戶可根據自己的情況,選擇ARMSKY-51Easy教學實驗開發板上
* 的其他引腳與4*4行列式鍵盤模塊相連。
*
* 作 者:POWER
* 日 期:2006年12月12號
* 斯凱科技主頁:www.armsky.net
* 斯凱科技論壇:www.armsky.net/bbs
*********************************************************************************************/
#include "reg52.h" // 包含頭文件
/* 與編譯器無關的數據類型定義 */
/********************************************************************************************/
typedef unsigned char uint8; // 無符號8位整型變量
typedef signed char int8; // 有符號8位整型變量
typedef unsigned short uint16; // 無符號16位整型變量
typedef signed short int16; // 有符號16位整型變量
typedef unsigned int uint32; // 無符號32位整型變量
typedef signed int int32; // 有符號32位整型變量
typedef float fp32; // 單精度浮點數(32位長度)
typedef double fp64; // 雙精度浮點數(64位長度)
/********************************************************************************************/
/* 定義位變量 */
sbit P1_3 = P1 ^ 3;
sbit row1 = P2 ^ 7;
sbit row2 = P2 ^ 6;
sbit row3 = P2 ^ 5;
sbit row4 = P2 ^ 4;
sbit col1 = P2 ^ 3;
sbit col2 = P2 ^ 2;
sbit col3 = P2 ^ 1;
sbit col4 = P2 ^ 0;
#define BEEP_ON() (P1_3=0) // 定義"BEEP_ON()"為P1.3輸出低電平,控制蜂鳴器蜂鳴
#define BEEP_OFF() (P1_3=1) // 定義"BEEP_OFF()"為P1.3輸出高電平,控制蜂鳴器不蜂鳴
/********************************************************************************************
* 函數名稱:Delay()
* 功 能:軟件延時
* 入口參數:count 延時參數,值越大,延時越長
* 出口參數:無
*********************************************************************************************/
void Delay(uint16 count)
{
uint8 i;
while(--count != 0)
{
for(i = 0; i < 125; i++); // ";" 表示空語句,CPU空轉。
} // i 從0加到125,在12M晶體下CPU大概耗時1毫秒
}
/********************************************************************************************
* 函數名稱:BeepCount()
* 功 能:蜂鳴器按指定次數縫鳴
* 入口參數:count
* 出口參數:無
*********************************************************************************************/
void BeepCount(uint8 count)
{
for(;count>0;count--)
{
BEEP_ON(); Delay(120);
BEEP_OFF();Delay(120);
}
}
/********************************************************************************************
* 函數名稱:KeyDown()
* 功 能:檢測鍵盤是否按下
* 入口參數:無
* 出口參數:返回1表示鍵盤按下,返回0表示鍵盤未按下
* 注 意:該函數有消抖功能
*********************************************************************************************/
uint8 KeyDown(void)
{
col1=0; col2=0; col3=0; col4=0; // 列線全部置低
if((row1==0) || (row2==0) || (row3==0) || (row4==0)) // 若有任一行線讀回狀態為低
{
Delay(80); // 延時消抖
if((row1==0) || (row2==0) || (row3==0) || (row4==0)) // 再次讀行線狀態,若有任一行線讀回狀態為低
return 1; // 返回1,表明有鍵盤按下
else
return 0; // 返回0,表明無鍵盤按下
}
else
return 0;
}
/********************************************************************************************
* 函數名稱:KeyUp()
* 功 能:檢測鍵盤是否彈起
* 入口參數:無
* 出口參數:返回1表示鍵盤彈起,返回0表示鍵盤未彈起
* 注 意:該函數有消抖功能
*********************************************************************************************/
uint8 KeyUp(void)
{
col1=0; col2=0; col3=0; col4=0; // 列線全部置低
if((row1==1) && (row2==1) && (row3==1) && (row4==1)) // 若全部行線讀回狀態都為高
{
Delay(80); // 延時消抖
if((row1==1) && (row2==1) && (row3==1) && (row4==1)) // 再次讀行線狀態,若全部行線讀回狀態都為高
return 1; // 返回1,表明所有鍵盤都處于彈起狀態
else
return 0; // 返回0,表明有鍵盤處于按下狀態
}
else
return 0;
}
/********************************************************************************************
* 函數名稱:KeyNum()
* 功 能:檢測用戶按下的鍵盤所對應的鍵盤號
* 入口參數:無
* 出口參數:返回0表示沒有鍵盤被按動,返回1~16對應被按動的鍵盤
* 說 明:用戶可根據自己的鍵盤編號修改該函數。
*********************************************************************************************/
uint8 KeyNum(void)
{
uint8 KeyTemp;
KeyTemp=0;
if(KeyDown()==1) // 若鍵盤被按下
{
col1=0; col2=1; col3=1; col4=1; // 將列線1置低,其他列線置高
if (row1==0) KeyTemp=1; // 若行線1讀回狀態為低,則表明按鍵1被按下
if (row2==0) KeyTemp=5; // 若行線2讀回狀態為低,則表明按鍵5被按下
if (row3==0) KeyTemp=9; // 若行線3讀回狀態為低,則表明按鍵9被按下
if (row4==0) KeyTemp=13; // 若行線4讀回狀態為低,則表明按鍵13被按下
col1=1; col2=0; col3=1; col4=1; // 將列線2置低,其他列線置高
if (row1==0) KeyTemp=2; // 若行線1讀回狀態為低,則表明按鍵2被按下
if (row2==0) KeyTemp=6; // 若行線2讀回狀態為低,則表明按鍵6被按下
if (row3==0) KeyTemp=10; // 若行線3讀回狀態為低,則表明按鍵10被按下
if (row4==0) KeyTemp=14; // 若行線4讀回狀態為低,則表明按鍵14被按下
col1=1; col2=1; col3=0; col4=1;
if (row1==0) KeyTemp=3;
if (row2==0) KeyTemp=7;
if (row3==0) KeyTemp=11;
if (row4==0) KeyTemp=15;
col1=1; col2=1; col3=1; col4=0;
if (row1==0) KeyTemp=4;
if (row2==0) KeyTemp=8;
if (row3==0) KeyTemp=12;
if (row4==0) KeyTemp=16;
while ( KeyUp()!=1); // 等待按下的鍵盤被釋放
return KeyTemp; // 返回被按下并被釋放的鍵盤的編號
}
else
return 0;
}
/********************************************************************************************
* 函數名稱:main()
* 功 能:4*4行列式鍵盤驅動。當發現用戶按下并釋放鍵盤,則檢測出相應鍵盤號,并控制蜂鳴器蜂鳴
* 相應次數。
*********************************************************************************************/
void main (void)
{
BEEP_OFF(); // 蜂鳴器不蜂鳴
while(1) // 死循環
{
BeepCount(KeyNum());
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -