arm7 力天电子lpc2148 GPIO之按键输入试验

时间:2022-07-21 16:15:23

此实验中摁下某个按键后,把相关的信号并行传递到74HC165上,然后再通过串行方式传到处理器中,处理器在通过控制P0.22口(MAT0.0)来控制蜂鸣器

部分电路图如下所示:

arm7 力天电子lpc2148 GPIO之按键输入试验 注意:9号引脚接的是2148的MISO0(P0.5)

arm7 力天电子lpc2148 GPIO之按键输入试验                          arm7 力天电子lpc2148 GPIO之按键输入试验

#include <NXP/iolpc2148.h>

//宏定义
#define         SCLK  0x01<<24
#define         SCK0  0x01<<4 
#define         MISO  0x01<<5
#define         MOSI  0x01<<6
#define         RCK   0x01<<7

void HC595_Init(void);
void WriteByte(unsigned char data);
void Write595(void);
void HC165_CS(char flag);
unsigned char Read165(void);
void Delayn(unsigned long n);
//595扩展接口的数据显示缓存
unsigned int HC595_DATA = 0xFFFFFFFF;
//初始化595接口
void HC595_Init(void)
{
  IO0DIR |= MOSI|RCK|SCK0;
  IO1DIR |= SCLK;
  IO1CLR |= SCLK;
  IO0DIR |= RCK;
  HC595_DATA = 0xFFFFFFFF;Write595();
}
//写字节
void WriteByte(unsigned char data)
{
  unsigned char i;
  //IO0CLR = RCK;
  for(i=0;i<8;i++)
  {
    if(data&0x01)      IO0SET=MOSI;
    else      IO0CLR=MOSI;
    IO1SET=SCLK;
    data>>=1;
    IO1CLR=SCLK;
  }
  //IO0SET = RCK;
}
//刷新595的数据
void Write595(void)
{
  IO0CLR = RCK;
  WriteByte(HC595_DATA&0xff);
  WriteByte((HC595_DATA&0xff00)>>8);
  WriteByte((HC595_DATA&0xff0000)>>16);
  WriteByte((HC595_DATA&0xff000000)>>24);
  IO0SET = RCK;
}
//165片选
void HC165_CS(char flag)
{
  if(flag)   ////CLK INH写入高电平,
    HC595_DATA &= ~(1<<1);
  else
    HC595_DATA |= (1<<1);
  Write595();
}
//读165的数据
unsigned char Read165(void)
{
  unsigned char RD=0,i;  
  HC165_CS(1);  //
  IO1CLR_bit.P1_25 = 1; //写入1使对应引脚输出低电平,即使S/L(管脚1)得到低电平,在arm板接收数据前,必须将该引脚拉低,目的是为了将并行数据A--H上得数据装载到内部寄存器中,这里体现的时LOAD功能
  Delayn(10);
  IO1SET_bit.P1_25 = 1; //写入1使对应引脚输出高电平,接下来在接收数据的过程中必须将该引脚拉高,目的是为了使寄存器中的数据可以移动,从而从QH或QN'中移入单片机。这里体现的是SHIFT功能。
  for(i=0;i<8;i++)
  {  
    RD <<= 1;   //左移一位 
    if(IO0PIN&MISO)   //MISO0是74HC165输出的串行数据,看74HC165是否接收到数据,如果MISO0不为0则说明接收到了数据,
      RD |= 1;  //先接受高位
    IO0SET=SCK0; //时钟为高,上升沿下一个数据移出(只有在CP为高时,才允许CE由低转高)
    Delayn(10);
    IO0CLR=SCK0; //时钟低电平 (我们只需将arm处理器的某一个端口拉低或抬高即可,这样数据就一步一步的被接收了。请务必记得上升沿有效。)
  } 
  HC165_CS(0);
  return RD;
}
main()
{
  PINSEL0=0x000000;
  PINSEL1=0x000000;    //所有引脚连接GPIO
  
  unsigned char HC165_DATA;
  IO1DIR_bit.P1_25 = 1;
  IO1SET_bit.P1_25 = 1;
  PINSEL0_bit.P0_5 = 0;
  //IO0DIR_bit.P0_5 = 0;    //HC165输入管脚

  IO0DIR=1<<22;     //蜂鸣器控制口设置为输出,其余输入
  HC595_Init();
   
  while(1)
  {
     HC165_DATA = Read165();
     if((HC165_DATA&(1<<4))==0) IO0SET=1<<22; //当KEY2按下的时候,蜂鸣器响起(此处解释见下面)
     else  IO0CLR=1<<22; //松开KEY2,蜂鸣器停止蜂鸣
  }
}
//延时周期数
void Delayn(unsigned long n)
{
  while(n--);

}

最后说明:

对主函数中if((HC165_DATA&(1<<4))==0) IO0SET=1<<22的解释,1<<4位使得第4位变为1,有74HC165数据手册中功能方图:

arm7 力天电子lpc2148 GPIO之按键输入试验  可知第4位对应的外围引脚是3,再由上面的第一个图74HC165的连接图可发现它与KEY INT2相连,所以对应的是KEY2键

关于程序中74HC165的数据传送的方式自己还有待研究,之所以用到了74HC595,是因为力天电子的这款板子在进行设计是把把74HC165 的片选(165 CS)连接到了595上,所以必须得对595进行相应操作arm7 力天电子lpc2148 GPIO之按键输入试验