運行效果:
啓動仿真,每當按鍵被按一次,在二個數碼 LED 上顯示某個按鍵的編號
一:仿真圖
二:代碼詳情
#include"LPC21xx.h"
//常量定義
const unsigned char LEDSEGCODE [] =
{
0x3F , 0x06 , 0x5B , 0x4F , 0x66 , 0x6D , 0x7D , 0x07 , 0x7F , 0x6F ,
0x77 , 0x7C , 0x39 , 0x5e , 0x79 , 0x71 , 0x00 , 0x40
};
//這一個對應P0.14,P0.15爲位選
const unsigned char LEDBITCODE [] = { 0xB0 , 0x70 };// 1110 0000 0000 ==>8 1101 0000 0000==>9 1011 0000 0000 0000==>14 0111 0000 0000 0000==>15
//書上用的這一個,位選端口也要改爲P0.8 P0.9
//const unsigned char LEDBITCODE [] = { 0x0E , 0x0D };
unsigned char LEDBuffer [ 2 ] = { 0x00 , 0x01 };
unsigned char KSCANCODE [] = { 0x01 , 0x02 , 0x04 , 0x08 };
unsigned char keytab [ 4 ][ 4 ] =
{
0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 ,
0x08 , 0x09 , 0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05
};
unsigned char keyval ;
int j ;
unsigned char LEDScanpointer , DATApointer ;
unsigned char GetKey ( void ); //獲取鍵值 若有鍵盤輸入,則存入顯示緩衝區
void Display ( void ); //在 4 個 LED 上動態顯示緩衝區的四個數,無參數
void delay_250us(void); //延時 250 μ s
int main ( void )
{
//變量定義
unsigned int i ;
//初始化 LPC2124 的 P0 爲 GPIO / P0.9 輸出端( L :亮)/ P0.15 輸入端( L :閉合)
PINSEL0=0x00000000 ;
PINSEL1=0x00000000 ;
PINSEL2=0x00000000 ;
//書上是這個,如果選用P0.14,P0.15爲位選是不行的因爲P0.14,Po.15未爲輸出模式
//IO0DIR=0x00000FFF;
IO0DIR=0x0000FFFF ;//P0.14,P0.15爲位選
IO1DIR=0x000F0000 ;// KR1-KR4 定義爲輸出 KC1~KC4 定義爲輸入
IO0CLR=0x00000F00 ;//初始化 LED7 滅
IO0SET=0x000000FF ;
LEDScanpointer=0 ;
DATApointer=0 ;
keyval=0 ;
j=0 ;
//無限循環體
while ( 1 )
{
if ( j==0 )
{
// keyval=0xFF ;
keyval=GetKey ();
if ( keyval !=0xFF )
{
for ( i= ( sizeof ( LEDBuffer ) -1 ); i>0 ; i-- )
LEDBuffer [ i ] =LEDBuffer [ i-1 ];
LEDBuffer [ 0 ] =keyval ;
j=20 ;
}
}
Display ();
for ( i=0 ; i<10 ; i++ ) delay_250us();
if (j!=0) j-- ;
}
}
void delay_250us(void)//延時函數
{
unsigned int i ;
i=2500 ;// CCLK=60MHz
while (i--);
}
void Display ( void )
{
unsigned int i=2500 ;
LEDScanpointer=0 ;
while ( LEDScanpointer<sizeof ( LEDBuffer ))
{
IO0CLR|=0xFF ;//段碼全部熄滅
IO0SET|= ( LEDSEGCODE [ LEDBuffer [ LEDScanpointer ]] <<0 );
IO0CLR|=0xFF00 ;//位碼全部熄滅
IO0SET|= ( LEDBITCODE [ LEDScanpointer ] <<8 );//確定位輸出
LEDScanpointer++ ;
i=2500 ;
while ( i-- );//調用延時函數
}
}
unsigned char GetKey ( void )
{
unsigned char row , col ;
for ( row=0 ; row<4 ; row++ )
{
IO1SET= ( 0x0F ) <<16 ;
IO1CLR= ( KSCANCODE [ row ]) <<16 ;
if (( IO1PIN&0x00F00000 )!=0x00F00000 )//檢測到鍵盤按下動作
{
delay_250us(); //延時去抖動
if (( IO1PIN&0x00F00000 )!=0x00F00000 ) //確認是哪個鍵盤按下
{
if (( IO1PIN&0x00E00000 ) ==0x00E00000 ) col=0 ;
else if (( IO1PIN&0x00D00000 ) ==0x00D00000 ) col=1 ;
else if (( IO1PIN&0x00B00000 ) ==0x00B00000 ) col=2 ;
else col=3 ;
return keytab [ row ][ col ];
}
}
}
return 0xFF ; //沒有按鍵動作,返回值爲 0xff
}
三:運行效果