运行效果:
启动仿真,每当按键被按一次,在二个数码 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-- ;
}
}
三:运行效果