×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-06-18 发布时间:
|

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


部分电路图如下所示:

 注意:9号引脚接的是2148的MISO0(P0.5)

                          

#include


//宏定义

#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数据手册中功能方图:

  可知第4位对应的外围引脚是3,再由上面的第一个图74HC165的连接图可发现它与KEY INT2相连,所以对应的是KEY2键


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

关键字:arm7  lpc2148  GPIO  按键输入

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计