?? key16.c
字號:
//-----------------------------------------------------------------------------
//
// 文件名:key16.c
//
// 編寫人:寧太陽
//
// 編寫時間:2005/1/8
//
// 目標器件: C8051F33x
//
// 編譯工具: Silicon Laboratories IDE
//
//程序描述:
//--------------------------------------------------------------------------
// 這個程序可以對一個16*16的鍵盤掃描,并得到相應的鍵值,這里可以得到從0—F內的數值,
//按下鍵后可以在鍵值緩沖區中觀察到相應的數據。
//---------------------------------------------------------------------------
// 鍵盤接線圖
//---------------------------------------------------------------------------
// P0.4 -------- 0/-------4/-------8/-------12/
// P0.5 -------- 1/-------5/--------9/------13/
// P0.6 -------- 2/-------6/-------10/------14/
// P0.7 ---------3/-------7/-------11/------15/
// P0.0 ----------/ / / /
// P0.1 ----------|--------/ / /
// P0.2 ----------|--------|--------/ /
// P0.3 ----------|--------|--------|--------/
// | |R1 | |R2 | |R3 | |R4
// | | | |
// |--------|--------|--------|------+3V
//
//-----------------------------------------------------------------------------
// 頭文件包含
//-----------------------------------------------------------------------------
#include <c8051f330.h>
//
//-----------------------------------------------------------------------------
// 常量定義
//-----------------------------------------------------------------------------
//
#define SYSCLK 24500000 / 8 // 系統工作頻率
//
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//位定義
//-----------------------------------------------------------------------------
sbit LED = P1^3; // LED所接的引腳
//-----------------------------------------------------------------------------
//全局變量定義
//-----------------------------------------------------------------------------
unsigned char keydatabuffer;
unsigned char keydata1[20]; //鍵值存放緩沖區
unsigned char *point; //此指針指向鍵值緩沖區
//-----------------------------------------------------------------------------
// 函數定義
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
unsigned char KEY16(void);
//-----------------------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------------------
void main (void)
{
unsigned int k;
PCA0MD &= ~0x40; //禁止看門狗定時器
SYSCLK_Init (); // 系統時鐘初始化
PORT_Init (); // 交叉開關和通用I/O口初始化
point=&keydata1;
for(k=0;k<=20;k++) //清空鍵值緩沖區
{*point=0x00;
point++;
}
point=&keydata1;
P0= 0x0f;
while (1)
{
if(P0!=0x0f) //是否有鍵按下
{
for(k=0;k<=20000;k++); //延時
if(P0!=0x0f) //再次判斷是否有鍵按下
{
*point=KEY16(); //獲得鍵值,并將鍵值送往緩沖區
point++;
LED=!LED;
}
}
}
}
//-----------------------------------------------------------------------------
//系統時鐘初始化
//-----------------------------------------------------------------------------
//
void SYSCLK_Init (void)
{
OSCICN = 0x80; // 系統時鐘初始化為片內的 24.5MHz / 8
RSTSRC = 0x04; // 使能時鐘丟失檢測器
}
//-----------------------------------------------------------------------------
// 通用I/O口及交叉開關初始化
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
XBR0 = 0x00; // 沒有選擇數字外設
XBR1 = 0x40; // 使能交叉開關和弱上拉
P0MDOUT = 0x00;
P1MDOUT |= 0xff; // P1.3設為推挽方式
}
//-----------------------------------------------------------------------------
// 鍵盤掃描程序
//-----------------------------------------------------------------------------
unsigned char KEY16(void)
{
unsigned char data i=0,j=0;
unsigned int data k;
i=P0;
i=~i;
i &=0x0f;
P0=0xf0;
for(k=0;k<=2000;k++); //等待信號穩定
j=P0;
j=~j;
j &=0xf0;
P0=0x0f;
i+=j;
while(P0!=0x0f); //等待鍵釋放
switch (i) //以下程序可以得到鍵值
{
case 0x11:return(0);
break;
case 0x21:return(1);
break;
case 0x41:return(2);
break;
case 0x81:return(3);
break;
case 0x12:return(4);
break;
case 0x22:return(5);
break;
case 0x42:return(6);
break;
case 0x82:return(7);
break;
case 0x14:return(8);
break;
case 0x24:return(9);
break;
case 0x44:return(10);
break;
case 0x84:return(11);
break;
case 0x18:return(12);
break;
case 0x28:return(13);
break;
case 0x48:return(14);
break;
case 0x88:return(15);
break;
default:return(16); //無效值
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -