ARM開發7.5.1 基礎實訓( 5 ) 4×4 矩陣鍵盤和 2 路 LED 顯示系統( 1)--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
};
void Delay_250us(void)//延時函數
{
    unsigned int i ;
    i=2500 ;// CCLK=60MHz
    while ( i-- );
}
unsigned char LEDScanpointer , DATApointer ;
int main ( void )
{
//變量定義
    unsigned char keyval ;
    unsigned char row , col ;
    unsigned int i ;
    unsigned int j=0 ;
    PINSEL0=0x00000000 ;
    PINSEL1=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 ;
//無限循環體
    while ( 1 )
    {
        if ( j==0 )
        {
//從 P0.8~P0.11 讀入端口電平 //P0.8~p0.15
            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 ;
                        keyval=keytab [ row ][ col ];
                        for ( i= ( sizeof ( LEDBuffer ) -1 ); i>0 ; i-- )
                            LEDBuffer [ i ] =LEDBuffer [ i-1 ];
                        LEDBuffer [ 0 ] =keyval ;
                        j=20 ;
                    }
                }
            }
        }
        LEDScanpointer=0 ;
        while ( LEDScanpointer<sizeof ( LEDBuffer ))
        {
            IO0CLR|=0xFF ;//段碼全部熄滅
            IO0SET|= ( LEDSEGCODE [ LEDBuffer [ LEDScanpointer ]] <<0 );
            IO0CLR|=0xFF00 ;//位碼全部熄滅
            IO0SET|= ( LEDBITCODE [ LEDScanpointer ] <<8);//確定位輸出
            LEDScanpointer++ ;
            Delay_250us();//調用延時函數
        }
        for ( i=0 ; i<10 ; i++ ) Delay_250us();
        if ( j !=0 ) j-- ;
    }
}

三:運行效果

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

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