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


#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数据手册中功能方图:
 可知第4位对应的外围引脚是3,再由上面的第一个图74HC165的连接图可发现它与KEY INT2相连,所以对应的是KEY2键
 可知第4位对应的外围引脚是3,再由上面的第一个图74HC165的连接图可发现它与KEY INT2相连,所以对应的是KEY2键
关于程序中74HC165的数据传送的方式自己还有待研究,之所以用到了74HC595,是因为力天电子的这款板子在进行设计是把把74HC165 的片选(165 CS)连接到了595上,所以必须得对595进行相应操作