欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ARM开发7.5.1 基础实训( 5 ) 4×4 矩阵键盘和 2 路 LED 显示系统( 1)--LPC21XX

程序员文章站 2022-06-08 20:51:45
...

运行效果:
启动仿真,每当按键被按一次,在二个数码 LED 上显示某个按键的编号

一:仿真图

ARM开发7.5.1 基础实训( 5 ) 4×4 矩阵键盘和 2 路 LED 显示系统( 1)--LPC21XX
ARM开发7.5.1 基础实训( 5 ) 4×4 矩阵键盘和 2 路 LED 显示系统( 1)--LPC21XX

二:代码详情

#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-- ;
    }
}

三:运行效果

ARM开发7.5.1 基础实训( 5 ) 4×4 矩阵键盘和 2 路 LED 显示系统( 1)--LPC21XX
ARM开发7.5.1 基础实训( 5 ) 4×4 矩阵键盘和 2 路 LED 显示系统( 1)--LPC21XX

相关标签: 单片机开发