ARM開發7.5.2 基礎實訓( 6 ) 4×4 矩陣鍵盤和 2 路 LED 顯示系統( 2 )--LPC21XX

運行效果:
啓動仿真,每當按鍵被按一次,在二個數碼 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
}

三:運行效果

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章