此实验中摁下某个按键后,把相关的信号并行传递到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键
关于程序中74HC165的数据传送的方式自己还有待研究,之所以用到了74HC595,是因为力天电子的这款板子在进行设计是把把74HC165 的片选(165 CS)连接到了595上,所以必须得对595进行相应操作